安装双节点 OpenShift 集群


OpenShift Container Platform 4.20

在单一节点上安装 OpenShift Container Platform

Red Hat OpenShift Documentation Team

摘要

本文档论述了如何在单一节点上安装 OpenShift Container Platform。

第 1 章 带有 Arbiter 的双节点

有两个 control plane 节点的 OpenShift Container Platform 集群,一个本地仲裁程序节点是一个紧凑、经济的 OpenShift Container Platform 拓扑。仲裁程序节点存储完整的 etcd 数据,维护一个 etcd 仲裁并阻止出现脑裂的问题。arbiter 节点不会运行额外的 control plane 组件 kube-apiserverkube-controller-manager,也不会运行工作负载。

要安装有两个 control plane 节点和一个本地仲裁节点的集群,请将仲裁角色分配给至少一个节点,并将集群的 control plane 节点数设置为 2。虽然 OpenShift Container Platform 目前不会对仲裁节点数量施加限制,但典型的部署仅包含一个,以最大程度降低硬件资源的使用。

安装后,您可以向有两个 control plane 节点和一个本地仲裁节点在集群中添加额外的仲裁程序节点(但不适用于标准多节点集群)。还无法在带有本地节点仲裁程序和标准拓扑的双节点 OpenShift 集群之间进行转换。

您可以使用以下方法之一安装有两个 control plane 节点和一个本地仲裁节点的集群:

第 2 章 带有隔离的双节点

2.1. 准备安装带有隔离的双节点 OpenShift 集群

重要

带有隔离的双节点 OpenShift 集群只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。

有关红帽技术预览功能支持范围的更多信息,请参阅以下链接:

具有隔离的双节点 OpenShift 集群提供可用性(HA),且对硬件的要求较小。此配置是为部署完整的三节点 control plane 集群的分布式或边缘环境而设计的。

双节点集群不包括计算节点。除了管理集群外,两个 control plane 机器还运行用户工作负载。

隔离由 Pacemaker 管理,它可以使用节点的 Baseboard Management Console (BMC) 来隔离无响应的节点。在隔离无响应节点后,剩余的节点可以安全地继续运行集群,而不会造成资源崩溃的风险。

注意

您可以使用用户置备的基础架构方法或安装程序置备的基础架构方法部署带有隔离的双节点 OpenShift 集群。

带有隔离的双节点 OpenShift 集群需要以下主机:

Expand
表 2.1. 最低所需的主机
主机描述

两个 control plane 机器

control plane 机器运行组成 control plane 的 Kubernetes 和 OpenShift Container Platform 服务。

一个临时 bootstrap 机器

您需要一个 bootstrap 机器,在 control plane 机器上部署 OpenShift Container Platform 集群。您可在安装集群后删除 bootstrap 机器。

bootstrap 和 control plane 机器必须使用 Red Hat Enterprise Linux CoreOS(RHCOS)作为操作系统。有关安装 RHCOS 并启动 bootstrap 过程的说明,请参阅安装 RHCOS 并启动 OpenShift Container Platform bootstrap 过程

注意

使用 RHCOS 的要求只适用于用户置备的基础架构部署。对于安装程序置备的基础架构部署,安装程序会自动置备 bootstrap 和 control plane 机器,您不需要手动安装 RHCOS。

每台集群机器都必须满足以下最低要求:

Expand
表 2.2. 最低资源要求
机器操作系统CPU [1]RAMStorageInput/Output Per Second (IOPS) [1]

bootstrap

RHCOS

4

16 GB

120 GB

300

Control plane(控制平面)

RHCOS

4

16 GB

120 GB

300

  1. 当未启用并发多线程 (SMT) 或超线程时,一个 CPU 相当于一个物理内核。启用后,使用以下公式来计算对应的比例:(每个内核数的线程)× sockets = CPU。
  2. OpenShift Container Platform 和 Kubernetes 对磁盘性能敏感,建议使用更快的存储,特别是 control plane 节点上的 etcd。请注意,在许多云平台上,存储大小和 IOPS 可一起扩展,因此您可能需要过度分配存储卷来获取足够的性能。

2.1.2. 用户置备的 DNS 要求

在 OpenShift Container Platform 部署中,以下组件需要 DNS 名称解析:

  • The Kubernetes API
  • OpenShift Container Platform 应用程序通配符
  • bootstrap 和 control plane 机器

Kubernetes API、bootstrap 机器和 control plane 机器也需要反向 DNS 解析。

