Kubernetes Pod创建流程深度解析:从请求到运行

2026/05/10 SRE Kubernetes 核心原理 共 10951 字,约 32 分钟

Kubernetes Pod创建流程深度解析:从请求到运行

情境(Situation)

在Kubernetes集群管理中,理解Pod的创建流程是掌握Kubernetes工作原理的基础。Pod创建涉及API Server、Scheduler、Kubelet、容器运行时等多个组件的协作,任何一个环节出现问题都可能导致Pod创建失败。

作为SRE工程师,我们需要深入理解Pod创建的完整流程,掌握各组件的职责和协作机制,以便在实际工作中快速定位和解决Pod创建相关的问题。

冲突(Conflict)

在实际应用中,SRE工程师经常面临以下挑战:

  • 流程复杂:Pod创建涉及多个组件,难以全面理解
  • 问题定位难:Pod创建失败时不知问题出在哪个阶段
  • 调度原理不清:不理解预选、优选的调度机制
  • 组件协作混乱:不清楚组件之间的通信机制
  • 网络配置复杂:不理解CNI网络配置过程
  • 性能优化困难:不理解调度策略难以优化集群性能

问题(Question)

如何深入理解Kubernetes Pod创建的完整流程,掌握各组件的协作机制?

答案(Answer)

本文将从SRE视角出发,详细介绍Kubernetes Pod创建的完整流程、各组件的职责和协作机制、调度算法原理、以及常见问题的排查方法,提供一套完整的Pod创建流程知识体系。核心方法论基于 SRE面试题解析:pod的创建流程是啥?。


一、Pod创建流程概述

1.1 Pod创建完整流程

Pod创建流程图:

flowchart TD
    A[kubectl提交请求] --> B[API Server认证授权]
    B --> C[API Server验证配置]
    C --> D[写入etcd - Pending状态]
    D --> E[Scheduler监听变化]
    E --> F[预选阶段 - 过滤节点]
    F --> G[优选阶段 - 打分排序]
    G --> H[绑定节点到Pod]
    H --> I[Kubelet监听变化]
    I --> J[准备创建Pod]
    J --> K[镜像预热 - 拉取镜像]
    K --> L[创建Pause容器]
    L --> M[配置CNI网络]
    M --> N[启动Init容器]
    N --> O[启动业务容器]
    O --> P[Ready状态]
    P --> Q[Running状态]

1.2 组件职责总览

Pod创建涉及的核心组件:

组件职责在Pod创建中的作用
kubectlKubernetes命令行工具发送Pod创建请求
API ServerKubernetes API网关认证授权、配置验证、写入etcd
etcd分布式键值存储存储集群状态和配置
SchedulerKubernetes调度器预选、优选、选择最佳节点
Kubelet节点代理管理Pod生命周期、执行创建任务
容器运行时容器引擎拉取镜像、创建容器
CNI插件网络插件配置Pod网络
Pause容器基础设施容器持有网络命名空间

1.3 创建流程时间线

Pod创建流程时间线:

阶段时长主要操作
API处理毫秒级认证授权、配置验证、写入etcd
调度阶段毫秒-秒级预选、优选、绑定节点
镜像拉取秒-分钟级取决于镜像大小和网络
容器创建秒级创建Pause容器、业务容器
网络配置秒级CNI插件配置网络
健康检查秒级启动探针、执行健康检查
总计秒-分钟级取决于镜像大小和集群状态

二、API Server处理阶段

2.1 API Server认证授权

认证(Authentication):

  • 验证用户身份
  • 支持多种认证方式:证书、Token、Basic Auth、OIDC等

授权(Authorization):

  • 检查用户权限
  • 基于RBAC(Role-Based Access Control)进行权限控制

准入控制(Admission Control):

  • 修改或验证资源
  • 支持多种Webhook和内置控制器
  • 如ResourceQuota、LimitRange、PodSecurityPolicy等

2.2 配置验证

配置验证过程:

  • 验证Pod配置的完整性和正确性
  • 检查容器镜像是否存在
  • 验证资源请求和限制是否合理
  • 验证环境变量、卷挂载等配置

验证示例:

