什么是Pod?

Pod是Kubernetes中最小的可部署计算单元,代表集群中运行的单个进程。一个Pod由一个或多个紧密耦合的容器组成,这些容器共享存储、网络资源以及运行规范。

Pod

主容器

边车容器

共享网络、存储和其他资源

Pod中的容器总是被共同调度并在相同的上下文中运行。它们共享IP地址和端口空间,可以通过localhost相互通信,并且可以共享存储卷。

Pod的核心特性

共享网络

Pod内的所有容器共享相同的网络命名空间,包括IP地址和端口。容器可以通过localhost相互通信。

共享存储

Pod可以指定一组共享存储卷,容器可以访问这些共享卷,使数据在容器重启后仍然保留。

共同调度

Pod内的容器总是被共同调度并在同一工作节点上运行,共享相同的执行环境。

进程隔离

虽然共享网络和存储,但每个容器在自己的cgroup和命名空间中运行,提供进程级别的隔离。

Pod的生命周期

Pod遵循一个明确的生命周期,从创建到终止:

Pod生命周期状态转换

  • Pending(挂起):Pod已被Kubernetes接受,但一个或多个容器尚未创建和运行
  • Running(运行中):Pod已绑定到节点,所有容器已创建
  • Succeeded(成功):Pod中的所有容器已成功终止
  • Failed(失败):Pod中至少有一个容器因错误终止
  • Unknown(未知):无法获取Pod状态,通常是由于与节点通信错误

创建和管理Pod

使用YAML定义Pod

Pod通常通过YAML清单文件定义和创建:


apiVersion: v1
kind: Pod
metadata:
  name: my-app-pod
  labels:
    app: my-app
    environment: development
spec:
  containers:
  - name: main-container
    image: nginx:1.19
    ports:
    - containerPort: 80
    volumeMounts:
    - name: shared-data
      mountPath: /usr/share/nginx/html
  - name: sidecar-container
    image: busybox
    command: ['sh', '-c', 'echo "Hello from sidecar" > /pod-data/index.html && sleep 3600']
    volumeMounts:
    - name: shared-data
      mountPath: /pod-data
  volumes:
  - name: shared-data
    emptyDir: {}
                    

Pod操作命令

# 创建Pod
kubectl apply -f pod.yaml

# 查看Pod列表
kubectl get pods

# 查看Pod详细信息
kubectl describe pod my-app-pod

# 查看Pod日志
kubectl logs my-app-pod -c main-container

# 进入Pod中的容器
kubectl exec -it my-app-pod -c main-container -- /bin/bash

# 删除Pod
kubectl delete pod my-app-pod

多容器Pod模式

多容器Pod设计模式允许容器之间紧密协作:

边车模式 (Sidecar)

扩展和增强主容器功能,例如日志收集、监控代理或同步服务。

适配器模式 (Adapter)

标准化主容器的输出或输入,例如统一日志格式或协议转换。

大使模式 (Ambassador)

代理主容器的外部连接,例如处理服务发现或连接池管理。

边车模式示例


apiVersion: v1
kind: Pod
metadata:
  name: web-server-with-logger
spec:
  containers:
  - name: web-server
    image: nginx
    ports:
    - containerPort: 80
    volumeMounts:
    - name: log-volume
      mountPath: /var/log/nginx
  - name: log-collector
    image: busybox
    command: ['sh', '-c', 'tail -f /var/log/nginx/access.log']
    volumeMounts:
    - name: log-volume
      mountPath: /var/log/nginx
  volumes:
  - name: log-volume
    emptyDir: {}
                    

Pod资源管理

可以为Pod中的容器指定资源请求和限制:


apiVersion: v1
kind: Pod
metadata:
  name: resource-demo
spec:
  containers:
  - name: app-container
    image: nginx
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"
                    

资源请求(request)确保Pod能够获得所需的最小资源,而资源限制(limit)防止容器使用超过指定数量的资源。

Pod的最佳实践

  • 单一职责:每个Pod应专注于单一功能或进程
  • 标签使用:为Pod添加有意义的标签,便于筛选和管理
  • 资源限制:始终为容器设置资源请求和限制
  • 就绪探针:使用就绪探针(Readiness Probe)控制流量路由
  • 存活探针:使用存活探针(Liveness Probe)确保应用健康
  • 避免直接创建Pod:使用Deployment、StatefulSet等控制器管理Pod

探针配置示例


apiVersion: v1
kind: Pod
metadata:
  name: probed-pod
spec:
  containers:
  - name: web-server
    image: nginx
    ports:
    - containerPort: 80
    livenessProbe:
      httpGet:
        path: /
        port: 80
      initialDelaySeconds: 15
      periodSeconds: 20
    readinessProbe:
      httpGet:
        path: /
        port: 80
      initialDelaySeconds: 5
      periodSeconds: 10
                    

Pod与工作负载控制器

虽然可以直接创建Pod,但在生产环境中通常使用控制器来管理Pod:

控制器用途
Deployment管理无状态应用的Pod副本,支持滚动更新和回滚
StatefulSet管理有状态应用的Pod,提供稳定的网络标识和持久存储
DaemonSet确保所有或部分节点运行Pod副本,用于日志收集或监控
Job创建运行到完成的Pod,用于批处理任务
CronJob基于时间表运行Job,用于定期任务
Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