Pod 详解
Pod 是 Kubernetes 中最小的调度与部署单元。理解 Pod,是理解整个工作负载体系(Deployment、StatefulSet 等)的地基——那些控制器管理的大多就是"一批 Pod"。
为什么最小单元是 Pod
容器是"进程级"的概念,而 Pod 是"进程组":一个 Pod 里的容器共享同一个网络命名空间(共享 IP、可用 localhost 互访)和同一批存储卷。之所以不直接调度单个容器,是因为很多场景需要几个进程"绑在一起"部署,比如应用进程与它必须同生的日志收集代理。
单容器 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 无人守护,日常部署请交给后面的控制器去管理。