目录
[一、Pod 内部结构全景](#一、Pod 内部结构全景)
[1. 共享网络](#1. 共享网络)
[2. 共享存储(Volumes)](#2. 共享存储(Volumes))
[3. 元数据(Metadata)](#3. 元数据(Metadata))
[二、Pod 核心](#二、Pod 核心)
[1. 创建 Pod](#1. 创建 Pod)
[单容器 Pod](#单容器 Pod)
[多容器 Pod](#多容器 Pod)
[2. 修改 Pod](#2. 修改 Pod)
[3. 删除 Pod](#3. 删除 Pod)
[三、Pod 设计](#三、Pod 设计)
[四、Pod 完整创建流程(从 YAML 到 Running)](#四、Pod 完整创建流程(从 YAML 到 Running))
一、Pod 内部结构全景
Pod 是逻辑上的 "容器组",内部由多层结构组成,核心架构如下:
元数据层:Name/Namespace/Labels/Annotations
├─ 基础设施层:Pause 容器(Infra 容器,根容器)
├─ 应用容器层:主容器(Main Container)+ Sidecar 容器
└─ 共享资源层:共享网络(IP/端口)+ 共享存储(Volumes)
核心组件深度拆解
1. 共享网络
Pod 内所有容器共享同一个网络命名空间:
共用一个 IP 地址,端口全局唯一(同 Pod 内容器不能监听相同端口)。
容器间可通过 localhost:端口 直接通信,无需跨节点网络,延迟极低。
2. 共享存储(Volumes)
Volume 可挂载到 Pod 内多个容器,实现数据共享:
典型场景:日志生成容器写入 /data/logs,日志转发容器挂载同一目录实时上传,实现 "同生共死" 的数据同步。
3. 元数据(Metadata)
Pod 的 "身份证信息",用于资源管理与调度:
Name:Pod 名称;Namespace:逻辑隔离区;
Labels:键值对标签,是 Service、Deployment 等资源关联 Pod 的核心依据;
Annotations:非查询类注解,用于记录构建时间、作者等辅助信息。
二、Pod 核心
1. 创建 Pod
单容器 Pod
通过 YAML 定义单业务容器 Pod,示例如下:
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: hello
image: busybox
imagePullPolicy: IfNotPresent
command: ['sh', '-c', 'echo "Hello, Pod!" && sleep 3600']
restartPolicy: OnFailure
执行创建命令:
kubectl create -f pod.yml
# 查看日志
kubectl logs mypod
# 查看 Pod 状态
kubectl get pod
多容器 Pod
一个 Pod 可包含多个容器,共享网络与存储,示例:
apiVersion: v1
kind: Pod
metadata:
name: pod
spec:
containers:
- name: hello
image: busybox
imagePullPolicy: IfNotPresent
command: ['sh', '-c', 'echo "Hello, Pods!" && sleep 3600']
- name: httpd
image: httpd
ports:
- name: web
containerPort: 80
restartPolicy: OnFailure
创建后可通过 Pod IP 访问 httpd 服务,验证多容器网络共享。
2. 修改 Pod
两种常用修改方式:
修改 YAML 后应用 :编辑 pod.yml 后执行 kubectl apply -f pod.yml,会根据配置更新 Pod(如重命名、调整容器参数)。
进入容器修改 :通过 kubectl exec -it <pod名> -c <容器名> -- /bin/bash 进入容器,直接修改容器内内容(如修改 httpd 首页)。
3. 删除 Pod
批量删除默认命名空间下所有 Pod:
kubectl delete pod --all
执行后通过 kubectl get pod 验证,会返回 No resources found in default namespace.,确认删除完成。
三、Pod 设计
K8s 设计 Pod 而非直接操作容器,核心原因:
亲密关系封装:为必须部署在一起、共享资源、生命周期一致的程序提供统一调度单元。
容器 runtime 抽象 :为容器提供统一的 "环境外壳",让 K8s 无需关心底层是 Docker、containerd 还是 Podman,实现统一调度。一句话总结:Pod 是一个逻辑主机,为容器提供共享的网络、存储和唯一身份。
四、Pod 完整创建流程(从 YAML 到 Running)
Pod 的创建是 K8s 各组件协同的完整链路,步骤如下:
请求提交 :用户执行 kubectl apply -f pod.yml,kubectl 将 YAML 转换为 JSON 格式,发送给 API Server。
API Server 校验 :API Server 完成认证、授权、准入控制,校验通过后将 Pod 信息存入 etcd,此时 Pod 状态为 Pending。
Scheduler 调度 :Scheduler 监听 Pending 状态的 Pod,先通过 ** 预选(Predicates)排除资源不足 / 不匹配的节点,再通过优选(Priorities)** 为剩余节点打分,选择最优节点,将调度结果更新到 etcd。
Kubelet 初始化容器:目标节点的 Kubelet 监听到分配给自己的 Pod,调用:CRI(容器运行时接口):拉取镜像、创建容器;CNI(容器网络接口):配置网络、分配 Pod IP;CSI(容器存储接口):挂载存储卷。
状态同步 :容器启动后,Kubelet 持续监控健康状态,将 Pod 状态更新为 Running 上报给 API Server,API Server 同步到 etcd。
结果验证 :用户执行 kubectl get pods,即可看到 Pod 处于正常运行状态。
五、高频面试题解答
Q1:谈谈你对Pod创建过程的理解。
A: 用户通过 kubectl apply -f pod.yaml 提交 Pod 创建请求,kubectl 会将 YAML 文件转换为 API Server 能识别的 JSON 格式,再发送给 API Server。API Server 收到请求后,会依次完成认证、授权、准入控制(检查权限和资源配额),校验通过后将 Pod 信息存入 etcd 数据库,此时 Pod 状态为 Pending。Scheduler 通过监听机制发现处于 Pending 状态的 Pod,先通过预选(Predicates)排除资源不足或不匹配的节点,再通过优选(Priorities)为剩余节点打分,最终选择最优节点。调度结果会返回给 API Server,并更新到 etcd 中。目标节点上的 Kubelet 通过监听机制发现 Pod 已分配给自己,便调用 CRI(拉取镜像、创建容器)、CNI(配置网络、分配 IP)和 CSI(挂载存储卷)完成容器初始化。容器启动后,Kubelet 会持续监控健康状态,并将 Pod 状态更新为 Running 上报给 API Server,API Server 再将状态同步到 etcd。此时,通过 kubectl get pods 就能看到 Pod 处于正常运行状态。