一个 Kubernetes 集群由两个主要组件组成:
- 控制平面节点
- 工作节点
控制平面
控制平面是 Kubernetes 集群的“大脑”,它协调和编排各种组件,以确保系统的期望状态得以实现和维护。控制平面进一步包括以下组件:
1. Kube-API 服务器
API 服务器是控制平面的中央管理点,它暴露 Kubernetes API,客户端可以使用该 API 与集群进行交互。因此,当我们使用 kubectl 管理集群时,实际上是通过 HTTP REST API 与 API 服务器进行通信。kube-api 服务器负责以下任务:
- API 管理:公开集群 API 端点并处理所有 API 请求。
- 身份验证(使用客户端证书、令牌和 HTTP 基本身份验证)和授权(ABAC 和 RBAC 评估)。
- 处理 API 对象(如 pod、service 等)的API 请求和数据验证。
- 与 etcd 通信以存储状态和配置。
- API 服务器协调控制平面和工作节点组件之间的所有进程。
2. etcd
etcd 是 Kubernetes 使用的分布式键值存储,用于存储集群的配置数据和资源的期望状态。Kube-API 服务器使用 etcd 的观察功能来跟踪对象状态的更改。它是控制平面中的唯一有状态组件,负责以下任务:
- 作为集群的唯一真相来源,确保一致性和数据持久性。
- 充当后端服务发现和数据库。
- 存储 Kubernetes 对象(如 pod、secret、daemon set、deployment、config map、stateful set 等)的所有配置、状态和元数据。
- 在键值对格式的 /registry 目录键下存储所有对象。例如,在默认命名空间下名为 Nginx 的 pod 的信息可以在 /registry/pods/default/nginx 下找到。
3. Kube-scheduler
Kube-scheduler 负责在工作节点上调度 pod。当我们创建一个 pod 并将其提交到 API 服务器时,调度程序会自动获取 pod,根据可用资源和调度规则评估节点,并将 pod 分配给适当的节点。
- 根据约束和可用资源确定每个 pod 在调度队列中的有效放置节点。
- 然后,调度程序对每个有效节点进行排名,并将 pod 绑定到合适的节点。集群中可以使用多个不同的调度程序;kube-scheduler 是参考实现。
- 当我们部署一个 pod 时,我们指定了 pod 的要求,如CPU、内存、亲和性、污点或容忍性、优先级、持久卷等。
- Kubernetes 允许用户使用自定义调度程序配置来开发自己的自定义调度程序。
4. Kube Controller 管理器
kube-controller-manager 是一个关键组件,运行着负责维护集群的期望状态和管理系统不同方面的各种控制器。
每个控制器关注于集群管理的特定领域,自动化任务,确保资源的实际状态与期望状态相匹配。
以下是重要的内置 Kubernetes 控制器列表:
- Node Controller:负责监控集群中的节点状态。它会检测节点故障并启动操作以替换失败的节点或将 pod 重新调度到健康的节点。
- Replication Controller:确保 pod 的指定副本数始终运行。根据需要创建或终止 pod 以维护所需的副本计数。
- Deployment Controller:扩展了 Replication Controller 的功能,允许您以声明性方式定义和管理应用程序部署。它支持滚动更新、回滚和扩展。
- StatefulSet Controller:通过确保稳定和有序的扩展和升级,管理有状态应用程序。它为每个 pod 分配唯一的网络标识,并在重新调度时保持其标识。
- **Daemon
Set Controller**:确保在所有或一部分节点上运行特定 pod 的副本。通常用于任务,如节点监视代理或网络组件。
- Job Controller:管理批处理作业,确保特定任务或作业的完成次数达到了指定的要求。
- CronJob Controller:允许您使用类似于 cron 的语法在指定间隔内调度任务。它根据定义的计划创建作业。
- Namespace Controller:确保集群中的每个命名空间都具有一组相应的资源,并强制资源隔离。
- Service Account 和 Token Controller:自动为命名空间中的 pod 创建默认帐户和访问令牌。
- Service Controller:监视服务和端点,并根据创建、删除或重新调度 pod 的情况更新它们。
- Endpoint Controller:维护 endpoint 对象,根据标签选择器将服务与 pod 匹配。
5. 云控制器管理器 (CCM)
当 Kubernetes 部署在云环境中时,云控制器管理器充当 Kubernetes 集群和云平台 API 之间的桥梁。它管理 Kubernetes 使用的云特定资源的生命周期。
(1)它从主 Kubernetes 控制平面中卸载了云特定的控制循环和功能,减少了其复杂性,使其更易于维护和扩展。
(2)它托管各种云特定控制器,负责管理特定于云提供商的资源。这些控制器包括:
- Node Controller:管理 Kubernetes 节点与云实例之间的交互,处理节点的生命周期操作,如创建、删除和调整大小。
- Route Controller:处理服务的云特定网络配置,例如创建负载均衡器或管理 IP 地址。
- Volume Controller:与云存储服务集成,以云特定方式提供和管理持久卷。
- Service Controller:与云提供商的负载均衡器服务互动,以创建、管理和更新 Kubernetes 服务的负载均衡器。
(3)CCM 管理云资源,确保它们与 Kubernetes 资源定义的期望状态相匹配。例如,它可能根据缩放要求创建或释放云实例。
(4)它与云提供商的 API 进行通信,执行操作,例如创建实例、配置网络、管理存储资源等。
(5)它确保适当管理安全设置和凭据,与云服务交互时进行管理。
工作节点
工作节点负责运行容器化应用程序。它包括以下组件。
- kubelet
- kube-proxy
- 容器运行时
1. Kubelet
Kubelet 是 Kubernetes 控制平面和节点上运行的容器之间的关键桥梁,确保集群的期望状态得以实现和维护。
它在集群中的每个节点上运行一个代理组件,以将节点的状态和资源利用率报告给 Kubernetes 控制平面。它不以容器形式运行,而是由 systemd 管理的守护程序。
以下是 kubelet 的主要功能和职责:
- 节点代理:kubelet 充当每个节点上的代理,将节点的状态和容器的健康状况报告给 Kubernetes 控制平面。
- 健康监控:kubelet 连续监控 pod 中的容器的健康状况。如果容器崩溃或变得不健康,kubelet 会采取适当的措施,如重新启动容器或整个 pod。
- Pod 管理:kubelet 管理节点上 pod 的状态。它确保根据从 Kubernetes API 服务器接收的 pod 定义,指定的 pod 正在运行且健康。
- Pod 网络:kubelet 与网络插件协作,为节点上的 pod 设置网络。它为 pod 分配 IP 地址,并确保容器可以相互通信以及与外部世界通信。
- 卷管理:kubelet 管理 pod 定义中指定的卷,根据需要附加和分离卷。它确保数据持久性并允许容器访问共享存储。
- 资源管理:kubelet 强制执行 pod 定义中指定的资源约束,确保容器不会超出分配的 CPU 和内存限制。它还处理对 CPU 和内存等资源的请求。
- 驱逐和清理:当节点上的资源变得稀缺时,kubelet 可以根据预定义的策略从 pod 中驱逐 pod,以释放资源。它还在 pod 终止时清理任何剩余的资源。
- 节点注册:kubelet 向 Kubernetes 控制平面注册节点,使控制平面能够知道可用于调度 pod 的节点。
2. Kube 代理
Kube 代理,即 Kubernetes 代理,是运行在 Kubernetes 集群中每个节点上的网络代理。其主要功能是管理 pod 和服务之间的网络通信,为容器化应用程序提供可靠和一致的网络环境。它负责以下任务:
- 服务发现:Kube 代理负责在集群内启用服务发现。它根据服务规范中定义的标签和选择器,维护网络规则,将请求从服务转发到适当的 pod。
- 负载均衡:Kube 代理为具有多个副本或实例的服务实施负载均衡。它将传入请求分发给与服务的选择条件相匹配的可用 pod。
- 网络地址转换(NAT):Kube 代理对出站流量执行网络地址转换(NAT)。这确保来自 pod 的流量看起来是从主机的 IP 地址发出的,从而允许外部系统正确响应。
- ClusterIP 服务:对于 ClusterIP 服务(仅在集群内部可访问),Kube 代理设置 IPTables 规则,将流量转发到根据其标签选择器匹配的正确 pod。
- NodePort 服务:Kube 代理配置主机的防火墙,以将传入流量转发到 NodePort 服务的适当 pod。这允许使用每个节点上的静态端口外部访问服务。
- 高可用性:Kube 代理致力于确保服务的高可用性。如果 pod 不可用或添加/删除了,Kube 代理会自动更新网络配置以正确路由流量。
- 健康检查:Kube 代理监视与服务相关的端点和 pod 的健康状况。如果 pod 变得不健康,Kube 代理停止转发流量。
3. 容器运行时
容器运行时环境负责根据 pod 规范创建、启动、停止和管理容器。
一些常用的 Kubernetes 容器运行时包括 Docker、containerd、CRI-O、rkt(发音为 "rocket")等。
- 容器管理:容器运行时环境负责根据 pod 定义创建、启动、停止和管理容器。
- 镜像管理:它根据 pod 定义中指定的镜像引用从容器仓库(如 Docker Hub、Google Container Registry 等)拉取容器镜像。
- 资源隔离和管理:运行时环境确保容器根据其 pod 配置中指定的 CPU、内存和其他资源拥有适当的资源级别。
- 网络和通信:它设置容器的网络,确保它们可以相互通信以及与集群内外的服务通信。这可能涉及配置网络命名空间、IP 地址和端口映射。
- 容器安全性:运行时环境通过强制容器之间的隔离,防止它们访问彼此的文件系统或资源。它还可能实施其他安全措施,如 AppArmor 或 SELinux。
- 卷和存储管理:运行时环境管理附加到容器的卷,确保数据持久性并允许容器访问共享存储。
- 生命周期管理:它处理容器的完整生命周期,包括启动、停止、重启和清理容器。
- 健康监控和重启:运行时环境监视容器的健康状况,并可以自动重启崩溃或变得不健康的容器。
- 与硬件和内核的交互:运行时环境与主机操作系统的内核进行交互,管理容器资源使用、网络命名空间、进程隔离和其他低级操作。
Kubernetes 的架构促进了分布式微服务导向的方法,使开发人员可以专注于应用程序逻辑,而平台负责部署、扩展和负载均衡。
无论是在本地、云中还是混合环境中,Kubernetes 的架构使组织能够高效地管理复杂的容器化工作负载,同时秉承模块化、抽象和自动化的原则。