第 4 章 OpenShift Container Platform control plane

4.1. 了解 OpenShift Container Platform control plane

control plane 由 control plane 机器(也称为 master 机器)组成,用于管理 OpenShift Container Platform 集群。control plane 机器管理计算机器(也被称为 worker)上的工作负载。集群本身通过Cluster Version Operator、Machine Config Operator 和一组单独 Operator 的操作来管理对机器的所有升级。

4.1.1. 使用机器配置池进行节点配置管理

运行 control plane 组件或用户工作负载的机器会根据其处理的资源类型划分为组。这些机器组称为机器配置池(MCP)。每个 MCP 管理一组节点及其对应的机器配置。节点的角色决定了它所属的 MCP ; MCP 会根据其分配的节点角色标签管理节点。MCP 中的节点具有相同的配置 ; 这意味着节点可以扩展并缩减,以适应增加或降低的工作负载。

默认情况下,在安装时集群创建两个 MCP:masterworker。每个默认 MCP 都有一个定义的配置,由 Machine Config Operator(MCO)应用,该配置负责管理 MCP 有助于 MCP 升级。您可以创建额外的 MCP 或自定义池来管理具有超出默认节点类型的自定义用例的节点。

自定义池是从 worker 池中继承其配置的池。它们将任何机器配置用于 worker 池,但添加了仅针对自定义池部署更改的能力。由于自定义池从 worker 池继承其配置,对 worker 池的任何更改都会应用到自定义池。MCO 不支持从 worker 池中继承其配置的自定义池。

注意

节点只能包含在一个 MCP 中。如果节点有多个与多个 MCP 对应的标签,如 worker,infra,它由 infra 自定义池而不是 worker 池管理。自定义池根据节点标签在选择节点时具有优先权。不属于自定义池的节点由 worker 池管理。

建议您为集群中要管理的每个节点角色创建一个自定义池。例如,如果您创建 infra 节点来处理 infra 工作负载,建议创建一个自定义 infra MCP 将那些节点分组在一起。如果您将 infra 角色标签应用到 worker 节点,使其具有 workerinfra dual 标签,但没有自定义 infra MCP,则 MCO 认为它是一个 worker 节点。如果您从节点中删除 worker 标签,并应用 infra 标签而不将其分组到自定义池中,则该节点不可被 MCO 识别,且不受集群管理。

重要

任何使用 infra 角色标记的节点如果只运行 infra 工作负载,则不计算到订阅总数中。管理 infra 节点的 MCP 与集群决定订阅的方式相互排斥 ; 为节点添加适当 infra 角色的标签,并使用污点以防止用户工作负载调度到该节点上,这是避免为 infra 工作负载添加订阅的唯一要求。

MCO 独立应用池更新。例如,如果有会影响所有池的更新,则每个池更新中的节点会相互并行。如果您添加自定义池,则该池中的节点还会尝试与 master 和 worker 节点同时更新。

4.1.2. OpenShift Container Platform 中的机器角色

OpenShift Container Platform 为主机分配不同的角色。这些角色定义机器在集群内的功能。集群包含标准 master 和 worker 角色类型的定义。

注意

集群还包含 bootstrap 角色的定义。由于 bootstrap 机器仅在集群安装期间使用,因此其功能在集群安装文档中阐述。

4.1.2.1. control plane 和节点主机兼容性

control plane 主机和节点主机之间的 OpenShift Container Platform 版本必须匹配。例如,在一个 4.9 集群中,所有 control plane 主机都必须是 4.9,所有节点也必需是 4.9。

可以接受集群升级过程中的临时不匹配。例如,当从 OpenShift Container Platform 4.8 升级到 4.9 时,一些节点将在其他节点之前升级到 4.9。control plane 主机和节点主机的长期偏移可能会暴露旧计算机器给错误和缺失的功能。用户应该尽快解决偏移的 control plane 主机和节点主机。

kubelet 服务不能更新于 kube-apiserver,且可能会有最多两个旧的次版本,具体取决于 OpenShift Container Platform 版本是否奇数甚至更低。下表显示了适当的版本兼容性:

OpenShift Container Platform 版本支持的 kubelet skew

奇异的 OpenShift Container Platform 次版本 [1]