DNS A/AAAA 或 CNAME 记录用于名称解析,PTR 记录用于反向名称解析。反向记录很重要,因为 Red Hat Enterprise Linux CoreOS(RHCOS)使用反向记录为所有节点设置主机名,除非 DHCP 提供主机名。另外,反向记录用于生成 OpenShift Container Platform 需要操作的证书签名请求(CSR)。

注意

建议使用 DHCP 服务器为每个群集节点提供主机名。如需更多信息,请参阅用户置备的基础架构部分的 DHCP 建议

用户置备的 OpenShift Container Platform 集群需要以下 DNS 记录,这些记录必须在安装前就位。在每个记录中,<cluster_name> 是集群名称,<base_domain> 是您在 install-config.yaml 文件中指定的基域。完整的 DNS 记录采用以下形式: <component>.<cluster_name>.<base_domain>.

Expand
表 2.3. 所需的 DNS 记录
组件记录描述

Kubernetes API

api.<cluster_name>.<base_domain>.

DNS A/AAAA 或 CNAME 记录,以及用于标识 API 负载均衡器的 DNS PTR 记录。这些记录必须由集群外的客户端和集群中的所有节点解析。

api-int.<cluster_name>.<base_domain>.

DNS A/AAAA 或 CNAME 记录,以及用于内部标识 API 负载均衡器的 DNS PTR 记录。这些记录必须可以从集群中的所有节点解析。

重要

API 服务器必须能够根据 Kubernetes 中记录的主机名解析 worker 节点。如果 API 服务器无法解析节点名称,则代理的 API 调用会失败,且您无法从 pod 检索日志。

Routes

*.apps.<cluster_name>.<base_domain>.

通配符 DNS A/AAAA 或 CNAME 记录,指向应用程序入口负载均衡器。应用程序入口负载均衡器以运行 Ingress Controller Pod 的机器为目标。默认情况下,Ingress Controller pod 在计算节点上运行。在没有专用计算节点的集群拓扑中,如双节点或三节点集群,control plane 节点也会执行 worker 标签,因此 Ingress pod 会调度到 control plane 节点上。这些记录必须由集群外的客户端和集群中的所有节点解析。

例如,console -openshift-console.apps.<cluster_name>.<base_domain> 用作到 OpenShift Container Platform 控制台的通配符路由。

bootstrap 机器

bootstrap.<cluster_name>.<base_domain>.

DNS A/AAAA 或 CNAME 记录,以及用于标识 bootstrap 机器的 DNS PTR 记录。这些记录必须由集群中的节点解析。

control plane 机器

<control_plane><n>.<cluster_name>.<base_domain>.

DNS A/AAAA 或 CNAME 记录,以识别 control plane 节点的每台机器。这些记录必须由集群中的节点解析。

注意

在 OpenShift Container Platform 4.4 及更新的版本中,您不需要在 DNS 配置中指定 etcd 主机和 SRV 记录。

提示

您可以使用 dig 命令验证名称和反向名称解析。如需了解详细的 验证步骤,请参阅为用户置备的基础架构验证 DNS 解析 一节。

2.1.2.1. 用户置备的集群的 DNS 配置示例

本节提供 A 和 PTR 记录配置示例,它们满足了在用户置备的基础架构上部署 OpenShift Container Platform 的 DNS 要求。样本不是为选择一个 DNS 解决方案提供建议。

在这个示例中,集群名称为 ocp4,基域是 example.com

注意

在带有隔离的双节点集群中,control plane 机器也是可调度的 worker 节点。因此,DNS 配置必须只包含两个 control plane 节点。如果您稍后添加计算机器,请为它们提供对应的 A 和 PTR 记录,就像在标准用户置备的安装中一样。

用户置备的集群的 DNS A 记录配置示例

以下示例是 BIND 区域文件,其中显示了用户置备的集群中名称解析的 A 记录示例。

例 2.1. DNS 区数据库示例

$TTL 1W
@	IN	SOA	ns1.example.com.	root (
			2019070700	; serial
			3H		; refresh (3 hours)
			30M		; retry (30 minutes)
			2W		; expiry (2 weeks)
			1W )		; minimum (1 week)
	IN	NS	ns1.example.com.
	IN	MX 10	smtp.example.com.
