在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.phasePending,表示已创建但尚未调度)。

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的状态同步)自动完成从“声明”到“运行”的过程。

posted @ 2025-08-11 10:22  天道酬勤zjh  阅读(5)  评论(0)    收藏  举报