admin管理员组文章数量:1446759
Kubernetes 创建 Deployment 的完整流程解析
Kubernetes 创建 Deployment 的完整流程解析
当在 Kubernetes 中执行 kubectl apply -f deployment.yaml
时,背后发生了什么?本文将深入解析从 YAML 文件到运行 Pod 的完整流程。
代码语言:javascript代码运行次数:0运行复制执行 kubectl apply -f deployment.yaml 后,涉及的组件和流程如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: nginx
image: nginx:latest
详细步骤说明
1. kubectl 发送请求
代码语言:javascript代码运行次数:0运行复制# 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 创建容器
代码语言:javascript代码运行次数:0运行复制graph LR
A[获取 Pod 定义] --> B[拉取镜像]
B --> C[创建容器]
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 的完整流程图,标注了每个步骤的序号:
<!DOCTYPE html>
<html>
<head>
<title>Deployment 创建流程(步骤序号版)</title>
<script src="@10.6.1/dist/mermaid.min.js"></script>
<style>
.step-number {
background: #4CAF50;
color: white;
border-radius: 50%;
width: 25px;
height: 25px;
display: inline-block;
text-align: center;
margin-right: 10px;
}
</style>
</head>
<body>
<div class="mermaid">
sequenceDiagram
participant kubectl
participant API Server
participant etcd
participant Controller
participant Scheduler
participant Kubelet
participant CNI
Note over kubectl: 1. 提交请求
kubectl->>API Server: POST /apis/apps/v1/deployments
Note over API Server: 2. 认证/存储
API Server->>etcd: 存储 Deployment
etcd-->>API Server: 确认写入
Note over Controller: 3. 创建 ReplicaSet
Controller->>API Server: Watch Deployment
Controller->>etcd: 创建 ReplicaSet
etcd-->>Controller: 确认写入
Note over Scheduler: 4. 调度决策
Scheduler->>API Server: Watch Pods
Scheduler->>API Server: Bind Pod to Node
Note over Kubelet: 5. 启动容器
Kubelet->>API Server: Watch Pod binding
Kubelet->>Kubelet: 拉取镜像
Kubelet->>Kubelet: 创建容器
Note over CNI: 6. 网络配置
Kubelet->>CNI: 请求 IP 分配
CNI-->>Kubelet: 返回 IP 10.244.1.2
Note over API Server: 7. 状态更新
Kubelet->>API Server: 更新 Pod 状态
</div>
</body>
</html>
关键调试命令
代码语言:javascript代码运行次数:0运行复制# 查看实时事件(按时间排序)
kubectl get events --sort-by=.metadata.creationTimestamp
# 诊断调度问题
kubectl describe pod <pod-name> | grep -A10 Events
# 检查镜像拉取情况
kubectl describe pod <pod-name> | grep -i image
# 网络连通性测试
kubectl exec -it <pod-name> -- curl http://service-name
架构设计亮点
设计原则 | 实现机制 |
---|---|
声明式 API | 用户描述期望状态,系统自动收敛 |
水平扩展 | 无状态组件(API Server/etcd 可集群化) |
松耦合 | 通过 Watch 机制实现组件解耦 |
自愈能力 | Controller 持续比对实际状态与期望状态 |
总结
通过本文,已经了解了 Kubernetes 创建 Deployment 的完整流程,从 kubectl
提交请求到 Pod 成功运行,涉及多个组件的协同工作。希望这份笔记能帮助更好地理解 Kubernetes 的内部机制!
本文标签: Kubernetes 创建 Deployment 的完整流程解析
版权声明:本文标题:Kubernetes 创建 Deployment 的完整流程解析 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/biancheng/1748299254a2840961.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论