;
;
ns1.example.com.		IN	A	192.168.1.5
smtp.example.com.		IN	A	192.168.1.5
;
helper.example.com.		IN	A	192.168.1.5
helper.ocp4.example.com.	IN	A	192.168.1.5
;
api.ocp4.example.com.		IN	A	192.168.1.5
api-int.ocp4.example.com.	IN	A	192.168.1.5
;
*.apps.ocp4.example.com.	IN	A	192.168.1.5
;
bootstrap.ocp4.example.com.	IN	A	192.168.1.96
;
control-plane0.ocp4.example.com.	IN	A	192.168.1.97
control-plane1.ocp4.example.com.	IN	A	192.168.1.98
;
;
;EOF
  • api.ocp4.example.com.: 为 Kubernetes API 提供名称解析。记录引用 API 负载均衡器的 IP 地址。
  • api-int.ocp4.example.com.: 为 Kubernetes API 提供名称解析。记录引用 API 负载均衡器的 IP 地址,用于内部集群通信。
  • 8.apps.ocp4.example.com.: 为通配符路由提供名称解析。记录引用应用程序入口负载均衡器的 IP 地址。应用程序入口负载均衡器以运行 Ingress Controller Pod 的机器为目标。

    注意

    在这个示例中,将相同的负载均衡器用于 Kubernetes API 和应用入口流量。在生产环境中,您可以单独部署 API 和应用程序入口负载均衡器,以便可以隔离扩展每个负载均衡器基础架构。

  • bootstrap.ocp4.example.com.: 为 bootstrap 机器提供名称解析。
  • control-plane0.ocp4.example.com.: 为 control plane 机器提供名称解析。

用户置备的集群的 DNS PTR 记录配置示例

以下示例 BIND 区域文件显示了用户置备的集群中反向名称解析的 PTR 记录示例。

例 2.2. 反向记录的 DNS 区数据库示例

$TTL 1W
@	IN	SOA	ns1.example.com.	root (
			2019070700	; serial
			3H		; refresh (3 hours)
			30M		; retry (30 minutes)
			2W		; expiry (2 weeks)
			1W )		; minimum (1 week)
	IN	NS	ns1.example.com.
;
5.1.168.192.in-addr.arpa.	IN	PTR	api.ocp4.example.com.
5.1.168.192.in-addr.arpa.	IN	PTR	api-int.ocp4.example.com.
;
96.1.168.192.in-addr.arpa.	IN	PTR	bootstrap.ocp4.example.com.
;
97.1.168.192.in-addr.arpa.	IN	PTR	control-plane0.ocp4.example.com.
98.1.168.192.in-addr.arpa.	IN	PTR	control-plane1.ocp4.example.com.
;
;
;EOF
  • api.ocp4.example.com.: 为 Kubernetes API 提供反向 DNS 解析。PTR 记录引用 API 负载均衡器的记录名称。
  • api-int.ocp4.example.com.: 为 Kubernetes API 提供反向 DNS 解析。PTR 记录引用 API 负载均衡器的记录名称,用于内部集群通信。
  • bootstrap.ocp4.example.com.: 为 bootstrap 机器提供反向 DNS 解析。
  • control-plane0.ocp4.example.com.: 为 control plane 机器提供 rebootstrap.ocp4.example.com.verse DNS 解析。
注意

OpenShift Container Platform 应用程序通配符不需要 PTR 记录。

2.1.3. 安装程序置备的 DNS 要求

客户端通过 baremetal 网络访问 OpenShift Container Platform 集群节点。网络管理员必须配置子域或子区,其中规范名称扩展是集群名称。

<cluster_name>.<base_domain>

例如:

test-cluster.example.com

OpenShift Container Platform 包含使用集群成员资格信息来生成 A/AAAA 记录的功能。这会将节点名称解析为其 IP 地址。使用 API 注册节点后,集群可以在不使用 CoreDNS-mDNS 的情况下分散节点信息。这可消除与多播 DNS 关联的网络流量。

CoreDNS 需要 TCP 和 UDP 连接到上游 DNS 服务器才能正常工作。确保上游 DNS 服务器可以从 OpenShift Container Platform 集群节点接收 TCP 和 UDP 连接。

在 OpenShift Container Platform 部署中,以下组件需要 DNS 名称解析:

  • The Kubernetes API
  • OpenShift Container Platform 应用程序通配符入口 API

A/AAAA 记录用于名称解析,而 PTR 记录用于反向名称解析。Red Hat Enterprise Linux CoreOS(RHCOS)使用反向记录或 DHCP 为所有节点设置主机名。

安装程序置备的安装包括使用集群成员资格信息生成 A/AAAA 记录的功能。这会将节点名称解析为其 IP 地址。在每个记录中,<cluster_name> 是集群名称,<base_domain> 是您在 install-config.yaml 文件中指定的基域。完整的 DNS 记录采用以下形式: <component>.<cluster_name>.<base_domain>.

Expand
表 2.4. 所需的 DNS 记录
组件记录描述

Kubernetes API

api.<cluster_name>.<base_domain>.

