启动整个流程之前,控制器、调度器、 Kubelet就已经通过API 服务器监听它们各自资源类型的变化了。图中不包含 etcd, 因为它被隐藏在 API 服务器之后,可以想象成 API服务器就是对象存储的地方。

QQ_1721896113932.png

1、deployment资源的创建

准备包含 Deployment 清单的 YAML文件,通过 kubetctl 提交到 Kubernetes。kubectl通过HTTP POST请求发送清单到 Kubernetes API服务器。 API 服务器检查 Deployment 定义,存储到 etcd ,返回响应给 kubectl。

除了pod需要拉镜像运行,其他资源把资源文件存入etcd就是创建了。

2、Deployment控制器生成ReplicaSet

当新创建 Deployment资源时,所有通过 API 服务器监听机制监听 Deployment 列表的客户端马上会收到通知。其中有个客户端叫 Deployment控制器。

控制平面的 controller manager 里面有很多的控制器,像:

  • ReplicationController控制器

  • ReplicaSet控制器

  • DaemonSet控制器

  • Job控制器

  • Deployment 控制器

  • StatefulSet 控制器

  • Node 控制器

  • Service控制器

  • Endpoints控制器

  • Namespace 控制器

  • PersistentVolume 控制器。

这些控制器负责管理对应资源,包括创建、更新、删除。

一个 Deployment由一个或多个 Replicaset 支持,ReplicaSet 后面会创建实际的pod。controller manager里面的 Deployment 控制器跟API server交互时检查到有一个新的 Deployment 对象时,会按照 Deploymnet 当前定义创建 ReplicaSet。这包括通过 Kubernetes API创建一个新的 ReplicaSet资源。 Deployment控制器完全不会去处理单个pod。

3、ReplicaSet控制器创建pod资源

新创建的 ReplicaSet由ReplicaSet控制器(通过 API服务器创建、修改、删除ReplicaSet资源)接收。控制器会考虑 replica数量、ReplicaSet 中定义的pod选择器,然后检查是否有足够的满足选择器的pod。

然后控制器会基于 ReplicatSet 的 pod 模板创建 pod 资源(当 Deployment控制器创建ReplicaSet时,会从Deployment复制pod模板)。

4、调度器分配节点给新创建的pod

新创建的 pod目前保存在 etcd中,但是它们每个都缺少一个重要的东西 ——它们还没有任何关联节点。它们的 nodeName 属性还未被设置。调度器会监控像这样的 pod,发现一个,就会为 pod选择最佳节点,并将节点分配给 pod。pod的定义现在就会包含它应该运行在哪个节点。

目前,所有的一切都发生在 Kubernetes 控制平面中。参与这个全过程的控制器没有做其他具体的事情,除了通过API服务器更新资源。

5、Kubelet运行pod容器

随着pod目前分配给了特定的节点,节点上的 Kubelet 终于可以工作了。Kubelet通过API服务器监听pod变更,发现有新的pod分配到本节点后,会去检查pod定义,然后命令 Docker 或者任何使用的容器运行时来启动pod容器,容器运行时就会去运行容器。