Kubernetes 创建 Deployment 的完整流程解析

news/2025/3/12 15:33:43/文章来源:https://www.cnblogs.com/yuwen01/p/18764741

Kubernetes 创建 Deployment 的完整流程解析

当在 Kubernetes 中执行 kubectl apply -f deployment.yaml 时,背后发生了什么?本文将深入解析从 YAML 文件到运行 Pod 的完整流程。

执行 kubectl apply -f deployment.yaml 后,涉及的组件和流程如下:

apiVersion: apps/v1
kind: Deployment
metadata:name: my-app
spec:replicas: 3selector:matchLabels:app: my-apptemplate:metadata:labels:app: my-appspec:containers:- name: nginximage: nginx:latest

详细步骤说明

1. kubectl 发送请求

# 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 创建容器

graph LRA[获取 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 的完整流程图,标注了每个步骤的序号:
image

<!DOCTYPE html>
<html>
<head><title>Deployment 创建流程(步骤序号版)</title><script src="https://cdn.jsdelivr.net/npm/mermaid@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">sequenceDiagramparticipant kubectlparticipant API Serverparticipant etcdparticipant Controllerparticipant Schedulerparticipant Kubeletparticipant CNINote over kubectl: 1. 提交请求kubectl->>API Server: POST /apis/apps/v1/deploymentsNote over API Server: 2. 认证/存储API Server->>etcd: 存储 Deploymentetcd-->>API Server: 确认写入Note over Controller: 3. 创建 ReplicaSetController->>API Server: Watch DeploymentController->>etcd: 创建 ReplicaSetetcd-->>Controller: 确认写入Note over Scheduler: 4. 调度决策Scheduler->>API Server: Watch PodsScheduler->>API Server: Bind Pod to NodeNote over Kubelet: 5. 启动容器Kubelet->>API Server: Watch Pod bindingKubelet->>Kubelet: 拉取镜像Kubelet->>Kubelet: 创建容器Note over CNI: 6. 网络配置Kubelet->>CNI: 请求 IP 分配CNI-->>Kubelet: 返回 IP 10.244.1.2Note over API Server: 7. 状态更新Kubelet->>API Server: 更新 Pod 状态</div>
</body>
</html>

关键调试命令

# 查看实时事件(按时间排序)
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 的内部机制!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/897185.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【设计模式】如何使用适配器模式让不兼容的类协同工作?

概述 如果去欧洲国家旅游的话,他们的插座如下图最左边,是欧洲标准。而我们使用的插头如下图最右边的。因此我们的笔记本电脑,手机在当地不能直接充电。所以就需要一个插座转换器,转换器第1面插入当地的插座,第2面供我们充电,这样使得我们的插头在当地能使用。生活中这样的…

一键部署QwQ-32B推理模型,2种方式简单、快速体验

QwQ-32B推理模型正式发布并开源,凭借其卓越的性能和广泛的应用场景,迅速在全球范围内获得了极高的关注度。基于阿里云函数计算 FC提供算力,Serverless+ AI 云原生应用开发平台 CAP现已提供模型服务、应用模板两种部署方式辅助您部署QwQ 32B系列模型。您选择一键部署应用模板…

No.53 ES6---Async函数

一、Async 函数ES2017 标准引入了 async 函数,使得异步操作变得更加方便。 async函数可以将异步操作变为同步操作。<script>function print(){//定时器是异步的setTimeout(()=>{console.log("定时器");},2000)console.log("hello")} print(); …

Redis--Lesson03--Redis基础

基础命令 Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合,位图,hyperloglogs等数据类型。内置复制、Lua脚本、LRU收回、事务以及不同级别磁盘持久化功能,同时通过Redis Sentine…

Acunetix v25.3 发布,新增功能概览

Acunetix v25.3 发布,新增功能概览Acunetix v25.3 (Linux, Windows) - Web 应用程序安全测试 Acunetix | Web Application Security Scanner 请访问原文链接:https://sysin.org/blog/acunetix/ 查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org重要提示 Acunetix…

Linux系统离线安装Docker

某些时候需要使用Docker环境,但存在服务器无法联网或者其他情况,需要离线安装Dokcer,本次记录Oracle Linux 7环境下安装Docker: 1、下载Docker二进制文件 下载地址:https://download.docker.com/linux/static/stable/x86_64/ 选择需要安装的版本,如下载docker-27.2.1 2、使…

Windows和mac OS共用VMware虚拟机

在Windows下使用VMware Workstation Pro创建的虚拟机,是以文件夹形式存储在硬盘中的,在mac OS中对应的虚拟机产品是VMware Fusion,那么在Windows下创建的虚拟机怎么在mac OS中使用呢?在下图中我们可以看到,Windows 10是在Windows下创建的虚拟机。 选择该目录,按下enter(…

【第一篇】如何高效利用多功能调试器上的EEPROM

EEPROMEEPROM是一种带电可擦的可编程只读存储器,相较于FLASH来说,EEPROM的寿命更长,写入数据之前不需要先进行擦写操作。目前市面上常见的eeprom的型号多为at24cxx,其中有02,04,08,16,32等等。在多功能调试器上加入EEPROM的目的:主要是起一个学习作用,因为在多功能调…

FANformer:融合傅里叶分析网络的大语言模型基础架构

近期大语言模型(LLM)的基准测试结果引发了对现有架构扩展性的思考。尽管OpenAI推出的GPT-4.5被定位为其最强大的聊天模型,但在多项关键基准测试上的表现却不及某些规模较小的模型。DeepSeek-V3在AIME 2024评测中达到了39.2%的Pass@1准确率,在SWE-bench Verified上获得42%的准…

基于Qt的信号量的使用

下面是用两个线程,一个是生产者不断地产生数据,另一个则不断消耗数据。这个例子可以很好的演示生产者/消费者模型。由于C++在C++20之后才提供信号量类型,所以这里的测试环境是Qt5.9和VS2019。 Misc.h文件:#pragma once#include <qsemaphore.h> #include <qthread.…

linux 中awk命令删除指定字段中特定字符串前边所有内容

001、删除第9个字段gene_id前边的所有内容[b20223040323@admin2 test]$ ls a.txt [b20223040323@admin2 test]$ cat a.txt ## 测试数据 NC_089035.1 Gnomon transcript 7328 15219 . + . transcript_id "rna-XM_015766610.3&quo…

.NET Core 中如何实现缓存的预热?

在构建高性能的 .NET Core 应用时,缓存是提升系统响应速度、减轻数据库压力的利器。然而,缓存并非一蹴而就,它也需要“热身”才能发挥最佳性能。这就是缓存预热的意义所在。 一、什么是缓存预热? 缓存预热,顾名思义,就是在系统启动或缓存失效后,主动将热点数据加载到缓存…