找回密码
 立即注册
首页 业界区 安全 Kubernetes 创建 Deployment 的完整流程解析

Kubernetes 创建 Deployment 的完整流程解析

计海龄 2025-6-1 21:04:42
Kubernetes 创建 Deployment 的完整流程解析

当在 Kubernetes 中执行 kubectl apply -f deployment.yaml 时,背后发生了什么?本文将深入解析从 YAML 文件到运行 Pod 的完整流程。
执行 kubectl apply -f deployment.yaml 后,涉及的组件和流程如下:
  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4.   name: my-app
  5. spec:
  6.   replicas: 3
  7.   selector:
  8.     matchLabels:
  9.       app: my-app
  10.   template:
  11.     metadata:
  12.       labels:
  13.         app: my-app
  14.     spec:
  15.       containers:
  16.       - name: nginx
  17.         image: nginx:latest
复制代码
详细步骤说明

1. kubectl 发送请求
  1. # kubectl apply -f deployment.yaml
复制代码

  • 通过 CLI 向 API Server 提交 Deployment 资源定义。
  • 使用 HTTPS 加密通信(默认 6443 端口)。
2. API Server 处理


  • 身份认证(X.509 证书/Bearer Token)。
  • RBAC 权限校验。
  • 资源验证(Schema 检查)。
  • 存储到 etcd(集群状态唯一真相源)。
3. Controller Manager 响应


  • Deployment Controller 监听到新对象。
  • 创建 ReplicaSet 并写入 etcd。
  • 副本数控制逻辑:replicas: 3 → 确保 3 个 Pod。
4. Scheduler 调度决策


  • 过滤不满足条件的 Node(污点/标签)。
  • 打分机制选择最优节点(资源利用率、亲和性等)。
  • 更新 Pod 的 nodeName 字段。
5. Kubelet 创建容器
  1. graph LR
  2.     A[获取 Pod 定义] --> B[拉取镜像]
  3.     B --> C[创建容器]
  4.     C --> D[挂载 Volume]
复制代码

  • 调用 CRI(Container Runtime Interface)。
  • 支持 Docker/containerd/CRI-O 等运行时。
6. CNI 网络配置


  • 为 Pod 分配 IP(通常从 10.244.0.0/16 子网)。
  • 设置 veth pair 连接容器与主机。
  • 更新网络路由规则(Calico/Flannel 等实现)。
7. 状态反馈循环


  • kubelet 持续监控容器状态。
  • 定期向 API Server 报告健康状况。
  • 异常时触发自愈机制(重启 Pod)。
流程图:Deployment 创建流程

以下是 Kubernetes 创建 Deployment 的完整流程图,标注了每个步骤的序号:
1.png
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.     <title>Deployment 创建流程(步骤序号版)</title>
  5.    
  6.    
  7. </head>
  8. <body>
  9.    
  10.         sequenceDiagram
  11.             participant kubectl
  12.             participant API Server
  13.             participant etcd
  14.             participant Controller
  15.             participant Scheduler
  16.             participant Kubelet
  17.             participant CNI
  18.             Note over kubectl: 1. 提交请求
  19.             kubectl->>API Server: POST /apis/apps/v1/deployments
  20.             
  21.             Note over API Server: 2. 认证/存储
  22.             API Server->>etcd: 存储 Deployment
  23.             etcd-->>API Server: 确认写入
  24.             Note over Controller: 3. 创建 ReplicaSet
  25.             Controller->>API Server: Watch Deployment
  26.             Controller->>etcd: 创建 ReplicaSet
  27.             etcd-->>Controller: 确认写入
  28.             
  29.             Note over Scheduler: 4. 调度决策
  30.             Scheduler->>API Server: Watch Pods
  31.             Scheduler->>API Server: Bind Pod to Node
  32.             
  33.             Note over Kubelet: 5. 启动容器
  34.             Kubelet->>API Server: Watch Pod binding
  35.             Kubelet->>Kubelet: 拉取镜像
  36.             Kubelet->>Kubelet: 创建容器
  37.             
  38.             Note over CNI: 6. 网络配置
  39.             Kubelet->>CNI: 请求 IP 分配
  40.             CNI-->>Kubelet: 返回 IP 10.244.1.2
  41.             
  42.             Note over API Server: 7. 状态更新
  43.             Kubelet->>API Server: 更新 Pod 状态
  44.    
  45. </body>
  46. </html>
复制代码
关键调试命令
  1. # 查看实时事件(按时间排序)
  2. kubectl get events --sort-by=.metadata.creationTimestamp
  3. # 诊断调度问题
  4. kubectl describe pod <pod-name> | grep -A10 Events
  5. # 检查镜像拉取情况
  6. kubectl describe pod <pod-name> | grep -i image
  7. # 网络连通性测试
  8. kubectl exec -it <pod-name> -- curl http://service-name
复制代码
架构设计亮点

设计原则实现机制声明式 API用户描述期望状态,系统自动收敛水平扩展无状态组件(API Server/etcd 可集群化)松耦合通过 Watch 机制实现组件解耦自愈能力Controller 持续比对实际状态与期望状态总结

通过本文,已经了解了 Kubernetes 创建 Deployment 的完整流程,从 kubectl 提交请求到 Pod 成功运行,涉及多个组件的协同工作。希望这份笔记能帮助更好地理解 Kubernetes 的内部机制!

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册