本文关于 Kubernetes 架构的综合指南旨在通过插图详细解释每个 Kubernetes 组件。
以下 Kubernetes 架构图显示了 Kubernetes 集群的所有组件以及外部系统如何连接到 Kubernetes 集群。
关于 Kubernetes,应该了解的第一件事是,它是一个分布式系统。即它有多个组件分布在网络上的不同服务器上。这些服务器可以是虚拟机或裸机服务器。我们称之为 Kubernetes 集群。
Kubernetes 集群由控制平面节点和工作节点组成。
控制平面负责容器编排和维护集群的所需状态。它具有以下组件。
Worker 节点负责运行容器化应用程序。worker 节点具有以下组件。
首先看一下每个控制平面组件以及每个组件背后的重要概念。
kube-api 服务器是公开 Kubernetes API 的 Kubernetes 集群的中心枢纽。
最终用户和其他集群组件通过 API 服务器与集群通信。在极少数情况下,监控系统和第三方服务可能会与 API 服务器通信以与集群进行交互。
因此,当使用 kubectl 管理集群时,在后端实际上是通过 HTTP REST API 与 API 服务器进行通信。但是,内部集群组件(如调度程序、控制器等)使用 gRPC 与 API 服务器通信。
API 服务器与集群中的其他组件之间的通信通过 TLS 进行,以防止对集群进行未经授权的访问。
Kubernetes api-server 负责以下工作:
注意:为了减少群集攻击面,保护 API 服务器至关重要。Shadowserver 基金会进行了一项实验,发现了 380,000 个可公开访问的 Kubernetes API 服务器。
Kubernetes 是一个分布式系统,它需要一个高效的分布式数据库,如 etcd 来支持其分布式性质。它既充当后端服务发现,又充当数据库。可以称它为 Kubernetes 集群的大脑。
etcd 是一个开源的强一致性分布式键值存储。那么这意味着什么呢?
etcd 使用 raft 共识算法,具有很强的一致性和可用性。它以领导者-成员的方式工作,以实现高可用性并承受节点故障。
那么 etcd 是如何与 Kubernetes 一起工作的呢?简单地说,当使用 kubectl 获取 kubernetes 对象详细信息时,是从 etcd 获取的。此外,当部署像 pod 这样的对象时,会在 etcd 中创建一个条目。
需要了解的有关 etcd 的信息:
此外,etcd 它是控制平面中唯一的 Statefulset 组件。
kube-scheduler 负责在工作节点上调度 Kubernetes Pod。
部署容器时,可以指定容器要求,例如 CPU、内存、关联性、污点或容错、优先级、持久卷 (PV) 等。调度程序的主要任务是识别创建请求,并为满足要求的 Pod 选择最佳节点。
下图显示了调度程序工作原理的高级概述。
在 Kubernetes 集群中,将有多个工作节点。那么调度程序是如何从所有工作节点中选择节点的呢?
下面是调度程序的工作原理:
相关调度程序的说明:
什么是控制器? 控制器是运行无限控制循环的程序,即它连续运行并监视对象的实际和所需状态。如果实际状态和期望状态存在差异,则确保 kubernetes 资源/对象处于期望状态。
官方文件的描述:在 Kubernetes 中,控制器是监视集群状态的控制循环,然后在需要时进行更改或请求更改。每个控制器都尝试将当前集群状态移近所需状态。
假设要创建部署,在清单 YAML 文件中指定所需的状态(声明性方法)。例如,2 个副本、1 个卷挂载、configmap 等。内置的部署控制器可确保部署始终处于所需状态。如果用户使用 5 个副本更新部署,则部署控制器会识别它并确保所需的状态为 5 个副本。
Kube 控制器管理器是管理所有 Kubernetes 控制器的组件。Kubernetes 资源/对象(如 Pod、命名空间、作业、副本集)由各自的控制器管理。此外,Kube 调度器也是由 Kube 控制器管理器管理的控制器。
重要的内置 Kubernetes 控制器列表。
需要了解的有关 Kube 控制器管理器的信息:
在云环境中部署 kubernetes 时,云控制器管理器充当云平台 API 和 Kubernetes 集群之间的桥梁。
这样,核心 kubernetes 核心组件可以独立工作,并允许云提供商使用插件与 kubernetes 集成。(例如,kubernetes 集群和 AWS 云 API 之间的接口)
云控制器集成允许 Kubernetes 集群预置云资源,例如实例(用于节点)、负载均衡器(用于服务)和存储卷(用于持久卷)。
云控制器管理器包含一组特定于云平台的控制器,可确保特定于云的组件(节点、负载均衡器、存储等)处于所需状态。以下是云控制器管理器中的三个主要控制器:
云控制器管理器的一些经典示例:
一句话:Cloud Controller Manager 管理 Kubernetes 使用的云特定资源的生命周期。
现在看一下每个工作节点组件。
Kubelet 是一个 Agent 组件,运行在集群中的每个节点上。t 不作为容器运行,而是作为守护程序运行,由 systemd 管理。
它负责向 API 服务器注册工作节点,并主要从 API 服务器使用 podSpec(Pod 规范 – YAML 或 JSON)。podSpec 定义了应在 Pod 内运行的容器、它们的资源(例如 CPU 和内存限制)以及其他设置,例如环境变量、卷和标签。然后,它通过创建容器将 podSpec 带到所需状态。
简单地说,kubelet 负责以下工作:
Kubelet 也是一个控制器,它监视 Pod 的变化,并利用节点的容器运行时来拉取镜像、运行容器等。
除了来自 API 服务器的 PodSpec 之外,kubelet 还可以接受来自文件、HTTP 端点和 HTTP 服务器的 podSpec。“来自文件的 podSpec”的一个很好的例子是 Kubernetes 静态 pod。
静态 Pod 由 kubelet 控制,而不是由 API 服务器控制。即可以通过向 Kubelet 组件提供 Pod YAML 位置来创建 Pod。但是,Kubelet 创建的静态 Pod 不受 API 服务器的管理。
静态 Pod 的真实示例用例:在引导控制平面时,kubelet 从位于pod/etc/kubernetes/manifests的 podSpecs 的静态 pod 启动 api-server、scheduler 和控制器管理器。
kubelet 的一些关键内容:
要了解 Kube 代理需要对 Kubernetes 服务和端点对象有基本的了解。
Kubernetes 中的服务是一种在内部或向外部流量公开一组 Pod 的方法。创建服务对象时,它会为其分配一个虚拟 IP。它被称为 clusterIP。它只能在 Kubernetes 集群中访问。
Endpoint 对象包含 Service 对象下 Pod 组的所有 IP 地址和端口。端点控制器负责维护容器 IP 地址(端点)列表。服务控制器负责为服务配置终结点。
无法 ping ClusterIP,因为它仅用于服务发现,这与可 ping 的 Pod IP 不同。
现在让我们了解一下 Kube Proxy。Kube-proxy 是一个守护进程,它作为守护进程集在每个节点上运行。它是一个代理组件,用于实现 Pod 的 Kubernetes 服务概念。(具有负载均衡功能的一组 Pod 的单个 DNS)。它主要代理 UDP、TCP 和 SCTP,不理解 HTTP。
当使用 Service (ClusterIP) 公开 Pod 时,Kube-proxy 会创建网络规则,将流量发送到 Service 对象下分组的后端 Pod(端点)。即所有负载均衡和服务发现都由 Kube 代理处理。
那么 Kube-proxy 是如何工作的呢?
Kube 代理与 API 服务器通信,以获取有关服务 (ClusterIP) 和相应 Pod IP 和端口(端点)的详细信息。它还监视服务和终结点的更改。然后,kube-proxy 使用以下任一模式创建/更新规则,将流量路由到 Service 后面的 Pod。
此外,可以通过将 Kubernetes 集群替换为 Cilium 来运行没有 kube-proxy 的 Kubernetes 集群。
Kubeproxy 有一个基于 nftables 的新后端。nftables 是 IPtables 的继任者,旨在更简单、更高效。
如果了解 Java 运行时 (JRE)。它是在主机上运行 Java 程序所需的软件。同样,容器运行时是运行容器所需的软件组件。
容器运行时在 Kubernetes 集群中的所有节点上运行。它负责从容器注册表中提取映像、运行容器、分配和隔离容器资源,以及管理主机上容器的整个生命周期。
为了更好地理解这一点,让我们看一下两个关键概念:
Kubernetes 支持多个符合容器运行时接口 (CRI) 的容器运行时(CRI-O、Docker 引擎、containerd 等)。即所有这些容器运行时都实现了 CRI 接口,并公开了 gRPC CRI API(运行时和图像服务端点)。
那么 Kubernetes 是如何利用容器运行时的呢?
正如在 Kubelet 部分所了解的,kubelet 代理负责使用 CRI API 与容器运行时进行交互,以管理容器的生命周期。它还从容器运行时获取所有容器信息,并将其提供给控制平面。
以 CRI-O 容器运行时接口为例。下面是容器运行时如何与 Kubernetes 配合使用的高级概述。
除了核心组件之外,kubernetes 集群还需要附加组件才能完全运行。选择插件取决于项目要求和用例。
以下是集群上可能需要的一些常用插件组件:
首先需要了解容器网络接口 (CNI)。它是一个基于插件的架构,具有供应商中立的规范和库,用于为容器创建网络接口。
它不是特定于 Kubernetes 的。借助 CNI,容器网络可以在 Kubernetes、Mesos、CloudFoundry、Podman、Docker 等容器编排工具之间实现标准化。
在容器网络方面,公司可能有不同的要求,例如网络隔离、安全性、加密等。随着容器技术的进步,许多网络提供商为具有广泛网络功能的容器创建了基于 CNI 的解决方案。可以称它为CNI-Plugins
这允许用户从不同的提供商处选择最适合其需求的网络解决方案。
CNI 插件如何与 Kubernetes 配合使用?
CNI 插件提供的高级功能:
流行的 CNI 插件包括:
到目前为止,已经了解了核心 kubernetes 组件以及每个组件的工作原理。所有这些组件都致力于管理以下关键 Kubernetes 对象。
此外,Kubernetes 可以使用 CRD 和自定义控制器进行扩展。因此,群集组件还管理使用自定义控制器和自定义资源定义创建的对象。
(1)Kubernetes 控制平面的主要用途是什么?
控制平面负责维护集群及其上运行的应用程序的所需状态。它由 API 服务器、etcd、调度程序和控制器管理器等组件组成。
(2)Kubernetes 集群中工作节点的用途是什么?
工作器节点是在群集中运行容器的服务器(裸机或虚拟)。它们由控制平面管理,并从控制平面接收有关如何运行属于 Pod 的容器的指令。
(3)如何在 Kubernetes 中保护控制平面和工作节点之间的通信?
控制平面和工作节点之间的通信使用 PKI 证书进行保护,不同组件之间的通信通过 TLS 进行。这样,只有受信任的组件才能相互通信。
(4)Kubernetes 中 etcd 键值存储的目的是什么?
Etcd 主要存储集群的 kubernetes 对象、集群信息、节点信息以及集群的配置数据,例如集群上运行的应用程序的期望状态。
(5)如果 etcd 宕机,Kubernetes 应用程序会发生什么?
虽然如果 etcd 遇到中断,正在运行的应用程序不会受到影响,但如果没有正常运行的 etcd,将无法创建或更新任何对象。
了解 Kubernetes 架构有助于进行日常 Kubernetes 实施和操作。在实施生产级群集设置时,对 Kubernetes 组件有正确的了解将有助于运行应用程序并对其进行故障排除。