k8s中deployment创建过程

在 Kubernetes(K8s)中,创建一个 Deployment 的过程涉及多个组件的协同工作。


6a1171cd8ffb3a4199f83c35cdf63540.png

1. 编写 Deployment 配置文件

首先,使用 YAML 格式编写一个描述 Deployment 的配置文件,定义其元数据、规格说明、标签选择器和 Pod 模板等信息。
例如,以下是一个简单的 Deployment 配置示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-container
image: nginx:latest
ports:
- containerPort: 80

2. 提交配置文件到 API Server

使用 kubectl 命令将上述配置文件提交到 Kubernetes 集群的 API Server:

1
kubectl apply -f deployment.yaml

API Server 会对请求进行认证、鉴权和校验,然后将 Deployment 的信息存储到集群的分布式键值存储系统 etcd 中

3. Controller Manager 处理请求

Controller Manager 监听 etcd 中的资源变化事件。
当新的 Deployment 被创建时,Deployment Controller 会检测到该事件,并根据 Deployment 的配置创建一个 ReplicaSet。
ReplicaSet Controller 会监听 ReplicaSet 的创建事件,并根据 ReplicaSet 的配置创建相应数量的 Pod。

4. 调度 Pod 到节点

Kubernetes Scheduler 监听 Pod 的调度事件,并根据调度策略(如节点亲和性、污点、容忍、硬件资源等)为 Pod 选择一个合适的节点。
调度完成后,Scheduler 会将 Pod 与节点的绑定信息写回 etcd。

5. Kubelet 在节点上运行 Pod

节点上的 Kubelet 进程监听 etcd 中的 Pod 变化事件。
当发现有新的 Pod 被调度到本节点时,Kubelet 会调用容器运行时(如 Docker、containerd 等)来创建和启动容器。
同时,Kubelet 还负责 Pod 的生命周期管理,包括健康检查、日志收集等。

6. Pod 和 Service 网络通信

Kube-Proxy 是运行在集群各个节点上的网络代理,负责实现服务发现和负载均衡
当有外部请求访问服务时,Kube-Proxy 会根据服务的 Endpoints 信息将请求转发到正确的 Pod 或容器上。