在K8S中,创建Pod的流程是什么?
在Kubernetes中,创建Pod的流程涉及多个核心组件(API Server、etcd、kube-scheduler、kubelet、容器运行时等)的协同工作,遵循“声明式API”的原则(用户声明目标状态,K8s通过组件协作将实际状态推向目标状态)。完整流程可分为以下6个关键步骤:
1. 用户提交Pod创建请求
用户通过kubectl
命令(或API调用)提交Pod的配置文件(通常是YAML/JSON),声明Pod的目标状态(如容器镜像、资源需求、标签等)。
- 示例命令:
kubectl apply -f pod.yaml
- 此时,请求会被发送到API Server(K8s的“前端接口”,所有操作都需经过它)。
2. API Server验证并存储Pod信息
API Server接收请求后,执行以下操作:
- 验证请求合法性:检查Pod配置是否符合K8s API规范(如字段是否正确、是否有创建权限、资源需求是否合法等)。若不合法,直接返回错误(如字段缺失、权限不足)。
- 存储Pod数据:验证通过后,API Server将Pod的元数据(
metadata
)和规格(spec
)存储到etcd(K8s的分布式数据库,唯一的数据源)中。 - 返回结果:向用户返回“创建成功”的响应(此时Pod的
status.phase
为Pending
,表示已创建但尚未调度)。
3. kube-scheduler调度Pod到目标节点
新创建的Pod(spec.nodeName
为空,即未指定节点)会被kube-scheduler(K8s的默认调度器)监听并处理,核心是为Pod选择一个合适的节点:
(1)筛选候选节点(过滤阶段)
调度器根据Pod的配置(如资源需求、节点亲和性、污点容忍等),从集群所有节点中筛选出“满足条件”的候选节点。
- 过滤规则包括:节点是否有足够的CPU/内存(满足Pod的
requests
)、是否匹配nodeSelector
或节点亲和性、是否被Pod容忍污点等。 - 若没有符合条件的节点,Pod会一直处于
Pending
状态,事件中会提示“no nodes available”。
(2)为候选节点打分(优先级排序)
对筛选出的候选节点,调度器根据“优先级策略”(如资源利用率、节点负载、拓扑分布等)进行打分,得分最高的节点被选为目标节点。
- 示例策略:优先选择资源剩余多的节点、优先选择同一可用区的节点等。
(3)绑定Pod到目标节点
调度器通过API Server将选中的节点名称写入Pod的spec.nodeName
字段,并更新到etcd中(此时Pod与节点完成“绑定”)。
4. 节点上的kubelet接收Pod任务
每个节点上运行的kubelet进程会定期通过API Server监听“分配给自己的Pod”(即spec.nodeName
等于当前节点名称的Pod)。当发现新绑定的Pod时,kubelet开始执行本地创建流程。
5. kubelet通过容器运行时创建容器
kubelet依赖容器运行时(如containerd、CRI-O)实际创建和管理容器,步骤如下:
(1)准备容器运行环境
- 网络配置:通过CNI插件(如Calico、Flannel)为Pod创建独立的网络命名空间,分配Pod IP,并配置网络规则(确保Pod可与集群内其他资源通信)。
- 存储挂载:若Pod声明了Volume(如emptyDir、hostPath、PVC),kubelet会先创建或挂载对应的存储卷(如PVC需要先绑定PV,确保存储可用)。
- 安全配置:应用Pod的安全上下文(
securityContext
),如用户ID、权限、SELinux策略等。
(2)启动容器(按顺序执行)
- 优先启动Init容器(若有):Init容器是Pod启动前的“初始化任务”,按定义顺序串行执行(前一个完成后才启动下一个)。若Init容器失败,kubelet会根据重启策略重启Pod或终止。
- 启动应用容器:所有Init容器成功完成后,kubelet通过容器运行时启动Pod中的应用容器(并行启动),拉取指定的镜像(若本地不存在),并执行容器启动命令。
(3)健康检查与状态更新
- 容器启动后,kubelet会按配置执行健康探针(存活探针、就绪探针、启动探针),监控容器状态。
- 实时将Pod的状态(如容器是否运行、探针结果、重启次数等)通过API Server更新到etcd中(例如,当应用容器运行且就绪探针通过后,Pod的
status.phase
变为Running
)。
6. Pod进入稳定运行状态
当所有应用容器正常运行,且就绪探针(若配置)通过后,Pod进入Running
状态,可对外提供服务(若关联了Service,会被加入Endpoints)。
- 若Pod是Job类型(一次性任务),容器完成后会进入
Succeeded
状态; - 若容器异常终止(如存活探针失败),kubelet会根据重启策略(
RestartPolicy
)重启容器或让Pod进入Failed
状态。
总结:核心组件协作流程
用户 → API Server(验证+存etcd) → kube-scheduler(调度节点) → 目标节点kubelet(准备环境+启动容器) → 容器运行时(创建容器) → Pod运行
整个流程的核心是“声明式”:用户只需定义Pod的目标状态,K8s通过各组件的协同(基于etcd的状态同步)自动完成从“声明”到“运行”的过程。