# 验证Pod配置(不实际创建)
kubectl apply -f pod.yaml --dry-run=client

# 验证并查看详细的验证错误
kubectl apply -f pod.yaml --dry-run=server

# 查看Pod的JSON Schema验证
kubectl explain pod.spec

2.3 写入etcd

写入etcd过程:

  1. API Server将Pod配置序列化为JSON
  2. 通过Raft协议复制到集群中的所有etcd节点
  3. 返回写入成功响应

etcd存储内容:

  • Pod对象及其状态
  • Pod的元数据(名称、命名空间、标签等)
  • Pod的规格(容器配置、资源请求等)
  • Pod的事件

查看etcd中的Pod数据:

# 通过kubectl查看Pod
kubectl get pod <pod-name> -n <namespace> -o yaml

# 查看Pod状态
kubectl get pod <pod-name> -n <namespace> -o jsonpath='{.status}'

三、调度阶段

3.1 Scheduler工作原理

Scheduler职责:

  • 监控未调度的Pod
  • 为Pod选择最佳节点
  • 将Pod绑定到选定的节点

调度流程:

flowchart TD
    A[未调度的Pod] --> B[预选阶段 - 过滤节点]
    B --> C{是否有可用节点?}
    C -->|否| D[Pod保持Pending]
    C -->|是| E[优选阶段 - 打分排序]
    E --> F[选择最高分节点]
    F --> G[绑定Pod到节点]
    G --> H[节点接收创建任务]

3.2 预选阶段

预选阶段(Predicates):

  • 过滤不符合Pod调度条件的节点
  • 多个预选条件同时满足

常见预选算法:

预选算法作用
PodFitsResources检查节点资源是否满足Pod需求
PodFitsHostPorts检查主机端口是否冲突
HostName检查Pod是否指定了特定节点
MatchNodeSelector检查节点选择器是否匹配
NoVolumeZoneConflict检查PV的可用区是否匹配
MaxEBSVolumeCount检查EBS卷数量是否超限
MaxGCEPDVolumeCount检查GCE PD卷数量是否超限
MaxAzureDiskVolumeCount检查Azure磁盘数量是否超限
MatchInterPodAffinity检查Pod亲和性/反亲和性
NoDiskConflict检查磁盘是否冲突

预选配置示例:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx
  nodeSelector:  # 节点选择器
    disktype: ssd
  affinity:  # 亲和性配置
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: kubernetes.io/e2e-az-name
            operator: In
            values:
            - e2e-az1
            - e2e-az2

3.3 优选阶段

优选阶段(Priorities):

  • 对通过预选的节点进行打分
  • 选择得分最高的节点
  • 多个优先级算法综合计算

常见优选算法:

优选算法作用分数范围
SelectorSpreadPriority分散同标签Pod到不同节点0-10
InterPodAffinityPriority考虑Pod亲和性/反亲和性0-10
** LeastRequestedPriority**偏向资源使用少的节点0-10
BalancedResourceAllocation平衡CPU和内存使用0-10
NodeAffinityPriority考虑节点亲和性0-10
TaintTolerationPriority考虑污点容忍0-10
ImageLocalityPriority偏向已有镜像的节点0-10

优选配置示例:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx
  affinity:
    podAffinity:  # Pod亲和性
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 100
        podAffinityTerm:
          labelSelector:
            matchExpressions:
            - key: app
              operator: In
              values:
              - web
          topologyKey: kubernetes.io/hostname
    podAntiAffinity:  # Pod反亲和性
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 100
        podAffinityTerm:
          labelSelector:
            matchExpressions:
            - key: app
              operator: In
              values:
              - cache
          topologyKey: kubernetes.io/hostname

3.4 绑定阶段

绑定过程:

  1. Scheduler选择最佳节点
  2. Scheduler向API Server发送绑定请求
  3. API Server更新etcd中的Pod配置
  4. Kubelet通过Watch机制感知到新的Pod任务

绑定配置:

apiVersion: v1
kind: Binding
metadata:
  name: nginx
  namespace: default
target:
  apiVersion: v1
  kind: Node
  name: node-1

四、Kubelet执行阶段

4.1 Kubelet工作原理

