本文隶属于专栏《1000个问题搞定大数据技术体系》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!
本专栏目录结构和参考文献请见1000个问题搞定大数据技术体系
一个典型的 Kubernetes 集群由多个工作节点( worker node )和一个集群控制平面( control plane ,即 Master ),以及一个集群状态存储系统( etcd )组成。
其中 Master 节点负责整个集群的管理工作,为集群提供管理接口,并监控和编排集群中的各个工作节点。
各节点负责以 Pod 的形式运行容器,因此,各节点需要事先配置好容器运行依赖到的所有服务和资源,如容器运行时环境等。
Kubernetes 的系统架构如图所示。
Master 节点主要由 apiserver 、 controller - manager 和 scheduler 三个组件,以及一个用于集群状态存储的 etcd 存储服务组成,而每个 Node 节点则主要包含 kubelet 、 kube - proxy 及容器引擎( Docker 是最为常用的实现)等组件。
此外,完整的集群服务还依赖于一些附加组件,如 KubeDNS 等。
Kubernetes 的集群控制平面由多个组件组成,这些组件可统一运行于单一 Master 节点也可以以多副本的方式同时运行于多个节点,以为 Master 提供高可用功能,甚至还可以运行于 Kubernetes 集群自身之上。
Master 主要包含以下几个组件。
API Server 负责输出 RESTFUL 风格的 KubernetesAPI ,它是发往集群的所有 REST 操作命令的接入点,并负责接收、校验并响应所有的 REST 请求,结果状态被持久存储于 etcd 中。
因此, APIServer 是整个集群的网关。
Kubernetes 集群的所有状态信息都需要持久存储于存储系统 etcd 中,不过, etcd 是由 Cores 基于 Raft 协议开发的分布式键值存储,可用于服务发现、共享配置以及一致性保障(如数据库主节点选择、分布式锁等)。
因此, etcd 是独立的服务组件,并不隶属于 Kubernetes 集群自身。 生产环境中应该以 etcd 集群的方式运行以确保其服务可用性。
etcd 不仅能够提供键值数据存储,而且还为其提供了监听( Watch )机制,用于监听和准送变更。
Kubernetes 集群系统中, etcd 中的键值发生变化时会通知到 APIServer ,并由其通过 watchAPI 向客户端输出。
基于 Watch 机制, Kubernetes 集群的各组件实现了高效协同。
Kubernetes 中,集群级别的大多数功能都是由几个被称为控制器的进程执行实现的,这几个进程被集成于 kube - controller - manager 守护进程中。
由控制器完成的功能主要包括生命周期功能和 API 业务逻辑,具体如下。
Kubernetes 是用于部署和管理大规模容器应用的平台,根据集群规模的不同,其托管运行的容器很可能会数以千计甚至更多。
API Server 确认 Pod 对象的创建请求之后,便需要由 Scheduler 根据集群内各节点的可用资源状态,以及要运行的容器的资源需求做出调度决策。
另外, Kubernetes 还支持用户自定义调度器。
Node 负责提供运行容器的各种依赖环境,并接受 Master 的管理。
每个 Node 主要由以下几个组件构成。
kubelet 是运行于工作节点之上的守护进程,它从 APIServer 接收关于 Pod 对象的配置信息并确保它们处于期望的状态( desired state )。
kubelet 会在 APIServer 上注册当前工作节点,定期向 Master 汇报节点资源使用情况,并通过 advisor 监控容器和节点的资源占用状况。
每个 Node 都要提供一个容器运行时( Container Runtime )环境,它负责下载镜像并运行容器。
kubelet 并未固定链接至某容器运行时环境,而是以插件的方式载入配置的容器环境。
这种方式清晰地定义了各组件的边界。 目前, Kubernetes 支持的容器运行环境至少包括 Docker 、 RKT 、 cri - o 和 Fraki 等。
每个工作节点都需要运行一个 kube - proxy 守护进程,它能够按需为 Service 资源对象生成 iptables 或 ipvs 规则,从而捕获访问当前 Service 的 Cluster 的流量并将其转发至正确的后端Pod对象。
Kubernetes 集群还依赖于一组称为“附件”( ad - ons )的组件以提供完整的功能,它们通常是由第三方提供的特定应用程序,且托管运行于 Kubernetes 集群之上。
下面列出的几个附件各自为集群从不同角度引用了所需的核心功能。