最多一个版本

甚至 OpenShift Container Platform 次要版本 [2]

最多两个版本

  1. 例如,OpenShift Container Platform 4.5、4.7、4.9。
  2. 例如,OpenShift Container Platform 4.6、4.8、4.10。

4.1.2.2. 集群 worker

在 Kubernetes 集群中,worker 节点是运行和管理 Kubernetes 用户请求的实际工作负载的地方。worker 节点公告其容量,而作为 master 服务一部分的调度程序决定在哪些节点上启动容器和 pod。重要服务在每个 worker 节点上运行,包括 CRI-O(即容器引擎)、Kubelet(接受并履行运行和停止容器工作负载请求的服务),以及服务代理(管理 worker 之间 Pod 的通信)。

在 OpenShift Container Platform 中,机器集用来控制 worker 机器。具有 worker 角色的机器驱动计算工作负载,这些负载由自动扩展它们的特定机器池管控。因为 OpenShift Container Platform 具有支持多种机器类型的能力,因此 worker 机器被归类为计算 (compute)机器。在本发行版本中,worker 机器计算机器是可以被互换使用的术语,因为计算机器的唯一默认类型是 worker 机器。在未来的 OpenShift Container Platform 版本中,默认情况下可能会使用不同类型的计算机器,如基础架构机器。

注意

机器集是 machine-api 命名空间中机器资源的定义。机器集是设计在特定云供应商上启动新机器的配置。相反,机器配置池(MCP)是 Machine Config Operator(MCO)命名空间的一部分。MCP 用于将机器分组在一起,以便 MCO 能够管理其配置并便于升级。

4.1.2.3. 集群 master

在 Kubernetes 集群中,control plane 节点(也称为 master 节点)运行控制 Kubernetes 集群所需的服务。在 OpenShift Container Platform 中,control plane 机器是 control plane。它们不仅仅包含用于管理 OpenShift Container Platform 集群的 Kubernetes 服务。因为所有具有 control plane 角色的机器都是 control plane 机器,所以 mastercontrol plane 是可以互换使用的术语。control plane 机器不会被分成机器集,而是由一系列独立的机器 API 资源定义。 额外的控件应用到 control plane 机器,以防止您删除所有 control plane 机器并破坏集群。

注意

所有生产部署都必须使用三个 control plane 节点。

master 上属于 Kubernetes 类别的服务包括 Kubernetes API 服务器、etcd、Kubernetes 控制器管理器和 Kubernetes 调度程序。

表 4.1. 在 control plane 上运行的 Kubernetes 服务

组件描述

Kubernetes API 服务器

Kubernetes API 服务器验证并配置 pod、服务和复制控制器的数据。它还为集群的共享状态提供了一个焦点。

etcd

etcd 存储持久 master 状态,其他组件则监视 etcd 的更改,以使其自身进入指定状态。

Kubernetes 控制器管理器

Kubernetes 控制器管理器监视 etcd 是否有对象的更改,如复制、命名空间,务帐户控制器对象,然后使用 API 来强制实施指定的状态。多个这样的过程会创建在某个时间点上有一个活跃群首的集群。

Kubernetes 调度程序

Kubernetes 调度程序监视没有分配节点的新创建的 pod,并选择托管该 pod 的最佳节点。

另外,在 control plane 上运行的 OpenShift 服务包括 OpenShift API 服务器、OpenShift 控制器管理器、OpenShift OAuth API 服务器和 OpenShift OAuth 服务器。

表 4.2. 在 control plane 上运行的 OpenShift 服务

组件描述

OpenShift API 服务器

OpenShift API 服务器验证并配置 OpenShift 资源(如项目、路由和模板)的数据。

OpenShift API 服务器由 OpenShift API Server Operator 管理。

OpenShift 控制器管理器

OpenShift 控制器管理器监视 etcd 是否有 OpenShift 对象的更改,如项目、路由和模板控制器对象,然后使用 API 来强制实施指定的状态。

OpenShift 控制器管理器由 OpenShift Controller Manager Operator 管理。

OpenShift OAuth API 服务器

OpenShift OAuth API 服务器验证并配置数据以向 OpenShift Container Platform 进行身份验证,如用户、组和 OAuth 令牌。

