Pod 详解

Pod 是 Kubernetes 中最小的调度与部署单元。理解 Pod,是理解整个工作负载体系(Deployment、StatefulSet 等)的地基——那些控制器管理的大多就是"一批 Pod"。

为什么最小单元是 Pod

容器是"进程级"的概念,而 Pod 是"进程组":一个 Pod 里的容器共享同一个网络命名空间(共享 IP、可用 localhost 互访)和同一批存储卷。之所以不直接调度单个容器,是因为很多场景需要几个进程"绑在一起"部署,比如应用进程与它必须同生的日志收集代理。

单容器 Pod 与多容器 Pod

Pod:共享网络与存储的容器组

  • 单容器:最常见,一个 Pod 只跑一个业务容器。
  • 多容器:采用 sidecar(边车)模式,主容器负责业务,辅助容器做日志收集、配置刷新等,二者通过共享卷交换数据:
apiVersion: v1
kind: Pod
metadata:
  name: web-with-log
spec:
  containers:
    - name: nginx
      image: nginx:1.27
      volumeMounts:
        - name: logs
          mountPath: /var/log/nginx
    - name: log-agent        # sidecar:读取同一份日志卷
      image: busybox:1.36
      command: ["sh", "-c", "tail -f /var/log/nginx/access.log"]
      volumeMounts:
        - name: logs
          mountPath: /var/log/nginx
  volumes:
    - name: logs
      emptyDir: {}

Pod YAML 骨架注释讲解

apiVersion: v1                  # Pod 属于核心组 v1
kind: Pod
metadata:
  name: my-pod                  # Pod 名称,命名空间内唯一
  namespace: default            # 不写则进 default
  labels:
    app: myapp                  # 标签,供 Service/控制器选择
spec:
  containers:                   # 容器列表(可多个)
    - name: nginx               # 容器名
      image: nginx:1.27         # 镜像
      imagePullPolicy: IfNotPresent   # 本地没有才拉取
      ports:
        - containerPort: 80     # 容器监听端口(仅声明性信息)
      env:
        - name: TZ
          value: Asia/Shanghai
      resources:                # 资源请求与上限(细节见第 22 章)
        requests:
          cpu: 100m
          memory: 128Mi
  restartPolicy: Always         # 容器退出后是否重启
  nodeSelector:                 # 只调度到带该标签的节点
    disktype: ssd

创建、查看、进入与删除

kubectl run my-pod --image=nginx:1.27        # 命令式快速创建
kubectl get pods -o wide                     # 查看所在节点与 IP
kubectl describe pod my-pod                  # 看调度结果与事件
kubectl exec -it my-pod -- bash              # 进入容器
kubectl delete pod my-pod                    # 删除,kubectl run 建的没有控制器,删了不会重生

直接创建的裸 Pod 没有控制器守护,节点故障或 Pod 被删就真的没了。实际生产中几乎总是通过 Deployment 等控制器间接管理 Pod。

静态 Pod 简介

静态 Pod 是 kubelet 直接读取本机清单目录(kubeadm 集群默认为 /etc/kubernetes/manifests)创建的 Pod,不经过 apiserver 调度。控制面自身的 kube-apiserver、etcd 等正是以静态 Pod 方式运行的——kubelet 会保证它们存活,哪怕控制面暂时不可用。

小结:Pod 是"一组共享网络与存储的容器",多容器 sidecar 是它区别于单容器运行的本质价值。裸 Pod 无人守护,日常部署请交给后面的控制器去管理。

笔记加载中…