Kubelet职责:

  • 管理节点上的Pod生命周期
  • 与容器运行时交互
  • 上报节点和Pod状态到API Server

Kubelet工作流程:

flowchart TD
    A[Kubelet Watch到新Pod] --> B[准备创建Pod]
    B --> C[同步Pod配置]
    C --> D[拉取容器镜像]
    D --> E[创建Pause容器]
    E --> F[配置网络命名空间]
    F --> G[启动Init容器]
    G --> H[启动业务容器]
    H --> I[执行健康检查]
    I --> J[上报Pod状态]
    J --> K[Pod变为Running]

4.2 镜像预热

镜像拉取策略:

策略行为
Always每次创建容器都拉取镜像
IfNotPresent镜像不存在时拉取
Never从不拉取,使用本地镜像

镜像预热优化:

  • 使用镜像缓存
  • 配置镜像预热策略
  • 使用本地镜像仓库

镜像拉取配置:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.15.4
    imagePullPolicy: IfNotPresent  # 镜像拉取策略
  imagePullSecrets:  # 私有仓库认证
  - name: my-secret

4.3 Pause容器

Pause容器作用:

  • 持有Pod的网络命名空间
  • 持有Pod的IP地坦
  • 作为Pod中其他容器的父容器

Pause容器特点:

  • 永远处于Running状态
  • 不执行任何业务逻辑
  • 持有网络和存储资源

Pause容器原理:

# 查看Pause容器
docker ps | grep pause

# 查看Pause容器的网络命名空间
docker inspect <pause-container-id> --format '{{.NetworkMode}}'

# 查看Pause容器的PID命名空间
docker inspect <pause-container-id> --format '{{.HostConfig.PidMode}}'

4.4 CNI网络配置

CNI插件职责:

  • 为Pod分配IP地址
  • 配置Pod的网络命名空间
  • 设置网络规则和策略

常见CNI插件:

插件特点适用场景
Flannel简单大二层网络小规模集群
Calico高性能、安全策略中大规模集群
CiliumeBPF、深度可观测性大规模集群
Weave去中心化、加密混合云场景

CNI配置流程:

  1. Kubelet调用CNI插件
  2. CNI插件创建网络命名空间
  3. 分配IP地址
  4. 配置网络接口
  5. 设置网络规则

网络配置查看:

# 查看Pod的IP
kubectl get pod <pod-name> -n <namespace> -o jsonpath='{.status.podIP}'

# 查看Pod的网络信息
kubectl exec <pod-name> -n <namespace> -- ip addr

# 查看Pod的网络接口
kubectl exec <pod-name> -n <namespace> -- netstat -i

# 查看Pod的路由表
kubectl exec <pod-name> -n <namespace> -- route -n

4.5 Init容器

Init容器特点:

  • 在业务容器之前运行
  • 必须运行完成才能启动业务容器
  • 可以有多个,按顺序执行

Init容器用途:

  • 等待依赖服务就绪
  • 初始化配置
  • 准备数据

Init容器配置:

apiVersion: v1
kind: Pod
metadata:
  name: myapp
spec:
  initContainers:
  - name: init-myservice
    image: busybox:1.28
    command: ['sh', '-c', 'until nslookup myservice; do echo waiting for myservice; sleep 2; done;']
  - name: init-mydb
    image: busybox:1.28
    command: ['sh', '-c', 'until nslookup mydb; do echo waiting for mydb; sleep 2; done;']
  containers:
  - name: myapp
    image: myapp:1.0
    ports:
    - containerPort: 80

4.6 业务容器启动

容器启动顺序:

  1. Init容器运行完成
  2. 启动业务容器
  3. 执行健康检查
  4. 上报状态

容器启动配置:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.15.4
    ports:
    - containerPort: 80
      name: http
      protocol: TCP
    env:
    - name: NGINX_HOST
      value: "localhost"
    - name: NGINX_PORT
      value: "80"
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"
    livenessProbe:
      httpGet:
        path: /healthz
        port: 80
      initialDelaySeconds: 10
      periodSeconds: 10
    readinessProbe:
      httpGet:
        path: /ready
        port: 80
      initialDelaySeconds: 5
      periodSeconds: 5
    lifecycle:
      postStart:
        exec:
          command: ["/bin/sh", "-c", "echo Hello > /usr/share/message"]
      preStop:
        exec:
          command: ["/usr/sbin/nginx", "-s", "quit"]

