Kubernetes 整体架构

从整体来看 Kubernetes (k8s) 主要由两种节点组成,分别是 Master 节点和 Node 节点,其整体结构如图1 所示。Master 节点由三个紧密协作的独立组件组合而成,分别是:kube-apiserver、kube-scheduler 以及 kube-controller-manager;Node 节点上最核心的是名为 kubelet 的组件以及 kube-proxy。下面结合图1 对一些组件的功能进行说明。

图1. kubernetes (k8s) 整体架构图(来源于网络)

核心组件

kubectl & cliet-go

kubectl 是 k8s 官方提供的命令行工具,它通过 HTTP/JSON 通信协议以命令行的方式来与 kube-apiserver 交互。

client-go 则是通过编程的方式来与 API server 进行交互,使开发者能够以编程的方式管理和操作集群中的资源,它实现的功能与 kubectl 相同。k8s 的其他组件与 api server 进行通信也是基于 client-go 实现的。如果需要对 k8s 进行二次开发,也可以使用 client-go。

Master 节点核心组件

kube-apiserver

Kube-apiserver 主要负责 API 服务,集群中所有的组件都是通过 API server 组件来操作资源对象,它也是集群中唯一与 ETCD 集群进行交互的核心组件。k8s 中所有的资源对象被封装成 RESTful 风格的 API 接口进行管理。同时,API server 还提供了集群的安全访问机制,如认证、授权、准入控制、审计等。

kube-controller-manager

kube-controller-manager 主要负责容器的编排,确保 k8s 系统的实际状态收敛到所需状态。它的核心就是我们常说的 k8s 控制器模式,通常会用下面的 go 风格的伪代码进行描述,而在 k8s 项目中它实际上就是一系列控制器的集合.

for {
    actualState := 获取集群中对象的实际状态 (Actual State)
    expectedState := 获取集群中对象的期望状态 (Desired State)
    if actualState == expectedState {
        // 什么都不做
    } else {
        // 执行编排动作,将实际状态调整为期望状态
    }
}
$ cd pkg/controller/
$ ls
OWNERS                          doc.go                          replication
apis                            endpoint                        resourceclaim
bootstrap                       endpointslice                   resourcequota
certificates                    endpointslicemirroring          serviceaccount
clusterroleaggregation          garbagecollector                statefulset
controller_ref_manager.go       history                         storageversiongc
controller_ref_manager_test.go  job                             testutil
controller_utils.go             namespace                       ttl
controller_utils_test.go        nodeipam                        ttlafterfinished
cronjob                         nodelifecycle                   util
daemon                          podautoscaler                   validatingadmissionpolicystatus
deployment                      podgc                           volume
disruption                      replicaset
$

kube-controller-manager 在集群中具备高可用性,它采用多实例部署,基于Etcd集群上的分布式锁实现领导者选举机制,多实例同时运行。

kube-scheduler

kube-scheduler 主要负责调度,是集群的默认调度器,它为 pod 资源对象找到合适的节点并调度执行。谈到调度,必然离不开调度算法,k8s 的调度器在进行调度决策时通常会分为预选调度算法和优选调度算法,同时它还支持优先级调度、抢占机制以及亲和性调度等。

与 controller manager 相似,scheduler 同样支持高可用性。

Node节点核心组件

kubelet

kubelet 是 Node 节点上最核心的组件,用于管理节点。一方面它充当了节点的代理角色,与 api server 进行通信,接收、处理、上报 kube-apiserver 组件下发的任务;另一方面,kubelet 主要负责所在 Node 上的 Pod 资源对象的管理,例如 Pod 资源对象的创建、修改、监控、删除、驱逐及Pod生命周期管理等。

Kubelet 组件开放了 3 种接口,分别是:Container Runtime Interface (CRI)、Container Network Interface (CNI) 以及 Container Storage Interface(CSI) 。CRI 定义了容器运行时的各项核心操作,提供容器运行时通用插件接口服务;CNI 是容器网络接口,提供了网络插件接口服务,而 CSI 则是容器存储接口,提供存储通用插件接口服务。

kube-proxy

kube-proxy 运行在每个 Node 节点上,负责维护节点上的网络代理和负载均衡。kube-proxy 监控 kube-apiserver 的服务和端点资源变化 (服务发现),并通过 iptables/ipvs 等配置负载均衡器(负载均衡),为一组 Pod 提供统一的 TCP/UDP 流量转发和负载均衡功能。