OpenShift OAuth API 服务器由 Cluster Authentication Operator 管理。

OpenShift OAuth 服务器

用户从 OpenShift OAuth 服务器请求令牌,以向 API 进行身份验证。

OpenShift OAuth 服务器由 Cluster Authentication Operator 管理。

control plane 机器上的某些服务作为 systemd 服务运行,另一些则作为静态 pod 运行。

systemd 服务适合需要始终在特定系统启动后不久出现的服务。对于 control plane 机器,这包括允许远程登录的 sshd。它还包括以下服务:

  • CRI-O 容器引擎 (crio),用于运行和管理容器。OpenShift Container Platform 4.6 使用 CRI-O,而不是 Docker Container Engine。
  • Kubelet (kubelet),从 master 服务接受管理机器上容器的请求。

CRI-O 和 Kubelet 必须作为 systemd 服务直接在主机上运行,因为它们必须先运行,然后您才能运行其他容器。

installer-*revision-pruner-* control plane pod 必须使用 root 权限运行,因为它们需要写入属于 root 用户的 /etc/kubernetes 目录。这些 pod 位于以下命名空间中:

  • openshift-etcd
  • openshift-kube-apiserver
  • openshift-kube-controller-manager
  • openshift-kube-scheduler

4.1.3. OpenShift Container Platform 中的 Operator

在 OpenShift Container Platform 中,Operator 是在 control plane 上打包、部署和管理服务的首选方法。它们还为用户运行的应用程序提供了便利。Operator 与 Kubernetes API 和 CLI 工具(如 kubectloc 命令)集成。它们提供了各种方式,以监视应用程序、执行健康检查、管理无线更新,以及确保应用程序保持在指定的状态。

因为 CRI-O 和 Kubelet 在每个节点上运行,所以几乎所有其他集群功能都可以通过使用 Operator 在 control plane 上进行管理。Operator 是 OpenShift Container Platform 4.6 中最重要的组件。使用 Operator 添加到 control plane 的组件包括重要的网络服务和凭证服务。

在 OpenShift Container Platform 集群中管理其他 Operator 的 Operator 是 Cluster Version Operator。

OpenShift Container Platform 4.6 使用不同类型的 Operator 来执行集群操作,并在集群上运行各种服务供您的应用程序使用。

4.1.3.1. OpenShift Container Platform 中的平台 Operator

在 OpenShift Container Platform 4.6 中,所有集群功能都划分到一系列平台 Operator 中。平台 Operator 管理集群功能的特定方面,如集群范围的应用程序日志记录、Kubernetes control plane 管理或机器置备系统。

每个 Operator 都为您提供确定集群功能的简单 API。Operator 将管理组件生命周期的细节隐藏起来。Operator 可以管理一个组件或数十个组件,但最终目标始终是通过自动化常见操作来减轻运维负担。Operator 还提供了更为精细的配置体验。若要配置各个组件,您可以修改 Operator 公开的 API,而不必修改全局配置文件。

4.1.3.2. 由 OLM 管理的 Operator

Cluster Operator Lifecycle Management (OLM) 组件管理可在应用程序中使用的 Operator。它不管理组成 OpenShift Container Platform 的 Operator。OLM 是一个将 Kubernetes 原生应用程序作为 Operator 进行管理的框架。它不管理 Kubernetes 清单,而是管理 Kubernetes Operator。OLM 管理两种 Operator,即 Red Hat Operator 和经认证的 Operator。

一些 Red Hat Operator 用来提供集群功能,如调度程序和问题检测器。其他 Operator 则可供您自助管理并在应用程序中使用,例如 etcd。OpenShift Container Platform 还提供由社区构建和维护并经过认证的 Operator 。这些经过认证的 Operator 为传统应用程序提供 API 层,因此您可以通过 Kubernetes 构造来管理应用程序。

4.1.3.3. 关于 OpenShift Update 服务

OpenShift 更新服务(OpenShift Update Service,简称 OSUS)为 OpenShift Container Platform(包括 Red Hat Enterprise Linux CoreOS(RHCOS))提供了无线更新(over-the air update)功能。它提供了一个图表,其中包含组件 Operator 的顶点(vertices)和连接它们的 边(edges)。图中的边代表了您可以安全更新到的版本。顶点是更新的有效负载,用于指定受管集群组件的预期状态。