A/AAAA 记录和 PTR 记录可识别 API 负载均衡器。这些记录必须由集群外的客户端和集群中的所有节点解析。

Routes

*.apps.<cluster_name>.<base_domain>.

通配符 A/AAAA 记录指的是应用程序入口负载均衡器。应用程序入口负载均衡器以运行 Ingress Controller pod 的节点为目标。默认情况下,Ingress Controller pod 在 worker 节点上运行。这些记录必须由集群外的客户端和集群中的所有节点解析。

例如,console -openshift-console.apps.<cluster_name>.<base_domain> 用作到 OpenShift Container Platform 控制台的通配符路由。

提示

您可以使用 dig 命令验证 DNS 解析。

在安装带有隔离的双节点 OpenShift 集群前,您必须配置外部入口负载均衡器(LB)。Ingress LB 将外部应用程序流量转发到 control plane 节点上运行的 Ingress Controller pod。两个节点都可以主动接收流量。

先决条件

  • 您有两个启用了隔离功能的 control plane 节点。
  • 您有从负载均衡器到两个 control plane 节点的网络连接。
  • api.<cluster_name>.<base_domain>*.apps.<cluster_name>.<base_domain> 创建 DNS 记录。
  • 您有一个支持端点上的健康检查的外部负载均衡器。

流程

  1. 将负载均衡器配置为转发以下端口的流量:

    • 6443: Kubernetes API 服务器
    • 80443 :应用程序入口

      您必须将流量转发到两个 control plane 节点。

  2. 在负载平衡器上配置健康检查。您必须监控后端端点,以便负载均衡器仅将流量发送到响应的节点。
  3. 配置负载均衡器,将流量转发到两个 control plane 节点。以下示例演示了如何配置两个 control plane 节点:

    frontend api_frontend
        bind *:6443
        mode tcp
        default_backend api_backend
    
    backend api_backend
        mode tcp
        balance roundrobin
        server cp0 <cp0_ip>:6443 check
        server cp1 <cp1_ip>:6443 check
    
    frontend ingress_frontend
        bind *:80
        bind *:443
        mode tcp
        default_backend ingress_backend
    
    backend ingress_backend
        mode tcp
        balance roundrobin
        server cp0 <cp0_ip>:80 check
        server cp1 <cp1_ip>:80 check
        server cp0 <cp0_ip>:443 check
        server cp1 <cp1_ip>:443 check
  4. 验证负载均衡器配置:

    1. 在外部客户端中运行以下命令:

      $ curl -k https://api.<cluster_name>.<base_domain>:6443/version
    2. 从外部客户端,运行以下命令来访问应用程序路由:

      $ curl https://<app>.<cluster_name>.<base_domain>

您可以关闭 control plane 节点,并验证负载均衡器是否在其他节点继续服务请求时停止向该节点发送流量。

2.1.5. 为自定义 br-ex 网桥创建清单对象

您必须创建一个清单对象,以在安装后修改集群的网络配置。清单配置 br-ex 网桥,后者管理集群的外部网络连接。

有关创建此清单的说明,请参阅"为自定义 br-ex 网桥创建清单文件"。

2.2. 使用隔离安装双节点 OpenShift 集群

重要

带有隔离的双节点 OpenShift 集群只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。

有关红帽技术预览功能支持范围的更多信息,请参阅以下链接:

您可以使用安装程序置备的基础架构或用户置备的基础架构安装方法部署带有隔离的双节点 OpenShift 集群。以下示例提供了这两种方法的 install-config.yaml 配置示例。

您可以使用安装程序置备的基础架构方法,使用以下 install-config.yaml 配置作为部署带有隔离的双节点 OpenShift 集群的模板:

注意

在继续操作前进行 etcd 备份,以确保在出现问题时可以恢复集群。

install-config.yaml 配置示例

apiVersion: v1
baseDomain: example.com
compute:
- name: worker
  replicas: 0
controlPlane:
  name: master
  replicas: 2
  fencing:
    credentials:
      - hostname: <control_0_hostname>
        address: https://<redfish-api-url>
        username: <username>
        password: <password>
        certificateVerification: Disabled
      - hostname: <control_1_hostname>
        address: https://<redfish-api-url>
        username: <username>
        password: <password>
        certificateVerification: Enabled
metadata:
  name: <cluster_name>
featureSet: TechPreviewNoUpgrade
platform:
  baremetal:
    apiVIPs:
      - <api_ip>
    ingressVIPs:
      - <wildcard_ip>
    hosts:
      - name: <control_0_hostname>
        role: master
        bmc:
          address: <bmc_address>
          username: <bmc_username>
          password: <bmc_password>
        bootMACAddress: <boot_mac>
      - name: <control_1_hostname>
        role: master
        bmc:
          address: <bmc_address>
          username: <bmc_username>
          password: <bmc_password>
        bootMACAddress: <boot_mac>
