kubernetes 组件说明:
Master节点上面主要由四个模块组成:
- kube-apiserver
- kube-scheduler
- kube-controller-manager
- etcd
apiserver:apiserver 负责对外提供 RESTful 的 kubernetes API 的服务,它是系统管理指令的统一接口,任何对资源的增删该查都要交给 apiserver 处理后再交给 etcd;kubectl(kubernetes 提供的客户端工具,该工具内部是对 kubernetes API 的调用)是直接和 apiserver 交互的。
scheduler:scheduler 负责调度 Pod 到合适的 Node 上,如果把 scheduler 看成一个黑匣子,那么它的输入是 pod 和由多个 Node 组成的列表,输出是 Pod 和一个 Node 的绑定。 kubernetes 目前提供了调度算法,同样也保留了接口。用户根据自己的需求定义自己的调度算法。
controller manager:如果 apiserver 做的是前台的工作的话,那么 controller manager 就是负责后台的。每一个资源都对应一个控制器。而 controller manager 就是负责管理这些控制器的,比如我们通过 apiserver 创建了一个 Pod,当这个 Pod 创建成功后,apiserver 的任务就算完成了。
etcd:etcd 是一个高可用的键值存储系统,kubernetes 使用它来存储各个资源的状态,从而实现了 Restful 的 API。
每个Node节点主要由三个模板组成:
- kube-proxy
- kubelet
- docker
kube-proxy:该模块实现了 kubernetes 中的服务发现和反向代理功能。kube-proxy 支持 TCP 和 UDP 连接转发,默认基 Round Robin 算法将客户端流量转发到与 service 对应的一组后端 pod。服务发现方面,kube-proxy 使用 etcd 的 watch 机制监控集群中 service 和 endpoint 对象数据的动态变化,并且维护一个 service 到 endpoint 的映射关系,从而保证了后端 pod 的 IP 变化不会对访问者造成影响,另外,kube-proxy 还支持 session affinity。
kublet:kublet 是 Master 在每个 Node 节点上面的 agent,是 Node 节点上面最重要的模块,它负责维护和管理该 Node 上的所有容器,但是如果容器不是通过 kubernetes 创建的,它并不会管理。本质上,它负责使 Pod 的运行状态与期望的状态一致。
- 第一步通过 apiserver REST API 创建一个 Pod (一般是用户通过 kubectl 传递得指令);
- 然后 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;
- kubelet 通过 container runtime 获取 Pod 的状态,然后更新到 apiserver 中,当然最后也是写入到 etcd 中去的。