集群中的 Cluster Version Operator (CVO) 会检查 OpenShift Container Platform 更新服务,并根据当前组件版本和图中的信息决定有效的更新和更新路径。当您请求更新时,CVO 使用该更新的发行镜像来更新您的集群。发行工件 (artifact) 作为容器镜像托管在 Quay 中。

为了让 OpenShift Update Service 仅提供兼容的更新,可以使用一个版本验证管道来驱动自动化过程。每个发行工件都会被验证是否与支持的云平台和系统架构以及其他组件包兼容。在管道确认有适用的版本后,OpenShift Update Service 会通知您它可用。

重要

OpenShift Update Service 显示当前集群的所有推荐更新。如果 OpenShift Update Service 不建议升级路径,这可能是因为更新或目标发行版本存在已知问题。

两个控制器在持续更新模式下运行。第一个控制器持续更新有效负载清单,将清单应用到集群,并输出 Operator 的受控推出的状态,以指示它们是否处于可用、升级或失败状态。第二个控制器轮询 OpenShift Update Service,以确定更新是否可用。

重要

仅支持升级到较新版本。不支持将集群还原或回滚到以前的版本。如果您的更新失败,请联系红帽支持。

在更新过程中,Machine Config Operator(MCO)将新配置应用到集群机器。MCO 会处理由 maxUnavailable 字段指定的、协调机器配置池中的节点数量,并将它们标记为不可用。在默认情况下,这个值被设置为 1。然后,MCO 会应用新配置并重启机器。

如果您将 Red Hat Enterprise Linux (RHEL) 机器用作 worker,MCO 不会在这些机器上更新 kubelet,因为您必须首先在这些机器上更新 OpenShift API。

当新版本规格应用到旧的 kubelet 时,RHEL 机器无法返回 Ready 状态。在机器可用前,您无法完成更新。但是,因为已设置了最大不可用节点数,所以可以在一定机器无法使用的情况下,确保正常的集群操作。

OpenShift Update Service 由 Operator 和一个或多个应用程序实例组成。

4.1.3.4. 了解 Machine Config Operator

OpenShift Container Platform 4.6 集成了操作系统和集群管理。由于集群管理自己的更新,包括集群节点上 Red Hat Enterprise Linux CoreOS (RHCOS) 的更新,因此 OpenShift Container Platform 提供了可靠的生命周期管理体验,能够简化节点升级的编配。

OpenShift Container Platform 使用三个守护进程集和控制器来简化节点管理。这些守护进程集通过使用标准的 Kubernetes 式构造来编配操作系统更新和主机配置更改。它们包括:

  • machine-config-controller,协调从 control plane 进行的机器升级。它监控所有集群节点并编配其配置更新。
  • machine-config-daemon 守护进程集在集群中的每个节点上运行,并根据 MachineConfigController 的指示将机器更新为机器配置定义的配置。 当节点检测到更改时,它会排空其 pod,应用更新并重启。这些更改以 Ignition 配置文件的形式出现,这些文件应用指定的机器配置并控制 kubelet 配置。更新本身在容器中交付。此过程是成功管理 OpenShift Container Platform 和 RHCOS 更新的关键。
  • machine-config-server 守护进程集,在加入集群时为 control plane 节点提供 Ignition 配置文件。

机器配置是 Ignition 配置的子集。machine-config-daemon 读取机器配置,以查看是否需要进行 OSTree 更新,或者是否必须应用一系列 systemd kubelet 文件更改、配置更改,或者对操作系统或 OpenShift Container Platform 配置的其他更改。

执行节点管理操作时,您可以创建或修改 KubeletConfig 自定义资源(CR)。

重要

当对机器配置进行修改时,Machine Config Operator 会自动重启所有对应的节点,以使更改生效。

要防止节点在机器配置更改后自动重启,在更改之前,必须通过在相应的机器配置池中将 spec.paused 字段设置为 true 来暂停自动引导过程。暂停后,机器配置更改不会生效,除非将 spec.paused 字段设置为 false,且节点已重启至新配置。