五、状态转换与上报

5.1 Pod状态详解

Pod生命周期状态:

状态说明触发条件
Pending等待调度或创建中Pod被API Server接受
Running容器正在运行至少一个容器运行
Succeeded所有容器正常终止所有容器运行完成
Failed所有容器异常终止容器以失败终止
Unknown状态未知节点通信问题

容器状态:

状态说明
Waiting等待中
Running运行中
Terminated已终止

5.2 Kubelet状态上报

状态上报机制:

  • Kubelet定期向API Server上报Pod状态
  • 状态变化时立即上报
  • API Server更新etcd

状态上报频率:

  • 默认同步间隔:10秒
  • 状态变化时立即同步

查看Pod状态:

# 查看Pod状态
kubectl get pod <pod-name> -n <namespace>

# 查看Pod详细信息
kubectl describe pod <pod-name> -n <namespace>

# 查看Pod的YAML配置
kubectl get pod <pod-name> -n <namespace> -o yaml

# 查看Pod的事件
kubectl get events -n <namespace> --field-selector involvedObject.name=<pod-name>

六、调度器高级配置

6.1 调度器配置

调度器配置文件:

# scheduler-config.yaml
apiVersion: kubescheduler.config.k8s.io/v1beta2
kind: KubeSchedulerConfiguration
clientConnection:
  kubeconfig: /etc/kubernetes/scheduler.conf
leaderElection:
  leaderElect: true
  resourceLock: leases
  resourceName: kube-scheduler
algorithms:
  policy:
    apiVersion: kubescheduler.config.k8s.io/v1
    kind: Policy
    predicates:
    - name: PodFitsResources
    - name: HostName
    - name: MatchNodeSelector
    priorityConfigs:
    - name: LeastRequestedPriority
      weight: 1
    - name: BalancedResourceAllocation
      weight: 1
    - name: SelectorSpreadPriority
      weight: 1

6.2 亲和性与反亲和性

节点亲和性:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:  # 硬亲和性
        nodeSelectorTerms:
        - matchExpressions:
          - key: topology.kubernetes.io/zone
            operator: In
            values:
            - zone-a
      preferredDuringSchedulingIgnoredDuringExecution:  # 软亲和性
      - weight: 100
        preference:
          matchExpressions:
          - key: disktype
            operator: In
            values:
            - ssd
  containers:
  - name: nginx
    image: nginx

Pod亲和性与反亲和性:

apiVersion: v1
kind: Pod
metadata:
  name: web-server
spec:
  affinity:
    podAffinity:  # 与其他Pod共置
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: app
            operator: In
            values:
            - database
        topologyKey: kubernetes.io/hostname
    podAntiAffinity:  # 不与其他Pod共置
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 100
        podAffinityTerm:
          labelSelector:
            matchExpressions:
            - key: app
              operator: In
              values:
              - cache
          topologyKey: kubernetes.io/hostname
  containers:
  - name: web-server
    image: nginx

6.3 污点与容忍

污点(Taints):

# 添加污点
kubectl taint nodes node-1 dedicated=nginx:NoSchedule

# 移除污点
kubectl taint nodes node-1 dedicated=nginx:NoSchedule-

# 查看节点污点
kubectl describe node node-1 | grep Taints

容忍(Tolerations):

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  tolerations:
  - key: "dedicated"
    operator: "Equal"
    value: "nginx"
    effect: "NoSchedule"
  - key: "dedicated"
    operator: "Equal"
    value: "nginx"
    effect: "NoExecute"
    tolerationSeconds: 3600
  - key: "node.kubernetes.io/not-ready"
    operator: "Exists"
    effect: "NoExecute"
    tolerationSeconds: 300
  containers:
  - name: nginx
    image: nginx

6.4 资源请求与限制

