前情提要:【k8s】1.k8s架构-CSDN博客
首先复习一下k8s的几个核心组件:
- control plane(master节点)
- api server:请求入口,操作etcd
- controller manager:管理集群的状态
- scheduler:pod调度
- etcd:数据持久化
- node(工作节点)
- kubelet:维护容器的生命周期
- container runtime(CRI): 镜像管理, Pod 和容器的真正运行
- kube proxy:服务发现和负载均衡
k8s创建一个deployment的过程
整个过程遵循关注点分离:APIServer, ControllerManager, Etcd, Scheduler, Kubelet, Docker分工明确,各自处理自己的工作。
1. 客户端请求APIServer
请求方通过api接口或kubectl方式请求到APIServer,APIServer会进行认证鉴权、校验等,然后将此deployment创建信息写入etcd。
2. controller manager处理
controller manager监听到etcd中的事件,对于不同的资源,触发不同的处理方式。
对于deployment的处理,分为两方面进行管理:
-
deployment controller:监听deployment的创建事件,创建相应的replicaset副本集(控制副本数量)。k8s是建议用deployment管理副本数而非直接使用replicaset的,用replicaset控制pod。
-
replicaset controller:监听replicaset的创建事件,创建相应的pod。是通过labelSelector标签选择器管理相应标签的pod。
3. scheduler为pod分配节点
scheduler监听到pod的创建事件,通过调度策略为pod分配调度节点。此调度流程分为预选、优选两步骤:
-
预选:遍历k8s集群中所有的pod,根据节点亲和性、污点、容忍、硬件资源计算等,选出符合要求的ndoe最为预选node。
-
优选:对预选出的node进行打分,选择分数最高的node,分配给pod。
最终将pod与node的绑定信息通过apiServer写入etcd中。
4. kubelet调度pod
kubelet监听到pod的调度事件,实际去运行pod,如调用docker创建容器。
kubelet会分别调用CRI,CNI,CSI:
- CRI(Container Runtime Interface)容器运行时接口:负责拉镜像、创建、删除容器等,常用插件:
- containerd
- CRI-O
- Docker Engine
- CNI(Container Network Interface)容器网络接口:负责管理网络,为pod分配IP等,常用插件:
- flannel
- calico
- CSI(Containter Storage Interface)容器存储接口:负责与外部存储通信,执行卷的附加、挂载等。
以上三种接口是k8s定义的标准,具体的实现都是由插件完成的。
参考: