【K8s 精选】Kubernetes 架构总览
1 Kubernetes 架构概览
Kubernetes 核心组件包括 Master 节点的 apiserver、controller-manager、scheduler,Node 节点的 kubelet、kube-proxy、Container runtime,还有分布式键值( key-value) 数据库 etcd。
Kubernetes 简化架构.pngimage.png① apiserver:操作资源的唯一入口,并提供认证、授权、访问控制、API 注册和发现等机制。
② controller-manager:维护集群的状态,例如故障检测、自动扩展、滚动更新等。
③ scheduler:资源的调度,根据预设的调度策略把 Pod 调度到相应的宿主机(Node)上。
④ kubelet:维持容器的生命周期,管理 Volume(CVI)和 Network(CNI)。
⑤ kube-proxy:为 Service 提供集群内部的服务发现和负载均衡,其中 Service 是为一组功能相同 Pods,提供统一的入口。
⑥ etcd:强一致性、高可用的键值数据库,可以持久化集群状态,同时具有消息发布与订阅的功能。
2 Master 简介
Master 主节点负责管理和控制整个 Kubernetes 集群。Master 主要包含的组件是 apiserver、controller-manager 和 scheduler。
2.1 apiserver
apiserver 称为 Kubernetes API Server,提供如下功能:
① 提供集群管理的 REST API 接口,包括创建/更新/删除资源、认证授权、数据校验以及集群状态变更等。
② 提供其它模块之间的数据交互和通信的枢纽。注意:只有 apiserver 才直接操作 etcd。
2.2 controller-manager
controller-manager 由 controller-manager 和 cloud-controller-manager 组成,是 Kubernetes 的大脑,它通过 apiserver 监控整个集群的状态,并确保集群处于预期的工作状态。
controller-manager.JPGcontroller-manager 控制器分类:
● Replication Controller
● Node Controller
● Deployment Controller
● Endpoint Controller
● Namespace Controller
● Job Controller
● Service Controller
● StatefulSet Controller
2.3 scheduler
scheduler 负责分配调度 Pod 到集群内的 Node 节点上。它通过监听 apiserver,查询还未分配 Node 的 Pod,然后根据调度策略为这些 Pod 分配节点,然后更新 Pod 的 NodeName 字段。
调度器的考虑因素:公平调度、资源高效利用、affinity 和 anti-affinity、数据本地化等。
scheduler 调度原理:
For given pod:
+---------------------------------------------+
| Schedulable nodes: |
| |
| +--------+ +--------+ +--------+ |
| | node 1 | | node 2 | | node 3 | |
| +--------+ +--------+ +--------+ |
| |
+-------------------+-------------------------+
|
|
v
+-------------------+-------------------------+
Pred. filters: node 3 doesn't have enough resource
+-------------------+-------------------------+
|
|
v
+-------------------+-------------------------+
| remaining nodes: |
| +--------+ +--------+ |
| | node 1 | | node 2 | |
| +--------+ +--------+ |
| |
+-------------------+-------------------------+
|
|
v
+-------------------+-------------------------+
Priority function: node 1: p=2
node 2: p=5
+-------------------+-------------------------+
|
|
v
select max{node priority} = node 2
scheduler 调度分为两个阶段,predicate 和 priority
① predicate:过滤不符合条件的节点
② priority:优先级排序,选择优先级最高的节点
3 Node 简介
Node 节点是 Kubernetes 集群中的工作负载节点,Node 上的工作负载由 Master 分配。当某个 Node 宕机时,Master 会将该节点的工作负载转移到其他节点上去。Node 节点运行的主要有 kubelet、kube-proxy。
3.1 kubelet
每个 Node 节点都运行一个 kubelet 服务进程,它通过监听 10250 端口,接收并执行 Master 发来的指令。每个 Kubelet 进程会在 apiserver 上注册所在 Node 节点的信息,定期向 Master 上报该节点的资源使用情况,并通过 cAdvisor 监控节点和容器的资源。
kubelet 的主要功能:
① 节点管理:通过 apiserver 创建和管理节点资源
② Pod 管理和 cAdvisor 资源监控:使用配置启动 Pod,并持续把运行中 Pod 的状态、事件和资源消耗信息发送给 apiserver
(1)节点管理
节点管理主要的功能是节点自注册、节点状态更新。
① 节点自注册:设置启动参数 --register-node 来确定是否向 apiserver 注册自己
② 节点状态更新:kubelet 在启动时通过 apiserver 注册节点信息,并定时向 apiserver 发送节点新消息,apiserver 在接收到新消息后,将信息写入 etcd
(2)Pod 管理
Pod 管理主要有 Pod 清单获取、创建和修改 Pod。
① Pod 清单获取:kubelet 通过 apiserver 获取 PodSpecs,并确保这些 PodSpecs 中描述的 Pod 正常健康运行。
② 创建和修改 Pod:kubelet 通过 Watch-List 方式监听 etcd,如果有创建和修改 Pod 任务,则会有相关操作。
(3)cAdvisor 资源监控
Kubelet 通过 cAdvisor 获取其所在节点及容器的数据。
cAdvisor 是一个开源的分析容器资源使用率和性能特性的代理工具。它集成到 kubelet 中,当 kubelet 启动时会同时启动cAdvisor,且一个 cAdvisor 只监控一个 Node 节点的信息。cAdvisor 自动查找所有在其所在节点上的容器,自动采集 CPU、内存、文件系统和网络使用的统计信息。cAdvisor 通过它所在节点机的 Root 容器,采集并分析该节点机的全面使用情况。
(4)容器运行时
容器运行时插件(Container Runtime Interface,简称 CRI)是 Kubernetes 容器运行时接口,它将 Kubelet 与容器运行时解耦,将原来完全面向 Pod 级别的内部接口拆分成面向 Sandbox 和 Container 的 gRPC 接口,并将镜像管理和容器管理分离到不同的服务。
image.pngKubelet 架构
image.pngPod 启动流程示例
image.png3.2 kube-proxy
每个 Node 节点都运行一个 kube-proxy 服务进程,它通过监听 apiserver 中 service 和 endpoint 的变化情况,利用 iptables 的方式实现通信和负载均衡。
iptables示例.JPG