资源配置:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
        ephemeral-storage: "1Gi"
      limits:
        memory: "128Mi"
        cpu: "500m"
        ephemeral-storage: "2Gi"
    limits:
      memory: "256Mi"
      cpu: "1"

七、问题排查与优化

7.1 常见问题排查

Pending状态:

原因排查方法解决方案
资源不足kubectl describe node增加节点或减少Pod资源请求
调度失败kubectl describe pod检查亲和性、污点等
PVC未绑定kubectl get pvc创建PVC或等待绑定
节点不可用kubectl get nodes恢复节点

ContainerCreating状态:

原因排查方法解决方案
镜像拉取失败kubectl describe pod检查镜像名称和认证
网络配置失败kubectl describe pod检查CNI配置
存储挂载失败kubectl describe pod检查PVC和存储类
端口冲突kubectl describe pod修改容器端口

7.2 调度性能优化

调度性能优化策略:

  1. 减少调度器延迟:
    • 优化预选和优选算法
    • 使用调度框架扩展
    • 配置合适的并发度
  2. 提高调度精度:
    • 合理配置资源请求
    • 使用合适的亲和性策略
    • 避免过度调度
  3. 调度器配置优化:
# scheduler-config.yaml
apiVersion: kubescheduler.config.k8s.io/v1beta2
kind: KubeSchedulerConfiguration
clientConnection:
  kubeconfig: /etc/kubernetes/scheduler.conf
  burst: 200
  qps: 50
leaderElection:
  leaderElect: true
  leaseDuration: 15s
  renewDeadline: 10s
  retryPeriod: 5s
  resourceLock: leases
  resourceName: kube-scheduler

7.3 镜像拉取优化

镜像拉取优化策略:

  1. 使用本地镜像仓库:
    • 配置私有镜像仓库
    • 使用镜像缓存
  2. 优化镜像大小:
    • 使用多阶段构建
    • 使用轻量级基础镜像
  3. 配置镜像预热:
    • 定期预热常用镜像
    • 使用镜像预热工具

镜像预热配置:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  initContainers:
  - name: image-check
    image: nginx:1.15.4
    command: ['sh', '-c', 'echo Image pulled']
  containers:
  - name: nginx
    image: nginx:1.15.4
    imagePullPolicy: IfNotPresent

八、最佳实践总结

8.1 配置最佳实践

Pod配置最佳实践:

  • 合理设置资源请求和限制
  • 配置适当的健康检查探针
  • 使用Init容器处理依赖
  • 配置合适的镜像拉取策略
  • 使用有意义的标签和名称
  • 配置污点容忍处理特殊情况
  • 使用亲和性分散Pod到不同节点

8.2 调度最佳实践

调度最佳实践:

  • 合理分配节点资源
  • 使用节点池管理不同类型节点
  • 配置合适的亲和性策略
  • 使用污点处理特殊节点
  • 避免过度调度
  • 定期检查调度器性能

8.3 运维最佳实践

运维最佳实践:

  • 监控Pod创建时间和成功率
  • 建立Pod创建问题排查文档
  • 定期审计调度策略
  • 优化镜像仓库访问速度
  • 配置自动扩缩容策略
  • 建立调度异常告警

总结

理解Kubernetes Pod创建流程是掌握Kubernetes工作原理的基础。通过本文的详细介绍,我们可以全面理解Pod创建涉及的各个阶段、各组件的职责和协作机制。

核心要点:

  1. API Server处理:认证授权、配置验证、写入etcd
  2. 调度阶段:预选过滤、优选打分、绑定节点
  3. Kubelet执行:镜像拉取、容器创建、网络配置
  4. 状态上报:Kubelet上报状态、API Server更新状态
  5. 组件协作:通过Watch机制实现组件间通信
  6. 调度优化:合理配置资源、亲和性、污点容忍
  7. 问题排查:理解各状态的含义和解决方法
  8. 性能优化:优化镜像、调度器、资源配置

通过深入理解Pod创建流程,我们可以更好地设计和优化Kubernetes集群,提高系统的可靠性和性能。

延伸学习:更多面试相关的Pod创建流程知识,请参考 SRE面试题解析:pod的创建流程是啥?。


参考资料

文档信息

Search

    Table of Contents