pullSecret: '<pull_secret>'
sshKey: '<ssh_public_key>'

  • compute.replicas: 将此字段设置为 0,因为双节点隔离集群不包括 worker 节点。
  • controlPlane.replicas :为双节点隔离部署将此字段设置为 2
  • fencing.credentials.hostname :为每个 control plane 节点提供 Baseboard Management Console (BMC)凭 证。节点隔离需要这些凭证,并防止脑裂的情况。
  • fencing.credentials.certificateVerification :如果您的 Redfish URL 使用自签名证书,则此字段设置为 Disabled,这对内部托管端点是通用的。对于具有有效 CA 签名证书的 URL,将此字段设置为 Enabled
  • metadata.name 、:集群名称用作主机名和 DNS 记录的前缀。
  • featureSet :将此字段设置为 TechPreviewNoUpgrade 以启用双节点 OpenShift 集群部署。
  • platform.baremetal.apiVIPsplatform.baremetal.ingressVIPs : API 和 Ingress 端点的虚拟 IP。确保它们可以被所有节点和外部客户端访问。
  • pullSecret:包含拉取集群组件的容器镜像所需的凭证。
  • sshKey:安装后访问集群节点的 SSH 公钥。

您可以使用用户置备的基础架构方法,使用以下 install-config.yaml 配置作为部署带有隔离的双节点 OpenShift 集群的模板:

注意

在继续操作前进行 etcd 备份,以确保在出现问题时可以恢复集群。

install-config.yaml 配置示例

apiVersion: v1
baseDomain: example.com
compute:
- name: worker
  replicas: 0
controlPlane:
  name: master
  replicas: 2
  fencing:
    credentials:
      - hostname: <control_0_hostname>
        address: https://<redfish-api-url>
        username: <username>
        password: <password>
      - hostname: <control_1_hostname>
        address: https://<redfish-api-url>
        username: <username>
        password: <password>
metadata:
  name: <cluster_name>
featureSet: TechPreviewNoUpgrade
platform:
  none: {}
pullSecret: '<pull_secret>'
sshKey: '<ssh_public_key>'

  • compute.replicas: 将此字段设置为 0,因为双节点隔离集群不包括 worker 节点。
  • controlPlane.replicas :为双节点隔离部署将此字段设置为 2
  • fencing.credentials.hostname :为每个 control plane 节点提供 BMC 凭证。
  • metadata.name :集群名称用作主机名和 DNS 记录的前缀。
  • featureSet :启用双节点 OpenShift 集群部署。
  • 对于用户置备的基础架构部署,platform.none 将平台设置为 none。裸机主机在安装程序外预置备。
  • pullSecret:包含拉取集群组件的容器镜像所需的凭证。
  • sshKey:安装后访问集群节点的 SSH 公钥。

2.3. 安装后进行故障排除和恢复

重要

带有隔离的双节点 OpenShift 集群只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。

有关红帽技术预览功能支持范围的更多信息,请参阅以下链接:

使用以下小节帮助您通过隔离在双节点 OpenShift 集群中恢复问题。

如果中断事件阻止隔离正常工作,您可能需要执行手动恢复步骤。在这种情况下,您可以在 control plane 节点上直接运行命令来恢复集群。有四个主要恢复场景,应按照以下顺序尝试:

  1. 更新隔离 secret :如果 Baseboard Management Console (BMC) 凭证不正确或过期,则刷新它们。
  2. 从单节点故障中恢复:当只有一个 control plane 节点停机时,恢复功能。
  3. 从完整的节点故障中恢复:当两个 control plane 节点都停机时恢复功能。
  4. 替换无法恢复的 control plane 节点:替换节点以恢复集群功能。

先决条件

  • 有对 control plane 节点的管理访问权限。
  • 您可以使用 SSH 连接到节点。
注意

在继续操作前进行 etcd 备份,以确保在出现问题时可以恢复集群。

