K8s本身有许多二进制组件,用于提供完整的功能,我们初学者可能会觉得组件太多,眼花瞭乱;我们必须要了解这些组件的作用,才能更好理解K8s的工作原理。在了解K8s组件之前,我们先需要知道K8s部署在节点后有二种类型的角色:

  • Master
  • Node(或worker)

我们按节点角色来讲各个组件

Master节点组件

Master节点是K8s的管理节点,相当于K8s的大脑,控制着整个集群。Master组件对集群做出全局性决策(例如:调度),以及检测和响应集群事件(例如 副本控制器的replicas字段不满足时,启动新的副本)。Master组件可以在集群中的任何节点上运行,但是默认的初始化K8s集群后,Master节点会启动所有除用户容器外的所有Master组件。

kube-apiserver

kube-apiserver对外暴露了Kubernetes API。它是的Kubernetes前端控制层。支持水平扩展,即通过部署更多实例来缩放kube-apiserver服务。

etcd

etcd相当于一个数据库,用于Kubernetes的后端存储。所有集群数据都存储在此处,所以最好为Kubernetes集群的etcd数据提供完善的备份计划

kube-controller-manager

kube-controller-manager运行控制器,它们是处理集群中常规任务的后台线程。逻辑上,每个控制器是一个单独的进程,但为了降低复杂性,它们都被编译成独立的可执行文件,并在单个进程中运行。这些控制器包括:

  • 节点控制器: 当节点移除时,负责注意和响应。
  • 副本控制器: 负责维护系统中每个副本控制器对象正确数量的Pod。
  • 端点控制器: 填充端点(Endpoints)对象(即连接Services & Pods)。
  • 服务帐户和令牌控制器: 为新的命名空间创建默认帐户和API访问令牌。

cloud-controller-manager(基本用不到)

用于与底层云提供商交互的控制器。云控制器管理器可执行组件是Kubernetes v1.6版本中引入的Alpha功能。

kube-scheduler

kube-scheduler监视没有分配节点的新创建的Pod,选择一个节点供他们运行,即Pod调度作用。

插件

插件是实现集群功能的Pod和Service。 Pods可以通过Deployments,ReplicationControllers管理。插件对象本身是受命名空间限制的,被创建于 kube-system命名空间。例如DNS插件,网络插件Calico,Web管理面板Kubernetes Dashboard,容器资源监控heapster/metric-server等。

Node节点组件

节点组件在每个节点上运行,维护运行的Pod并提供Kubernetes运行环境。

kubelet

kubelet是主要的节点代理服务,以系统服务方式运行。它监测已分配给其节点的Pod(通过apiserver或通过本地配置文件),提供如下功能:

  • 挂载Pod所需要的数据卷(Volume)。
  • 下载Pod的secrets。
  • 通过Docker运行(或通过 rkt)运行Pod的容器。
  • 周期性的对容器生命周期进行探测。
  • 如果需要,通过创建镜像Po(Mirror Pod)将Pod 的状态报告回系统的其余部分。
  • 将节点的状态报告回系统的其余部分。

kube-proxy

kube-proxy通过维护主机上的网络规则并执行连接转发,实现了Kubernetes服务抽象。

docker

Docker用于运行容器。另外,Kubernetes还支持rkt运行容器作为Docker的试验性替代方案。

supervisord(可自定义)

supervisord是一个轻量级的进程监控系统,可以用来保证kubelet和docker运行。

fluentd(可自定义)

fluentd是一个守护进程,它有助于提供集群层面日志 集群层面的日志。