我们知道在Kubernetes
集群中apiserver
是整个集群的控制入口,etcd
在集群中充当数据库的作用,只有apiserver
才可以直接去操作etcd
集群,而我们的apiserver
无论是对内还是对外都提供了统一的REST API
服务,包括一个8080端口的非安全服务和6443端口的安全服务。组件之间当然也是通过apiserver
进行通信的,其中kube-controller-manager
、kube-scheduler
、kubelet
是通过apiserver watch API
来监控我们的资源变化,并且对资源的相关状态更新操作也都是通过apiserver
进行的,所以说白了组件之间的通信就是通过apiserver REST API
和apiserver watch API
进行的
下面图示为Pod
的工作流程图
和上面的组件通信一致:
apiserver REST API
经过KubeConfig
认证通过后,创建一个Pod
apiserver
接收到数据后将数据写入etcd
中kube-scheduler
通过apiserver watch API
一直在监听资源的变化,这个时候发现有一个新的Pod
,但是这个时候该Pod
还没和任何Node
节点进行绑定,所以kube-scheduler
就经过一系列复查的调度策略,选择出一个合适的Node
节点,将该Pod
和该目标Node
绑定,当然也会更新到etcd
中去Node
节点上的kubelet
通过apiserver watch API
检测到有一个新的Pod
被调度过来了,他就将该Pod
的相关数据传递给后面的容器进行时container runtime
,比如Docker
,让他们去运行该Pod
,调用CNI
接口创建Pod
网络,调用CRI
启动容器,调用CSI
进行存储卷的挂载kubelet
还会通过container runtime
获取Pod
的状态,网络,容器,存储创建完成后Pod
创建完成,等业务进程启动后,Pod
运行成功,然后更新到apiserver
中,当然最后也是写入到etcd
中去的apiserver REST API
经过KubeConfig
认证通过后,创建一个Pod
apiserver
接收到数据后将数据写入etcd
中controller manager
通过apiserver watch api
一直监听资源的变化,这个时候deployment controller
发现了一个新的deplayment
对象更后,根据deployment
的描述创建一个ReplicaSet
并将ReplicaSet
对象返回apiserver
并持久化回etcd
。kube-scheduler
通过apiserver watch API
一直在监听资源的变化,这个时候发现有一个新的Pod
,但是这个时候该Pod
还没和任何Node
节点进行绑定,所以kube-scheduler
就经过一系列复查的调度策略,选择出一个合适的Node
节点,将该Pod
和该目标Node
绑定,当然也会更新到etcd
中去。Node
节点上的kubelet
通过apiserver watch API
检测到有一个新的Pod
被调度过来了,他就将该Pod
的相关数据传递给后面的容器进行时container runtime
,比如Docker
,让他们去运行该Pod
,调用CNI
接口创建Pod
网络,调用CRI
启动容器,调用CSI
进行存储卷的挂载kubelet
还会通过container runtime
获取Pod
的状态,网络,容器,存储创建完成后Pod
创建完成,等业务进程启动后,Pod
运行成功,然后更新到apiserver
中,当然最后也是写入到etcd
中去的。