流程

  1. 更新隔离 secret:

    1. 如果 Cluster API 不可访问,请在其中一个集群节点上运行以下命令来更新隔离 secret:

      $ sudo pcs stonith update <node_name>_redfish username=<user_name> password=<password>

      在 Cluster API 恢复或 Cluster API 已可用后,更新集群中的隔离 secret,以确保它保持同步,如以下步骤所述。

    2. 运行以下命令,编辑 control plane 节点的现有隔离 secret 的用户名和密码:

      $ oc project openshift-etcd
      $ oc edit secret <node_name>-fencing

      如果在更新隔离 secret 后集群恢复,则不需要进一步的操作。如果问题仍然存在,请继续下一步。

  2. 从单节点故障中恢复:

    1. 运行以下命令来收集初始诊断:

      $ sudo pcs status --full

      此命令提供当前集群和资源状态的详细视图。您可以使用输出来识别隔离或 etcd 启动的问题。

    2. 如果需要,运行以下命令:

      运行以下命令重置集群中的资源,并指示 Pacemaker 尝试再次启动它们:

      $ sudo pcs resource cleanup

      运行以下命令,查看节点上的所有 Pacemaker 活动:

      $ sudo journalctl -u pacemaker

      运行以下命令来诊断 etcd 资源启动问题:

      $ sudo journalctl -u pacemaker | grep podman-etcd
    3. 运行以下命令,查看节点的隔离配置:

      $ sudo pcs stonith config <node_name>_redfish

      如果需要隔离,但无法正常工作,请确保可以访问 Redfish 隔离端点,并验证凭证是否正确。

    4. 如果 etcd 没有启动隔离功能,请运行以下命令从备份中恢复 etcd:

      $ sudo cp -r /var/lib/etcd-backup/* /var/lib/etcd/
      $ sudo chown -R etcd:etcd /var/lib/etcd

      如果恢复成功,则不需要进一步的操作。如果问题仍然存在,请继续下一步。

  3. 从完整的节点故障中恢复:

    1. 打开两个 control plane 节点。

      Pacemaker 在检测到两个节点在线时自动启动恢复操作。如果恢复没有按预期启动,请使用上一步中描述的诊断命令来调查问题。

    2. 运行以下命令重置集群中的资源,并指示 Pacemaker 尝试再次启动它们:

      $ sudo pcs resource cleanup
    3. 运行以下命令检查资源启动顺序:

      $ sudo pcs status --full
    4. 运行以下命令,检查 kubelet 失败的 pacemaker 服务日志:

      $ sudo journalctl -u pacemaker
      $ sudo journalctl -u kubelet
    5. 处理不同步的 etcd。

      如果一个节点具有更新的 etcd,Pacemaker 会尝试隔离滞后的节点,并将其作为 learner 启动。如果这个进程停滞,请运行以下命令验证 Redfish 隔离端点和凭证:

      $ sudo pcs stonith config

      如果恢复成功,则不需要进一步的操作。如果问题仍然存在,请执行手动恢复,如下一步所述。

  4. 如果您需要在一个节点无法恢复时从事件手动恢复,请按照以下步骤"替换 control plane 节点到双节点 OpenShift 集群中"。

    当集群丢失某个节点时,它会进入降级模式。在这个状态中,Pacemaker 会自动取消阻塞仲裁,并允许集群在剩余的节点上临时操作。

    如果两个节点都失败,您必须重启两个节点来重新建立仲裁,以便 Pacemaker 可以恢复正常的集群操作。

    如果只有两个节点中的一个可以重启,请按照以下步骤在存活的节点上手动重新建立仲裁。

    如果仍需要手动恢复,且失败,收集 must-gather 和 SOS 报告,并提交一个 bug。

验证

有关验证 control plane 节点和 etcd 是否正常运行的详情,请参考"使用隔离在双节点 OpenShift 集群中验证 etcd 健康状况"。

您可以替换双节点 OpenShift 集群中失败的 control plane 节点。替换节点必须使用与故障节点相同的主机名和 IP 地址。

先决条件

  • 您有一个可正常工作的 survivor control plane 节点。
  • 您已确认机器没有运行,或者该节点未就绪。
  • 您可以使用具有 cluster-admin 角色的用户访问集群。
  • 您知道故障节点的主机名和 IP 地址。
注意

在继续操作前进行 etcd 备份,以确保在出现问题时可以恢复集群。

流程

  1. 运行以下命令检查仲裁状态:

    $ sudo pcs quorum status

    输出示例

    Quorum information
    ------------------
    Date:             Fri Oct  3 14:15:31 2025
    Quorum provider:  corosync_votequorum
    Nodes:            2
    Node ID:          1
    Ring ID:          1.16
    Quorate:          Yes
    
    Votequorum information
    ----------------------
    Expected votes:   2
    Highest expected: 2
    Total votes:      2
    Quorum:           1
    Flags:            2Node Quorate WaitForAll
    
    Membership information
    ----------------------
        Nodeid      Votes    Qdevice Name
             1          1         NR master-0 (local)
             2          1         NR master-1

    1. 如果 quorum 丢失,且一个 control plane 节点仍在运行,请运行以下命令在 survivor 节点上手动恢复仲裁:

      $ sudo pcs quorum unblock
    2. 如果只有一个节点失败,请运行以下命令验证 etcd 是否在 survivor 节点上运行:

      $ sudo pcs resource status etcd
    3. 如果 etcd 没有运行,请运行以下命令重启 etcd:

      $ sudo pcs resource cleanup etcd

      如果 etcd 仍然没有启动,手动在存活的节点上强制启动,跳过隔离:

      重要

      在运行此命令前,请确保被替换的节点无法访问。否则,会面临 etcd 被破坏的风险。

      $ sudo pcs resource debug-stop etcd
      $ sudo OCF_RESKEY_CRM_meta_notify_start_resource='etcd' pcs resource debug-start etcd

      恢复后,etcd 必须在存活的节点上成功运行。

  2. 运行以下命令,为故障节点删除 etcd secret:

    $ oc project openshift-etcd
    $ oc delete secret etcd-peer-<node_name>
    $ oc delete secret etcd-serving-<node_name>
    $ oc delete secret etcd-serving-metrics-<node_name>
    注意

    要替换失败的节点,需要首先删除其 etcd secret。当 etcd 运行时,API 服务器可能需要一些时间才能响应这些命令。

  3. 删除故障节点的资源:

    1. 如果您有 BareMetalHost (BMH)对象,请运行以下命令来识别您要替换的主机:

      $ oc get bmh -n openshift-machine-api
    2. 运行以下命令,删除故障节点的 BMH 对象:

      $ oc delete bmh/<bmh_name> -n openshift-machine-api
    3. 运行以下命令,列出 Machine 对象来识别映射到您要替换的节点的对象:

      $ oc get machines.machine.openshift.io -n openshift-machine-api
    4. 运行以下命令,从 Machine 对象获取带有机器哈希值的标签:

      $ oc get machines.machine.openshift.io/<machine_name> -n openshift-machine-api \
        -o jsonpath='Machine hash label: {.metadata.labels.machine\.openshift\.io/cluster-api-cluster}{"\n"}'

      <machine_name> 替换为集群中的 Machine 对象的名称。例如: ostest-bfs7w-ctrlplane-0

      您需要此标签来置备新的 Machine 对象。

    5. 运行以下命令,删除故障节点的 Machine 对象:

      $ oc delete machines.machine.openshift.io/<machine_name>-<failed nodename> -n openshift-machine-api
      注意

      在删除 Machine 对象后,节点对象会被自动删除。

  4. 使用相同的名称和 IP 地址重新创建失败的主机:

    重要

    只有在使用安装程序置备的基础架构或 Machine API 创建原始节点时,才需要执行此步骤。有关替换失败的裸机 control plane 节点的详情,请参考"在裸机中替换不健康的 etcd 成员"。

    1. 删除 BMH 和 Machine 对象。机器控制器自动删除节点对象。
    2. 使用以下示例配置置备新机器:

      Machine 对象配置示例

      apiVersion: machine.openshift.io/v1beta1
      kind: Machine
      metadata:
        annotations:
          metal3.io/BareMetalHost: openshift-machine-api/{bmh_name}
        finalizers:
        - machine.machine.openshift.io
        labels:
          machine.openshift.io/cluster-api-cluster: {machine_hash_label}
          machine.openshift.io/cluster-api-machine-role: master
          machine.openshift.io/cluster-api-machine-type: master
        name: {machine_name}
        namespace: openshift-machine-api
      spec:
        authoritativeAPI: MachineAPI
        metadata: {}
        providerSpec:
          value:
            apiVersion: baremetal.cluster.k8s.io/v1alpha1
            customDeploy:
              method: install_coreos
            hostSelector: {}
            image:
              checksum: ""
              url: ""
            kind: BareMetalMachineProviderSpec
            metadata:
              creationTimestamp: null
            userData:
              name: master-user-data-managed

      • metadata.annotations.metal3.io/BareMetalHost: 将 {bmh_name} 替换为与您要替换的主机关联的 BMH 对象的名称。
      • labels.machine.openshift.io/cluster-api-cluster: 将 {machine_hash_label} 替换为从您删除的机器中获取的标签。
      • metadata.name :将 {machine_name} 替换为您删除的机器的名称。
    3. 运行以下命令,创建新的 BMH 对象和 secret 来存储 BMC 凭证:

      cat <<EOF | oc apply -f -
      apiVersion: v1
      kind: Secret
      metadata:
        name: <secret_name>
        namespace: openshift-machine-api
      data:
        password: <password>
        username: <username>
      type: Opaque
      ---
      apiVersion: metal3.io/v1alpha1
      kind: BareMetalHost
      metadata:
        name: {bmh_name}
        namespace: openshift-machine-api
      spec:
        automatedCleaningMode: disabled
        bmc:
          address: <redfish_url>/{uuid}
          credentialsName: <name>
          disableCertificateVerification: true
        bootMACAddress: {boot_mac_address}
        bootMode: UEFI
        externallyProvisioned: false
        online: true
        rootDeviceHints:
          deviceName: /dev/disk/by-id/scsi-<serial_number>
        userData:
          name: master-user-data-managed
          namespace: openshift-machine-api
      EOF
      • metadata.name :指定 secret 的名称。
      • metadata.name :将 {bmh_name} 替换为您删除的 BMH 对象的名称。
      • BMC.address: 将 {uuid} 替换为您创建的节点的 UUID。
      • BMC.credentialsName :将 name 替换为您创建的 secret 的名称。
      • bootMACAddress :指定 provisioning 网络接口的 MAC 地址。这是节点在调配期间与 Ironic 通信时使用的 MAC 地址。
  5. 运行以下命令验证新节点是否已达到 Provisioned 状态:

    $ oc get bmh -o wide

    此命令输出中的 STATUS 列的值必须是 Provisioned

    注意

    完成置备过程可能需要 10 到 20 分钟。

  6. 运行以下命令,验证两个 control plane 节点都处于 Ready 状态:

    $ oc get nodes

    此命令输出中的 STATUS 列值对于两个节点都必须是 Ready

  7. 运行以下命令,将 detached 注解应用到 BMH 对象以防止 Machine API 管理它:

    $ oc annotate bmh <bmh_name> -n openshift-machine-api baremetalhost.metal3.io/detached='' --overwrite
  8. 运行以下命令,将替换节点重新加入到 pacemaker 集群中:

    注意

    在存活的 control plane 节点上运行以下命令,而不是被替换的节点。

    $ sudo pcs cluster node remove <node_name>
    $ sudo pcs cluster node add <node_name> addr=<node_ip> --start --enable
  9. 运行以下命令,删除故障节点的过时作业:

    $ oc project openshift-etcd
    $ oc delete job tnf-auth-job-<node_name>
    $ oc delete job tnf-after-setup-job-<node_name>

验证

有关验证 control plane 节点和 etcd 是否正常运行的详情,请参考"使用隔离在双节点 OpenShift 集群中验证 etcd 健康状况"。

完成节点恢复或维护过程后,验证 control plane 节点和 etcd 是否在正确运行。

先决条件

  • 您可以使用具有 cluster-admin 权限的用户访问集群。
  • 您可以通过 SSH 访问至少一个 control plane 节点。

流程

  1. 运行以下命令检查整个节点状态:

    $ oc get nodes

    此命令验证 control plane 节点是否处于 Ready 状态,表示它们是否可以接收调度的工作负载。

  2. 运行以下命令,验证 cluster-etcd-operator 的状态:

    $ oc describe co/etcd

    cluster-etcd-operator 管理并报告 etcd 设置的健康状况。查看其状态可帮助您识别任何持续的问题或降级条件。

  3. 运行以下命令来查看 etcd 成员列表:

    $ oc rsh -n openshift-etcd <etcd_pod> etcdctl member list -w table

    此命令显示当前的 etcd 成员及其角色。查找标记为 learner 的任何节点,这表示它们正在成为投票成员。

  4. 在 control plane 节点上运行以下命令来查看 Pacemaker 资源状态:

    $ sudo pcs status --full

    此命令提供 Pacemaker 管理的所有资源的详细概述。您必须确保满足以下条件:

    • 两个节点都在线。
    • kubeletetcd 资源正在运行。
    • 两个节点的隔离都正确配置。

Legal Notice

Copyright © Red Hat

OpenShift documentation is licensed under the Apache License 2.0 (https://www.apache.org/licenses/LICENSE-2.0).

Modified versions must remove all Red Hat trademarks.

Portions adapted from https://github.com/kubernetes-incubator/service-catalog/ with modifications by Red Hat.

Red Hat, Red Hat Enterprise Linux, the Red Hat logo, the Shadowman logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.

Linux® is the registered trademark of Linus Torvalds in the United States and other countries.

Java® is a registered trademark of Oracle and/or its affiliates.

XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.

MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.

Node.js® is an official trademark of the OpenJS Foundation.

The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation’s permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.

All other trademarks are the property of their respective owners.

Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2026 Red Hat
返回顶部