etcd
使用 etcd 提供冗余
摘要
第 1 章 etcd 概述 复制链接链接已复制到粘贴板!
etcd (发音为 et-see-dee)是一个一致的分布式键值存储,它会存储少量跨一个集群间的机器的数据,这些数据可以完全保持在内存中。作为许多项目的核心组件,etcd 也是 Kubernetes 的主要数据存储,这是容器编配的标准系统。
通过使用 etcd,您可以以多种方式获益:
- 实现云原生应用程序的一致性运行时间,并在单个服务器失败的情况下仍然可以保持工作
- 为 Kubernetes 存储和复制所有集群状态
- 分发配置数据,以便为配置节点提供冗余和弹性
默认的 etcd 配置可优化容器编配。按照设计目的使用可以获取最佳结果。
1.1. etcd 的工作原理 复制链接链接已复制到粘贴板!
为了确保集群配置和管理的可靠方法,etcd 使用 etcd Operator。Operator 简化了在 Kubernetes 容器平台(如 OpenShift Container Platform 中)对 etcd 的使用。
另外,您可以使用 etcd Operator 为 OpenShift Container Platform control plane 部署和管理 etcd 集群。etcd Operator 通过以下方式管理集群状态:
- 使用 Kubernetes API 观察集群状态
- 分析当前状态和所需状态之间的区别
- 通过 etcd 集群管理 API、Kubernetes API 或两者来更正不同之处
etcd 会维持集群状态,它会持续更新。这个状态会被持续保留,从而导致高频率的、大量的小更改。因此,使用快速、低延迟 I/O 支持 etcd 集群成员至关重要。有关 etcd 的最佳实践的更多信息,请参阅"推荐 etcd 实践"。
1.2. 了解 etcd 性能 复制链接链接已复制到粘贴板!
由于一致的分布式键值存储作为复制节点集群运行,etcd 会按照 Raft 算法将一个节点选为领导(leader),其它为跟随者(follower)。领导机维护系统的当前状态,并确保跟随者有最新的信息。
领导节点负责日志复制。它处理从客户端传入的写入事务,并写一个 Raft 日志条目,然后再将其广播到跟随者。
当一个 etcd 客户端(如 kube-apiserver)连接到一个 etcd 成员,它在请求一个需要仲裁的操作(如写一个值),如果 etcd 成员是跟随者,它会返回一个信息声明相关的事务需要转给领导。
当 etcd 客户端从需要仲裁的领导请求一个操作(如写一个值),领导会保持客户端的连接,同时写入本地 Raft 日志,将日志广播到跟随者,并等待大多数跟随者确认已提交日志并且没有错误。领导将确认发送到 etcd 客户端并关闭会话。如果从跟随者收到失败通知且没有满足共识,则领导会将错误消息返回到客户端并关闭会话。
etcd 的 OpenShift Container Platform 计时器条件
OpenShift Container Platform 会维护已为每个平台优化的 etcd 计时器。OpenShift Container Platform 已规定了为各个平台供应商优化的验证值。带有 platform=none 或 platform=metal 值的默认 etcd 计时器 参数如下:
- name: ETCD_ELECTION_TIMEOUT value: "1000" ... - name: ETCD_HEARTBEAT_INTERVAL value: "100"
- name: ETCD_ELECTION_TIMEOUT
value: "1000"
...
- name: ETCD_HEARTBEAT_INTERVAL
value: "100"
这些参数不会为 control plane 或 etcd 提供所有信息。etcd 集群对磁盘延迟非常敏感。因为 etcd 必须在其日志中保留提议,所以来自其他进程的磁盘活动可能会导致长时间 fsync 延迟。因此,etcd 可能会丢失心跳,从而导致请求超时和临时领导丢失。在领导丢失和重新选举的过程中,Kubernetes API 无法处理任何请求,并可能出现对集群服务有影响的事件,并造成集群不稳定。
磁盘延迟对 etcd 的影响
etcd 集群对磁盘延迟非常敏感。要了解 control plane 环境中 etcd 遇到的磁盘延迟问题,请运行 Flexible I/O Tester (fio) 测试或套件,以检查 OpenShift Container Platform 中的 etcd 磁盘性能。
仅使用 fio 测试来测量特定时间点的磁盘延迟。此测试没有考虑到在生产环境中 etcd 可能会遇到的长期磁盘行为和其他磁盘工作负载。
确保最终报告的磁盘状态适用于 etcd,如下例所示:
... 99th percentile of fsync is 5865472 ns 99th percentile of the fsync is within the suggested threshold: - 20 ms, the disk can be used to host etcd
...
99th percentile of fsync is 5865472 ns
99th percentile of the fsync is within the suggested threshold: - 20 ms, the disk can be used to host etcd
当使用高延迟磁盘时,会显示磁盘不推荐用于 etcd 的信息,如下例所示:
... 99th percentile of fsync is 15865472 ns 99th percentile of the fsync is greater than the suggested value which is 20 ms, faster disks are suggested to host etcd for better performance
...
99th percentile of fsync is 15865472 ns
99th percentile of the fsync is greater than the suggested value which is 20 ms, faster disks are suggested to host etcd for better performance
当集群部署跨越了多个数据中心,用于 etcd 的磁盘不满足推荐的延迟标准,则可能会出现对到服务有影响的失败情况。另外,control plane 可容忍的网络延迟会显著降低。
网络延迟和 jitter 对 etcd 的影响
使用最大传输单元 (MTU) 发现和验证部分中介绍的工具来获取平均网络延迟和最大网络延迟。
心跳(heartbeat)间隔的值应大约是成员之间平均的往返时间 (RTT) 的最大值,通常大约是往返时间的 1.5 倍。OpenShift Container Platform 的默认心跳间隔为 100 ms,推荐的 control plane 节点之间的 RTT 小于 33 ms,最大小于 66 ms (66 ms x 1.5 = 99 ms)。任何大于这些值的网络延迟都可能会导致服务影响事件和集群不稳定。
网络延迟由多种因素决定,包括传输网络技术决定,如 copper、Fiber、wireless 或 satellite,在传输网络中网络设备的数量和质量,以及其他因素。
要进行精确计算,在考虑网络延迟时需要考虑到网络 jitter。网络 jitter 对网络延迟的影响,或接收的数据包延迟的影响根据具体情况会有所不同。在高效的网络条件中,jitter 应该为零。网络 jitter 对 etcd 的网络延迟计算有影响,因为在一段时间内实际网络延迟应该是 RTT 加上或减去 Jitter。
例如,一个网络的最大延迟为 80 ms,jitter 为 30 ms,则可能会出现 110 ms 的延迟,这意味着 etcd 会丢失心跳。这种情况会导致请求超时和临时丢失领导。在领导丢失和重新选举的过程中,Kubernetes API 无法处理任何请求,并可能出现对集群服务有影响的事件,并造成集群不稳定。
共识延迟对 etcd 的影响
过程只在一个活跃的集群中运行。在规划集群部署时,应已完成磁盘或网络测试。该测试会在部署后验证和监控集群健康状况。
通过使用 etcdctl CLI,您可以观察到 etcd 达成共识的延迟。您必须识别其中一个 etcd pod,然后检索端点健康状况。
etcd peer 往返时间对性能的影响
etcd peer 往返时间与网络往返时间不同。此计算是一种端到端测试指标,它包括了如何在成员间快速进行复制的方式。
etcd peer 往返时间是一个指标数据,显示 etcd 完成在所有 etcd 成员间复制客户端请求的延迟。OpenShift Container Platform 控制台提供仪表板来视觉化各种 etcd 指标。在控制台中,点 Observe → Dashboards。从下拉列表中,选择 etcd。
总结了 etcd peer 往返时间的图表位于 etcd Dashboard 页面的末尾。
数据库大小对 etcd 的影响
etcd 数据库大小对完成 etcd 碎片整理过程的时间有之间影响。当 OpenShift Container Platform 检测到至少 45% 的碎片时会自动执行 etcd 碎片整理(一次在一个 etcd 成员中执行)。在进行碎片整理过程中,etcd 成员无法处理任何请求。对于较小的 etcd 数据库,碎片整理过程的时间一般会小于一秒。对于较大的 etcd 数据库,磁盘延迟会直接影响到碎片时间,从而导致额外的延迟,因为在进行碎片整理的过程中会阻止其它操作。
当网络分区在一段时间内隔离 control plane 节点时 etcd 数据库的大小是的一个考虑因素,control plane 需要在通讯重新建立后同步。
存在一个控制 etcd 数据库大小的最小选项,因为它依赖于系统中的 Operator 和应用程序。当您考虑系统运行的延迟范围时,请考虑同步或按 etcd 数据库大小进行碎片整理的影响。
影响的程度特定于部署。完成碎片处理的时间会在事务率中造成降级,因为 etcd 成员在碎片处理过程中无法接受更新。同样,对于有高的改变频率的大型数据库,etcd 重新同步的时间会影响到系统上的事务率和事务延迟。在计划影响类型时,请考虑以下两个示例。
第一个基于数据库大小的 etcd 碎片处理的影响示例是,将一个 1 GB etcd 数据库写入到一个较慢的 7200 RPM 磁盘,速度是每秒 80 Mb,这大约需要 1 分 40 秒。在这样的场景中,碎片整理过程所需的时间最少要比这个时间更长才能完成碎片整理。
第二个数据库大小对 etcd 同步影响的示例是,如果在其中一个 control plane 节点断开连接时更改了 etcd 数据库的 10%,则同步需要至少传输 100 MB。通过 1 Gbps 链接传输 100 MB 时会需要 800 ms。在使用 Kubernetes API 的常规事务的集群中,etcd 数据库大小越大,越可能出现网络不稳定的情况,会导致 control plane 不稳定。
在 OpenShift Container Platform 中,etcd 仪表板有一个图表,用于报告 etcd 数据库的大小。另外,您可以使用 etcdctl 工具从 CLI 获取数据库大小。
oc get pods -n openshift-etcd -l app=etcd
# oc get pods -n openshift-etcd -l app=etcd
输出示例
NAME READY STATUS RESTARTS AGE etcd-m0 4/4 Running 4 22h etcd-m1 4/4 Running 4 22h etcd-m2 4/4 Running 4 22h
NAME READY STATUS RESTARTS AGE
etcd-m0 4/4 Running 4 22h
etcd-m1 4/4 Running 4 22h
etcd-m2 4/4 Running 4 22h
oc exec -t etcd-m0 -- etcdctl endpoint status -w simple | cut -d, -f 1,3,4
# oc exec -t etcd-m0 -- etcdctl endpoint status -w simple | cut -d, -f 1,3,4
输出示例
https://198.18.111.12:2379, 3.5.6, 1.1 GB https://198.18.111.13:2379, 3.5.6, 1.1 GB https://198.18.111.14:2379, 3.5.6, 1.1 GB
https://198.18.111.12:2379, 3.5.6, 1.1 GB
https://198.18.111.13:2379, 3.5.6, 1.1 GB
https://198.18.111.14:2379, 3.5.6, 1.1 GB
Kubernetes API 事务率对 etcd 的影响
当您使用扩展 control plane 时,Kebernetes API 事务率取决于特定部署的特性。它取决于 etcd 磁盘延迟、etcd 往返时间以及写入 API 的对象大小的组合。因此,当使用扩展 control plane 时,集群管理员需要测试环境,以确定其环境的可持续事务率。kube-burner 工具可用于此目的。
为您的环境确定 Kubernetes API 事务率
您无法在不测量 Kubernetes API 的情况下确定 Kubernetes API 的事务率。用于测试 control plane 的工具之一是 kube-burner。二进制文件提供了一个 OpenShift Container Platform 打包程序来测试 OpenShift Container Platform 集群。它用于测试集群或节点密度。对于测试 control plane,kube-burner ocp 有三个工作负载配置集:cluster-density, cluster-density-v2, 和 cluster-density-ms。每个工作负载配置集创建一系列资源,旨在加载控制。
第 2 章 推荐的 etcd 实践 复制链接链接已复制到粘贴板!
以下文档提供有关 etcd 推荐的性能和可扩展性实践的信息。
2.1. etcd 的存储实践 复制链接链接已复制到粘贴板!
因为 etcd 将数据写入磁盘并在磁盘上持久化,所以其性能取决于磁盘性能。虽然 etcd 并不是有非常高的 I/O 负载,但它需要使用一个具有低延迟的块设备才能获得最佳性能和稳定性。因为 etcd 的共识协议依赖于将元数据永久存储在日志中 (WAL),所以 etcd 对磁盘写入延迟非常敏感。减慢来自其他进程的磁盘活动和磁盘活动可能会导致长时间的 fsync 延迟。
这些延迟可能会导致 etcd 丢失心跳,不会及时向磁盘提交新的建议,并最终遇到请求超时和临时丢失问题。高写入延迟也会导致 OpenShift API 较慢,这会影响集群性能。由于这些原因,请避免在具有 I/O 敏感或密集型的 control-plane 节点上并置其他工作负载,并共享相同的底层 I/O 基础架构。
在可以在 10ms 内按顺序至少写入 50 IOPS 8KB(包括 fdatasync)的块设备中运行 etcd。对于高负载的集群,建议使用 8000 字节的连续 500 IOPS (2 毫秒)。要测量这些数字,您可以使用基准测试工具,如 fio 命令。
要实现这样的性能,在由低延迟和高吞吐量的 SSD 或 NVMe 磁盘支持的机器上运行 etcd。考虑使用单层单元(SLC)固态驱动器(SSD)(它为每个内存单元提供 1 位),这是可靠的,非常适合于写密集型工作负载。
影响 etcd 上的负载的因素包括静态因素,如节点和 pod 的数量,以及动态因素,包括因为 pod 自动扩展、pod 重启、作业执行和其他与工作负载相关的事件,以及其他与负载相关的事件。要准确调整 etcd 设置的大小,您必须分析工作负载的特定要求。考虑影响 etcd 负载的节点、pod 和其他相关因素的数量。
以下硬盘驱动器实践提供最佳的 etcd 性能:
- 使用专用 etcd 驱动器。避免通过网络通信的驱动器,如 iSCSI。不要将日志文件或其他重重工作负载放在 etcd 驱动器中。
- 首选驱动低延迟来支持快速读写操作。
- 首选高带宽写入,以便更快地压缩和整理碎片。
- 首选高带宽读取,以便更快地从故障恢复。
- 使用固态硬盘作为最低选择。在生产环境中首选 NVMe 驱动器。
- 使用服务器级硬件提高可靠性。
- 避免 NAS 或 SAN 设置,以及旋转驱动器。Ceph Rados 块设备 (RBD) 和其他类型的网络附加存储可能会导致网络延迟无法预计。要大规模向 etcd 节点提供快速存储,请使用 PCI 透传将 NVM 设备直接传递给节点。
-
始终使用
fio等工具进行基准测试。当集群性能增加时,您可以使用这些工具不断监控集群性能。 - 避免使用网络文件系统 (NFS) 协议或其他基于网络的文件系统。
需要在部署的 OpenShift Container Platform 集群上监控的一些关键指标包括,日志持续时间之前的 etcd 磁盘写入的 p99 值,以及 etcd leader 更改的数量。使用 Prometheus 跟踪这些指标。
在正常操作过程中,etcd 成员数据库大小可能会因集群而异。这种差异不会影响集群升级,即使领导大小与其他成员不同。
2.2. 验证用于 etcd 的硬件 复制链接链接已复制到粘贴板!
要在创建 OpenShift Container Platform 集群之前或之后验证 etcd 的硬件,您可以使用 fio。
先决条件
- 您正在测试的机器上安装了 Podman 或 Docker 等容器运行时。
-
数据被写入
/var/lib/etcd路径。
流程
运行 fio 并分析结果:
如果使用 Podman,请运行以下命令:
sudo podman run --volume /var/lib/etcd:/var/lib/etcd:Z quay.io/cloud-bulldozer/etcd-perf
$ sudo podman run --volume /var/lib/etcd:/var/lib/etcd:Z quay.io/cloud-bulldozer/etcd-perfCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果使用 Docker,请运行以下命令:
sudo docker run --volume /var/lib/etcd:/var/lib/etcd:Z quay.io/cloud-bulldozer/etcd-perf
$ sudo docker run --volume /var/lib/etcd:/var/lib/etcd:Z quay.io/cloud-bulldozer/etcd-perfCopy to Clipboard Copied! Toggle word wrap Toggle overflow
输出会报告磁盘是否足够快以运行 etcd,它会检查测试运行中获得的 fsync 指标的 p99 值是否小于 10ms。一些最重要的 etcd 指标可能受到 I/O 性能的影响,如下所示:
-
etcd_disk_wal_fsync_duration_seconds_bucket指标报告了 etcd 的 WAL fsync 持续时间。 -
etcd_disk_backend_commit_duration_seconds_bucket指标报告 etcd 后端提交延迟持续时间 -
etcd_server_leader_changes_seen_total指标报告领导更改
etcd 在所有成员间复制请求,因此其性能会严重依赖于网络输入/输出(I/O)的延迟。大量网络延迟会导致 etcd heartbeat 的时间比选举超时时间更长,这会导致一个可能会对集群造成破坏的领导选举。在部署的 OpenShift Container Platform 集群上监控的一个关键指标是每个 etcd 集群成员上的 etcd 网络对延迟的 p99 百分比。使用 Prometheus 跟踪指标数据。
histogram_quantile(0.99, rate(etcd_network_peer_round_trip_time_seconds_bucket[2m]) 指标报告 etcd 在成员间复制客户端请求的时间。确保它小于 50 ms。
第 3 章 etcd 的性能注意事项 复制链接链接已复制到粘贴板!
为确保 OpenShift Container Platform 中 etcd 的最佳性能和可扩展性,您可以完成以下实践:
3.1. etcd 的节点扩展 复制链接链接已复制到粘贴板!
通常,集群必须具有 3 个 control plane 节点。但是,如果您的集群安装在裸机平台上,则最多可有 5 个 control plane 节点。如果现有裸机集群少于 5 个 control plane 节点,您可以作为一个安装后任务对集群进行扩展。
例如,要在安装后从 3 个 control plane 节点扩展到 4 个,您可以添加主机并将其作为 control plane 节点安装。然后,etcd Operator 会相应地扩展,以考虑额外的 control plane 节点。
扩展集群到 4 个或 5 个 control plane 节点仅在裸机平台上可用。
有关如何使用 Assisted Installer 扩展 control plane 节点的更多信息,请参阅"使用 API 添加主机"和"将 control plane 节点放在健康集群中"。
下表显示了不同大小的集群的容错能力:
| 集群大小 | 大多数 | 故障容错 |
|---|---|---|
| 1 个节点 | 1 | 0 |
| 3 个节点 | 2 | 1 |
| 4 个节点 | 3 | 1 |
| 5 个节点 | 3 | 2 |
有关恢复仲裁丢失的更多信息,请参阅"恢复到之前的集群状态"。
3.2. 将 etcd 移动到不同的磁盘 复制链接链接已复制到粘贴板!
您可以将 etcd 从共享磁盘移到独立磁盘,以防止或解决性能问题。
Machine Config Operator (MCO) 负责为 OpenShift Container Platform 4.19 容器存储挂载辅助磁盘。
这个编码脚本只支持以下设备类型的设备名称:
- SCSI 或 SATA
-
/dev/sd* - 虚拟设备
-
/dev/vd* - NVMe
-
/dev/nvme*[0-9]*n*
限制:
-
当新磁盘附加到集群时,etcd 数据库是 root 挂载的一部分。当主节点被重新创建时,它不是二级磁盘的一部分或预期的磁盘。因此,主节点不会创建单独的
/var/lib/etcd挂载。
先决条件
- 有集群的 etcd 数据备份。
-
已安装 OpenShift CLI(
oc)。 -
您可以使用
cluster-admin权限访问集群。 - 在上传机器配置前添加额外的磁盘。
-
MachineConfigPool必须与metadata.labels[machineconfiguration.openshift.io/role]匹配。这适用于控制器、worker 或自定义池。
这个过程不会将 root 文件系统的部分内容(如 /var/ )移到已安装节点上的另一个磁盘或分区。
使用 control plane 机器集时不支持这个过程。
流程
将新磁盘附加到集群,并在 debug shell 中运行
lsblk命令来验证节点中是否检测到磁盘:oc debug node/<node_name>
$ oc debug node/<node_name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow lsblk
# lsblkCopy to Clipboard Copied! Toggle word wrap Toggle overflow 记录下
lsblk命令报告的新磁盘的设备名称。创建以下脚本,并将其命名为
etcd-find-secondary-device.sh:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 将
<device_type_glob>替换为您的块设备类型的 shell glob。对于 SCSI 或 SATA 驱动器,使用/dev/sd*; 对于虚拟驱动器,使用/dev/vd*; 对于 NVMe 驱动器,使用/dev/nvme*[0-9]*n*。
从
etcd-find-secondary-device.sh脚本创建一个 base64 编码的字符串,并记录它的内容:base64 -w0 etcd-find-secondary-device.sh
$ base64 -w0 etcd-find-secondary-device.shCopy to Clipboard Copied! Toggle word wrap Toggle overflow 创建名为
etcd-mc.yml的MachineConfigYAML 文件,其内容如下:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 将
<encoded_etcd_find_secondary_device_script>替换为您记录的编码脚本内容。
应用创建的
MachineConfigYAML 文件:oc create -f etcd-mc.yml
$ oc create -f etcd-mc.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证步骤
在节点的 debug shell 中运行
grep /var/lib/etcd /proc/mounts命令,以确保挂载磁盘:oc debug node/<node_name>
$ oc debug node/<node_name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow grep -w "/var/lib/etcd" /proc/mounts
# grep -w "/var/lib/etcd" /proc/mountsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
/dev/sdb /var/lib/etcd xfs rw,seclabel,relatime,attr2,inode64,logbufs=8,logbsize=32k,noquota 0 0
/dev/sdb /var/lib/etcd xfs rw,seclabel,relatime,attr2,inode64,logbufs=8,logbsize=32k,noquota 0 0Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.3. 分离 etcd 数据 复制链接链接已复制到粘贴板!
对于大型、高密度的集群,如果键空间增长过大并超过空间配额,etcd 的性能将会受到影响。定期维护并处理碎片化的 etcd,以释放数据存储中的空间。监控 Prometheus 以了解 etcd 指标数据,并在需要时对其进行碎片处理;否则,etcd 可能会引发一个集群范围的警报,使集群进入维护模式,仅能接受对键的读和删除操作。
监控这些关键指标:
-
etcd_server_quota_backend_bytes,这是当前配额限制 -
etcd_mvcc_db_total_size_in_use_in_bytes,表示历史压缩后实际数据库使用量 -
etcd_mvcc_db_total_size_in_bytes显示数据库大小,包括等待碎片整理的可用空间
在导致磁盘碎片的事件后(如 etcd 历史记录紧凑)对 etcd 数据进行清理以回收磁盘空间。
历史压缩将自动每五分钟执行一次,并在后端数据库中造成混乱。此碎片空间可供 etcd 使用,但主机文件系统不可用。您必须对碎片 etcd 进行碎片清除,才能使这个空间可供主机文件系统使用。
碎片清理会自动发生,但您也可以手动触发它。
自动清理碎片非常适合大多数情况,因为 etcd operator 使用集群信息来确定用户最有效的操作。
3.3.1. 自动清理 复制链接链接已复制到粘贴板!
etcd Operator 自动清理碎片磁盘。不需要人工干预。
查看以下日志之一来验证碎片整理过程是否成功:
- etcd 日志
- cluster-etcd-operator pod
- Operator 状态错误日志
自动清除可能会导致各种 OpenShift 核心组件中的领导选举失败,如 Kubernetes 控制器管理器,这会触发重启失败的组件。重启会有危害,并会触发对下一个正在运行的实例的故障切换,或者组件在重启后再次恢复工作。
成功进行碎片处理的日志输出示例
etcd member has been defragmented: <member_name>, memberID: <member_id>
etcd member has been defragmented: <member_name>, memberID: <member_id>
进行碎片处理失败的日志输出示例
failed defrag on member: <member_name>, memberID: <member_id>: <error_message>
failed defrag on member: <member_name>, memberID: <member_id>: <error_message>
3.3.2. 手动清理 复制链接链接已复制到粘贴板!
Prometheus 警报指示您需要手动进行碎片处理。该警报在两个情况下显示:
- 当 etcd 使用超过 50% 的可用空间超过了 10 分钟
- 当 etcd 活跃使用小于其数据库总大小的 50% 超过了 10 分钟
您还可以通过检查 etcd 数据库大小(MB)来决定是否需要进行碎片整理。通过 PromQL 表达 (etcd_mvcc_db_total_size_in_bytes - etcd_mvcc_db_total_size_in_use_in_bytes)/1024/1024 来释放空间。
分离 etcd 是一个阻止性操作。在进行碎片处理完成前,etcd 成员将没有响应。因此,在每个下一个 pod 要进行碎片清理前,至少等待一分钟,以便集群可以恢复正常工作。
按照以下步骤对每个 etcd 成员上的 etcd 数据进行碎片处理。
先决条件
-
您可以使用具有
cluster-admin角色的用户访问集群。
流程
确定哪个 etcd 成员是领导成员,因为领导会进行最后的碎片处理。
获取 etcd pod 列表:
oc -n openshift-etcd get pods -l k8s-app=etcd -o wide
$ oc -n openshift-etcd get pods -l k8s-app=etcd -o wideCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
etcd-ip-10-0-159-225.example.redhat.com 3/3 Running 0 175m 10.0.159.225 ip-10-0-159-225.example.redhat.com <none> <none> etcd-ip-10-0-191-37.example.redhat.com 3/3 Running 0 173m 10.0.191.37 ip-10-0-191-37.example.redhat.com <none> <none> etcd-ip-10-0-199-170.example.redhat.com 3/3 Running 0 176m 10.0.199.170 ip-10-0-199-170.example.redhat.com <none> <none>
etcd-ip-10-0-159-225.example.redhat.com 3/3 Running 0 175m 10.0.159.225 ip-10-0-159-225.example.redhat.com <none> <none> etcd-ip-10-0-191-37.example.redhat.com 3/3 Running 0 173m 10.0.191.37 ip-10-0-191-37.example.redhat.com <none> <none> etcd-ip-10-0-199-170.example.redhat.com 3/3 Running 0 176m 10.0.199.170 ip-10-0-199-170.example.redhat.com <none> <none>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 选择 pod 并运行以下命令来确定哪个 etcd 成员是领导:
oc rsh -n openshift-etcd etcd-ip-10-0-159-225.example.redhat.com etcdctl endpoint status --cluster -w table
$ oc rsh -n openshift-etcd etcd-ip-10-0-159-225.example.redhat.com etcdctl endpoint status --cluster -w tableCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 基于此输出的
IS LEADER列,https://10.0.199.170:2379端点是领导。与上一步输出匹配此端点,领导的 pod 名称为etcd-ip-10-0-199-170.example.redhat.com。
清理 etcd 成员。
连接到正在运行的 etcd 容器,传递 不是 领导的 pod 的名称:
oc rsh -n openshift-etcd etcd-ip-10-0-159-225.example.redhat.com
$ oc rsh -n openshift-etcd etcd-ip-10-0-159-225.example.redhat.comCopy to Clipboard Copied! Toggle word wrap Toggle overflow 取消设置
ETCDCTL_ENDPOINTS环境变量:unset ETCDCTL_ENDPOINTS
sh-4.4# unset ETCDCTL_ENDPOINTSCopy to Clipboard Copied! Toggle word wrap Toggle overflow 清理 etcd 成员:
etcdctl --command-timeout=30s --endpoints=https://localhost:2379 defrag
sh-4.4# etcdctl --command-timeout=30s --endpoints=https://localhost:2379 defragCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Finished defragmenting etcd member[https://localhost:2379]
Finished defragmenting etcd member[https://localhost:2379]Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果发生超时错误,增加
--command-timeout的值,直到命令成功为止。验证数据库大小是否已缩小:
etcdctl endpoint status -w table --cluster
sh-4.4# etcdctl endpoint status -w table --clusterCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 本例显示这个 etcd 成员的数据库大小现在为 41 MB,而起始大小为 104 MB。
重复这些步骤以连接到其他 etcd 成员并进行碎片处理。最后才对领导进行碎片清除。
至少要在碎片处理操作之间等待一分钟,以便 etcd pod 可以恢复。在 etcd pod 恢复前,etcd 成员不会响应。
如果因为超过空间配额而触发任何
NOSPACE警告,请清除它们。检查是否有
NOSPACE警告:etcdctl alarm list
sh-4.4# etcdctl alarm listCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
memberID:12345678912345678912 alarm:NOSPACE
memberID:12345678912345678912 alarm:NOSPACECopy to Clipboard Copied! Toggle word wrap Toggle overflow 清除警告:
etcdctl alarm disarm
sh-4.4# etcdctl alarm disarmCopy to Clipboard Copied! Toggle word wrap Toggle overflow
3.4. 为 etcd 设置调优参数 复制链接链接已复制到粘贴板!
您可以将 control plane 硬件速度设置为 "Standard"、"Slower" 或默认值,即 ""。
默认设置允许系统决定使用哪个速度。这个值允许从此功能不存在的版本进行升级,因为系统可以从之前的版本中选择值。
通过选择其中一个其他值,您要覆盖默认值。如果您看到由于超时或丢失了心跳而导致的很多领导选举机制,且您的系统被设置为 "" 或 "Standard",请将硬件速度设置为 "Slower",使系统能够更好地接受增加延迟。
3.4.1. 更改硬件速度容错 复制链接链接已复制到粘贴板!
要更改 etcd 的硬件速度容错功能,请完成以下步骤。
流程
输入以下命令来查看当前值:
oc describe etcd/cluster | grep "Control Plane Hardware Speed"
$ oc describe etcd/cluster | grep "Control Plane Hardware Speed"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Control Plane Hardware Speed: <VALUE>
Control Plane Hardware Speed: <VALUE>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意如果输出为空,则未设置该字段,并且应被视为默认值("")。
输入以下命令来更改值。将
<value>替换为一个有效值:""、"Standard"或"Slower":oc patch etcd/cluster --type=merge -p '{"spec": {"controlPlaneHardwareSpeed": "<value>"}}'$ oc patch etcd/cluster --type=merge -p '{"spec": {"controlPlaneHardwareSpeed": "<value>"}}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 下表显示了每个配置集的心跳间隔和领导选举超时。这些值可能随时更改。
Expand profile
ETCD_HEARTBEAT_INTERVAL
ETCD_LEADER_ELECTION_TIMEOUT
""根据平台的不同而有所不同
根据平台的不同而有所不同
Standard(标准)100
1000
速度较慢500
2500
查看输出:
输出示例
etcd.operator.openshift.io/cluster patched
etcd.operator.openshift.io/cluster patchedCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您输入了有效值之外的任何值,则会显示错误输出。例如,如果您以值形式输入
"Faster",输出如下:输出示例
The Etcd "cluster" is invalid: spec.controlPlaneHardwareSpeed: Unsupported value: "Faster": supported values: "", "Standard", "Slower"
The Etcd "cluster" is invalid: spec.controlPlaneHardwareSpeed: Unsupported value: "Faster": supported values: "", "Standard", "Slower"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输入以下命令验证值是否已更改:
oc describe etcd/cluster | grep "Control Plane Hardware Speed"
$ oc describe etcd/cluster | grep "Control Plane Hardware Speed"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Control Plane Hardware Speed: ""
Control Plane Hardware Speed: ""Copy to Clipboard Copied! Toggle word wrap Toggle overflow 等待 etcd pod 推出:
oc get pods -n openshift-etcd -w
$ oc get pods -n openshift-etcd -wCopy to Clipboard Copied! Toggle word wrap Toggle overflow 以下输出显示了 master-0 的预期条目。继续之前,等到所有 master 都显示为
4/4 Running。输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输入以下命令查看值:
oc describe -n openshift-etcd pod/<ETCD_PODNAME> | grep -e HEARTBEAT_INTERVAL -e ELECTION_TIMEOUT
$ oc describe -n openshift-etcd pod/<ETCD_PODNAME> | grep -e HEARTBEAT_INTERVAL -e ELECTION_TIMEOUTCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注意这些值可能没有从默认值更改。
3.5. 增加 etcd 的数据库大小 复制链接链接已复制到粘贴板!
您可以为每个 etcd 实例设置 gibibytes (GiB)中的磁盘配额。如果为 etcd 实例设置磁盘配额,您可以指定整数值(从 8 到 32)。默认值为 8。您只能指定增加的值。
如果您遇到 低空间 警报,则可能需要增加磁盘配额。此警报表示尽管进行自动压缩和碎片处理,对于 etcd, 集群太大了。如果您看到此警报,则需要立即增加磁盘配额,因为在 etcd 耗尽空间后,写入会失败。
如果遇到过量数据库增长警告,可能是需要提高磁盘配额的另一个场景是。此警报是一个警告,数据库可能会在接下来的四小时内增长过大。在这种情况下,请考虑增加磁盘配额,以便您最终不会遇到 低空间 警报,以及可能的写入失败问题。
如果您增加磁盘配额,您所指定的磁盘空间不会被立即保留。相反,如果需要,etcd 可能会增大到这个大小。确保 etcd 在专用磁盘上运行,该磁盘大于您为磁盘配额指定的值。
对于大型 etcd 数据库,control plane 节点必须有额外的内存和存储。因为您必须考虑 API 服务器缓存,所以至少是 etcd 数据库配置大小的 3 倍。
为 etcd 增加数据库大小只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
3.5.1. 更改 etcd 数据库大小 复制链接链接已复制到粘贴板!
要更改 etcd 的数据库大小,请完成以下步骤。
流程
输入以下命令检查每个 etcd 实例的磁盘配额的当前值:
oc describe etcd/cluster | grep "Backend Quota"
$ oc describe etcd/cluster | grep "Backend Quota"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Backend Quota Gi B: <value>
Backend Quota Gi B: <value>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输入以下命令更改磁盘配额的值:
oc patch etcd/cluster --type=merge -p '{"spec": {"backendQuotaGiB": <value>}}'$ oc patch etcd/cluster --type=merge -p '{"spec": {"backendQuotaGiB": <value>}}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
etcd.operator.openshift.io/cluster patched
etcd.operator.openshift.io/cluster patchedCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
输入以下命令验证是否设置了磁盘配额的新值:
oc describe etcd/cluster | grep "Backend Quota"
$ oc describe etcd/cluster | grep "Backend Quota"Copy to Clipboard Copied! Toggle word wrap Toggle overflow etcd Operator 会自动使用新值推出 etcd 实例。
输入以下命令验证 etcd pod 是否正在运行:
oc get pods -n openshift-etcd
$ oc get pods -n openshift-etcdCopy to Clipboard Copied! Toggle word wrap Toggle overflow 以下输出显示了预期的条目。
输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输入以下命令验证 etcd pod 是否更新了磁盘配额值:
oc describe -n openshift-etcd pod/<etcd_podname> | grep "ETCD_QUOTA_BACKEND_BYTES"
$ oc describe -n openshift-etcd pod/<etcd_podname> | grep "ETCD_QUOTA_BACKEND_BYTES"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 该值可能没有改变默认值
8。输出示例
ETCD_QUOTA_BACKEND_BYTES: 8589934592
ETCD_QUOTA_BACKEND_BYTES: 8589934592Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意虽然您设置的值以 GiB 为单位的整数,但输出中显示的值将会转换为以字节为单位。
3.5.2. 故障排除 复制链接链接已复制到粘贴板!
如果您在尝试增加 etcd 数据库大小时遇到问题,则以下故障排除步骤可能会有所帮助。
3.5.2.1. 值太小 复制链接链接已复制到粘贴板!
如果您指定的值小于 8,您会看到以下出错信息:
oc patch etcd/cluster --type=merge -p '{"spec": {"backendQuotaGiB": 5}}'
$ oc patch etcd/cluster --type=merge -p '{"spec": {"backendQuotaGiB": 5}}'
错误信息示例
The Etcd "cluster" is invalid: * spec.backendQuotaGiB: Invalid value: 5: spec.backendQuotaGiB in body should be greater than or equal to 8 * spec.backendQuotaGiB: Invalid value: "integer": etcd backendQuotaGiB may not be decreased
The Etcd "cluster" is invalid:
* spec.backendQuotaGiB: Invalid value: 5: spec.backendQuotaGiB in body should be greater than or equal to 8
* spec.backendQuotaGiB: Invalid value: "integer": etcd backendQuotaGiB may not be decreased
要解决这个问题,请指定 8 到 32 之间的一个整数值。
3.5.2.2. 值太大 复制链接链接已复制到粘贴板!
如果您指定的值大于 32,您会看到以下出错信息:
oc patch etcd/cluster --type=merge -p '{"spec": {"backendQuotaGiB": 64}}'
$ oc patch etcd/cluster --type=merge -p '{"spec": {"backendQuotaGiB": 64}}'
错误信息示例
The Etcd "cluster" is invalid: spec.backendQuotaGiB: Invalid value: 64: spec.backendQuotaGiB in body should be less than or equal to 32
The Etcd "cluster" is invalid: spec.backendQuotaGiB: Invalid value: 64: spec.backendQuotaGiB in body should be less than or equal to 32
要解决这个问题,请指定 8 到 32 之间的一个整数值。
3.5.2.3. 值被减少 复制链接链接已复制到粘贴板!
如果值设为 8 到 32 之间的有效值,则无法减少该值。否则,您会看到错误消息。
输入以下命令来查看当前的值:
oc describe etcd/cluster | grep "Backend Quota"
$ oc describe etcd/cluster | grep "Backend Quota"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Backend Quota Gi B: 10
Backend Quota Gi B: 10Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输入以下命令减少磁盘配额值:
oc patch etcd/cluster --type=merge -p '{"spec": {"backendQuotaGiB": 8}}'$ oc patch etcd/cluster --type=merge -p '{"spec": {"backendQuotaGiB": 8}}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 错误信息示例
The Etcd "cluster" is invalid: spec.backendQuotaGiB: Invalid value: "integer": etcd backendQuotaGiB may not be decreased
The Etcd "cluster" is invalid: spec.backendQuotaGiB: Invalid value: "integer": etcd backendQuotaGiB may not be decreasedCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
要解决这个问题,请指定大于
10的整数。
第 4 章 备份和恢复 etcd 数据 复制链接链接已复制到粘贴板!
4.1. 备份和恢复 etcd 数据 复制链接链接已复制到粘贴板!
作为 OpenShift Container Platform 的键值存储,etcd 会保留所有资源对象的状态。
定期备份集群的 etcd 数据,并将其保存在 OpenShift Container Platform 环境之外的安全位置。不要在第一个证书轮转完成前(安装后的 24 小时内)进行 etcd 备份,否则备份将包含过期的证书。另外,建议您在非高峰期使用 etcd 备份,因为 etcd 快照有较高的 I/O 成本。
在更新集群之前,请务必进行 etcd 备份。在更新前进行备份非常重要,因为在恢复集群时,您必须使用从同一 z-stream 发行版本中获取的 etcd 备份。例如,OpenShift Container Platform 4.17.5 集群必须使用在 4.17.5 中进行的 etcd 备份。
通过在 control plane 主机上执行一次备份脚本来备份集群的 etcd 数据。不要为每个 control plane 主机进行备份。
在进行了 etcd 备份后,就可以恢复到一个以前的集群状态。
4.1.1. 备份 etcd 数据 复制链接链接已复制到粘贴板!
按照以下步骤,通过创建 etcd 快照并备份静态 pod 的资源来备份 etcd 数据。这个备份可以被保存,并在以后需要时使用它来恢复 etcd 数据。
只保存单一 control plane 主机的备份。不要从集群中的每个 control plane 主机进行备份。
先决条件
-
您可以使用具有
cluster-admin角色的用户访问集群。 您已检查是否启用了集群范围代理。
提示您可以通过查看
oc get proxy cluster -o yaml的输出来检查代理是否已启用。如果httpProxy、httpsProxy和noProxy字段设置了值,则会启用代理。
流程
以 root 用户身份为 control plane 节点启动一个 debug 会话:
oc debug --as-root node/<node_name>
$ oc debug --as-root node/<node_name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在 debug shell 中将根目录改为
/host:chroot /host
sh-4.4# chroot /hostCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果启用了集群范围代理,请运行以下命令导出
NO_PROXY、HTTP_PROXY和HTTPS_PROXY环境变量:export HTTP_PROXY=http://<your_proxy.example.com>:8080
$ export HTTP_PROXY=http://<your_proxy.example.com>:8080Copy to Clipboard Copied! Toggle word wrap Toggle overflow export HTTPS_PROXY=https://<your_proxy.example.com>:8080
$ export HTTPS_PROXY=https://<your_proxy.example.com>:8080Copy to Clipboard Copied! Toggle word wrap Toggle overflow export NO_PROXY=<example.com>
$ export NO_PROXY=<example.com>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在 debug shell 中运行
cluster-backup.sh脚本,并传递保存备份的位置。提示cluster-backup.sh脚本作为 etcd Cluster Operator 的一个组件被维护,它是etcdctl snapshot save命令的包装程序(wrapper)。/usr/local/bin/cluster-backup.sh /home/core/assets/backup
sh-4.4# /usr/local/bin/cluster-backup.sh /home/core/assets/backupCopy to Clipboard Copied! Toggle word wrap Toggle overflow 脚本输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在这个示例中,在 control plane 主机上的
/home/core/assets/backup/目录中创建了两个文件:-
snapshot_<datetimestamp>.db:这个文件是 etcd 快照。cluster-backup.sh脚本确认其有效。 static_kuberesources_<datetimestamp>.tar.gz:此文件包含静态 pod 的资源。如果启用了 etcd 加密,它也包含 etcd 快照的加密密钥。注意如果启用了 etcd 加密,建议出于安全考虑,将第二个文件与 etcd 快照分开保存。但是,需要这个文件才能从 etcd 快照中进行恢复。
请记住,etcd 仅对值进行加密,而不对键进行加密。这意味着资源类型、命名空间和对象名称是不加密的。
-
4.1.2. 创建自动的 etcd 备份 复制链接链接已复制到粘贴板!
etcd 的自动备份功能支持重复备份和单一备份。重复备份会创建一个 cron 作业,该作业在每次作业触发时都启动一次备份。
自动 etcd 备份是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
按照以下步骤为 etcd 启用自动备份。
在集群中启用 TechPreviewNoUpgrade 功能集可防止次版本更新。TechPreviewNoUpgrade 功能集无法被禁用。不要在生产环境集群中启用此功能。
先决条件
-
您可以使用具有
cluster-admin角色的用户访问集群。 -
您可以访问 OpenShift CLI(
oc)。
流程
使用以下内容创建名为
enable-tech-preview-no-upgrade.yaml的FeatureGate自定义资源 (CR) 文件:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 应用 CR 并启用自动备份:
oc apply -f enable-tech-preview-no-upgrade.yaml
$ oc apply -f enable-tech-preview-no-upgrade.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 启用相关的 API 需要一些时间。运行以下命令,验证自定义资源定义 (CRD) 的创建:
oc get crd | grep backup
$ oc get crd | grep backupCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
backups.config.openshift.io 2023-10-25T13:32:43Z etcdbackups.operator.openshift.io 2023-10-25T13:32:04Z
backups.config.openshift.io 2023-10-25T13:32:43Z etcdbackups.operator.openshift.io 2023-10-25T13:32:04ZCopy to Clipboard Copied! Toggle word wrap Toggle overflow
4.1.2.1. 创建单个自动 etcd 备份 复制链接链接已复制到粘贴板!
按照以下步骤,通过创建并应用自定义资源 (CR) 来创建单个 etcd 备份。
先决条件
-
您可以使用具有
cluster-admin角色的用户访问集群。 -
您可以访问 OpenShift CLI(
oc)。
流程
如果动态置备的存储可用,请完成以下步骤以创建单个自动 etcd 备份:
创建名为
etcd-backup-pvc.yaml的持久性卷声明 (PVC),其内容如下:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来应用 PVC:
oc apply -f etcd-backup-pvc.yaml
$ oc apply -f etcd-backup-pvc.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令验证 PVC 的创建:
oc get pvc
$ oc get pvcCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE etcd-backup-pvc Bound 51s
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE etcd-backup-pvc Bound 51sCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注意动态 PVC 处于
Pending状态,直到它们被挂载为止。创建名为
etcd-single-backup.yaml的 CR 文件,其内容如下:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 保存备份的 PVC 名称。根据您的环境调整这个值。
应用 CR 以启动单个备份:
oc apply -f etcd-single-backup.yaml
$ oc apply -f etcd-single-backup.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
如果动态置备的存储不可用,请完成以下步骤来创建单个自动 etcd 备份:
创建名为
etcd-backup-local-storage.yaml的StorageClassCR 文件,其内容如下:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来应用
StorageClassCR:oc apply -f etcd-backup-local-storage.yaml
$ oc apply -f etcd-backup-local-storage.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 创建名为
etcd-backup-pv-fs.yaml的 PV,其内容类似以下示例:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令验证 PV 的创建:
oc get pv
$ oc get pvCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE etcd-backup-pv-fs 100Gi RWO Retain Available etcd-backup-local-storage 10s
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE etcd-backup-pv-fs 100Gi RWO Retain Available etcd-backup-local-storage 10sCopy to Clipboard Copied! Toggle word wrap Toggle overflow 创建名为
etcd-backup-pvc.yaml的 PVC,其内容如下:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- PVC 可用的存储量。根据您的要求调整这个值。
运行以下命令来应用 PVC:
oc apply -f etcd-backup-pvc.yaml
$ oc apply -f etcd-backup-pvc.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 创建名为
etcd-single-backup.yaml的 CR 文件,其内容如下:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 将备份保存到的持久性卷声明 (PVC) 的名称。根据您的环境调整这个值。
应用 CR 以启动单个备份:
oc apply -f etcd-single-backup.yaml
$ oc apply -f etcd-single-backup.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
4.1.2.2. 创建重复自动化 etcd 备份 复制链接链接已复制到粘贴板!
按照以下步骤创建自动重复备份 etcd。
如果可能,使用动态置备的存储将创建的 etcd 备份数据保存在安全的外部位置。如果动态置备的存储不可用,请考虑将备份数据存储在 NFS 共享上,以便更易访问备份恢复。
先决条件
-
您可以使用具有
cluster-admin角色的用户访问集群。 -
您可以访问 OpenShift CLI(
oc)。
流程
如果动态置备的存储可用,请完成以下步骤来创建自动重复备份:
创建名为
etcd-backup-pvc.yaml的持久性卷声明 (PVC),其内容如下:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- PVC 可用的存储量。根据您的要求调整这个值。
注意每个供应商都需要更改
accessModes和storageClassName密钥:Expand 供应商 accessModes值storageClassNamevalue带有
versioned-installer-efc_operator-ci配置集的 AWS- ReadWriteManyefs-scGoogle Cloud Platform
- ReadWriteManyfilestore-csiMicrosoft Azure
- ReadWriteManyazurefile-csi运行以下命令来应用 PVC:
oc apply -f etcd-backup-pvc.yaml
$ oc apply -f etcd-backup-pvc.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令验证 PVC 的创建:
oc get pvc
$ oc get pvcCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE etcd-backup-pvc Bound 51s
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE etcd-backup-pvc Bound 51sCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注意动态 PVC 处于
Pending状态,直到它们被挂载为止。
如果动态置备的存储不可用,请完成以下步骤来创建本地存储 PVC:
警告如果您删除或丢失对包含存储备份数据的节点的访问,可能会丢失数据。
创建名为
etcd-backup-local-storage.yaml的StorageClassCR 文件,其内容如下:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来应用
StorageClassCR:oc apply -f etcd-backup-local-storage.yaml
$ oc apply -f etcd-backup-local-storage.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 从应用的
StorageClass中创建一个名为etcd-backup-pv-fs.yaml的 PV,其内容类似以下示例:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 提示运行以下命令来列出可用的节点:
oc get nodes
$ oc get nodesCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令验证 PV 的创建:
oc get pv
$ oc get pvCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE etcd-backup-pv-fs 100Gi RWX Delete Available etcd-backup-local-storage 10s
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE etcd-backup-pv-fs 100Gi RWX Delete Available etcd-backup-local-storage 10sCopy to Clipboard Copied! Toggle word wrap Toggle overflow 创建名为
etcd-backup-pvc.yaml的 PVC,其内容如下:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- PVC 可用的存储量。根据您的要求调整这个值。
运行以下命令来应用 PVC:
oc apply -f etcd-backup-pvc.yaml
$ oc apply -f etcd-backup-pvc.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
创建名为
etcd-recurring-backups.yaml的自定义资源定义 (CRD) 文件。创建的 CRD 的内容定义自动备份的调度和保留类型。对于带有 15 个保留备份的
RetentionNumber的默认保留类型,请使用类似以下示例的内容:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 用于重复备份的
CronTab调度。根据您的需要调整这个值。
要使用基于最大备份数的保留,请在
etcd键中添加以下键值对:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 警告已知问题会导致保留备份的数量大于配置的值。
要根据备份的文件大小保留,请使用:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 以 GB 为单位保留备份的最大文件大小。根据您的需要调整这个值。如果未指定,则默认为 10 GB。
警告已知问题会导致保留备份的最大大小超过配置的值 10 GB。
运行以下命令,创建 CRD 定义的 cron 作业:
oc create -f etcd-recurring-backup.yaml
$ oc create -f etcd-recurring-backup.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 要查找创建的 cron 任务,请运行以下命令:
oc get cronjob -n openshift-etcd
$ oc get cronjob -n openshift-etcdCopy to Clipboard Copied! Toggle word wrap Toggle overflow
4.2. 替换不健康的 etcd 成员 复制链接链接已复制到粘贴板!
替换单个不健康的 etcd 成员的过程取决于 etcd 成员是否不健康(因为机器没有运行或节点未就绪,或者 etcd pod 处于 crashlooping 状态)。
如果您丢失了大多数 control plane 主机,请按照灾难恢复流程恢复到以前的一个集群状态,而不是这个过程。
如果 control plane 证书在被替换的成员中无效,则必须遵循从已过期 control plane 证书中恢复的步骤,而不是此过程。
如果 control plane 节点丢失并且创建了一个新节点,etcd 集群 Operator 将处理生成新 TLS 证书并将节点添加为 etcd 成员。
4.2.1. 找出一个不健康的 etcd 成员 复制链接链接已复制到粘贴板!
您可以识别集群是否有不健康的 etcd 成员。
先决条件
-
您可以使用具有
cluster-admin角色的用户访问集群。 - 已进行 etcd 备份。如需更多信息,请参阅"恢复 etcd 数据"。
流程
使用以下命令检查
EtcdMembersAvailable状态条件的状态:oc get etcd -o=jsonpath='{range .items[0].status.conditions[?(@.type=="EtcdMembersAvailable")]}{.message}{"\n"}{end}'$ oc get etcd -o=jsonpath='{range .items[0].status.conditions[?(@.type=="EtcdMembersAvailable")]}{.message}{"\n"}{end}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 查看输出:
2 of 3 members are available, ip-10-0-131-183.ec2.internal is unhealthy
2 of 3 members are available, ip-10-0-131-183.ec2.internal is unhealthyCopy to Clipboard Copied! Toggle word wrap Toggle overflow 这个示例输出显示
ip-10-0-131-183.ec2.internaletcd 成员不健康。
4.2.2. 确定不健康的 etcd 成员的状态 复制链接链接已复制到粘贴板!
替换不健康 etcd 成员的步骤取决于 etcd 的以下状态:
- 机器没有运行或者该节点未就绪
- etcd pod 处于 crashlooping 状态
此流程决定了 etcd 成员处于哪个状态。这可让您了解替换不健康的 etcd 成员要遵循的步骤。
如果您知道机器没有运行或节点未就绪,但它们应该很快返回健康状态,那么您就不需要执行替换 etcd 成员的流程。当机器或节点返回一个健康状态时,etcd cluster Operator 将自动同步。
先决条件
-
您可以使用具有
cluster-admin角色的用户访问集群。 - 您已找到不健康的 etcd 成员。
流程
检查 机器是否没有运行:
oc get machines -A -ojsonpath='{range .items[*]}{@.status.nodeRef.name}{"\t"}{@.status.providerStatus.instanceState}{"\n"}' | grep -v running$ oc get machines -A -ojsonpath='{range .items[*]}{@.status.nodeRef.name}{"\t"}{@.status.providerStatus.instanceState}{"\n"}' | grep -v runningCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
ip-10-0-131-183.ec2.internal stopped
ip-10-0-131-183.ec2.internal stopped1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 此输出列出了节点以及节点机器的状态。如果状态不是
running,则代表机器没有运行。
如果机器没有运行,按照替换机器没有运行或节点没有就绪的非健康 etcd 成员过程进行操作。
确定 节点是否未就绪。
如果以下任何一种情况是正确的,则代表节点没有就绪。
如果机器正在运行,检查节点是否不可访问:
oc get nodes -o jsonpath='{range .items[*]}{"\n"}{.metadata.name}{"\t"}{range .spec.taints[*]}{.key}{" "}' | grep unreachable$ oc get nodes -o jsonpath='{range .items[*]}{"\n"}{.metadata.name}{"\t"}{range .spec.taints[*]}{.key}{" "}' | grep unreachableCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
ip-10-0-131-183.ec2.internal node-role.kubernetes.io/master node.kubernetes.io/unreachable node.kubernetes.io/unreachable
ip-10-0-131-183.ec2.internal node-role.kubernetes.io/master node.kubernetes.io/unreachable node.kubernetes.io/unreachable1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 如果节点带有
unreachable污点,则节点没有就绪。
如果该节点仍然可访问,则检查该节点是否列为
NotReady:oc get nodes -l node-role.kubernetes.io/master | grep "NotReady"
$ oc get nodes -l node-role.kubernetes.io/master | grep "NotReady"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
ip-10-0-131-183.ec2.internal NotReady master 122m v1.32.3
ip-10-0-131-183.ec2.internal NotReady master 122m v1.32.31 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 如果节点列表为
NotReady,则 该节点没有就绪。
如果节点没有就绪,按照替换机器没有运行或节点没有就绪的 etcd 成员的步骤进行操作。
确定 etcd Pod 是否处于 crashlooping 状态。
如果机器正在运行并且节点已就绪,请检查 etcd pod 是否处于 crashlooping 状态。
验证所有 control plane 节点都列为
Ready:oc get nodes -l node-role.kubernetes.io/master
$ oc get nodes -l node-role.kubernetes.io/masterCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME STATUS ROLES AGE VERSION ip-10-0-131-183.ec2.internal Ready master 6h13m v1.32.3 ip-10-0-164-97.ec2.internal Ready master 6h13m v1.32.3 ip-10-0-154-204.ec2.internal Ready master 6h13m v1.32.3
NAME STATUS ROLES AGE VERSION ip-10-0-131-183.ec2.internal Ready master 6h13m v1.32.3 ip-10-0-164-97.ec2.internal Ready master 6h13m v1.32.3 ip-10-0-154-204.ec2.internal Ready master 6h13m v1.32.3Copy to Clipboard Copied! Toggle word wrap Toggle overflow 检查 etcd pod 的状态是否为
Error或CrashLoopBackOff:oc -n openshift-etcd get pods -l k8s-app=etcd
$ oc -n openshift-etcd get pods -l k8s-app=etcdCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
etcd-ip-10-0-131-183.ec2.internal 2/3 Error 7 6h9m etcd-ip-10-0-164-97.ec2.internal 3/3 Running 0 6h6m etcd-ip-10-0-154-204.ec2.internal 3/3 Running 0 6h6m
etcd-ip-10-0-131-183.ec2.internal 2/3 Error 7 6h9m1 etcd-ip-10-0-164-97.ec2.internal 3/3 Running 0 6h6m etcd-ip-10-0-154-204.ec2.internal 3/3 Running 0 6h6mCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 由于此 pod 的状态是
Error,因此 etcd pod 为 crashlooping 状态。
如果 etcd pod 为 crashlooping 状态,请按照替换 etcd pod 处于 crashlooping 状态的不健康的 etcd 成员的步骤进行操作。
4.2.3. 替换不健康的 etcd 成员 复制链接链接已复制到粘贴板!
根据不健康的 etcd 成员的状态,使用以下一个流程:
- 替换机器没有运行或节点未就绪的不健康 etcd 成员
- 在不健康集群中安装主 control plane 节点
- 替换其 etcd Pod 处于 crashlooping 状态的不健康 etcd 成员
- 替换不健康的裸机 etcd 成员
4.2.3.1. 替换机器没有运行或节点未就绪的不健康 etcd 成员 复制链接链接已复制到粘贴板!
此流程详细介绍了替换因机器没有运行或节点未就绪造成不健康的 etcd 成员的步骤。
如果您的集群使用 control plane 机器集,请参阅"为 etcd 恢复 control plane 机器集"中的"恢复降级的 etcd Operator"。
先决条件
- 您已找出不健康的 etcd 成员。
您已确认机器没有运行,或者该节点未就绪。
重要您必须等待其他 control plane 节点关闭。control plane 节点必须保持关闭状态,直到替换完不健康的 etcd 成员为止。
-
您可以使用具有
cluster-admin角色的用户访问集群。 已进行 etcd 备份。
重要在执行此步骤前,进行 etcd 备份,以便在遇到任何问题时可以恢复集群。
流程
删除不健康的成员。
选择一个不在受影响节点上的 pod:
在一个终端中使用
cluster-admin用户连接到集群,运行以下命令:oc -n openshift-etcd get pods -l k8s-app=etcd
$ oc -n openshift-etcd get pods -l k8s-app=etcdCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
etcd-ip-10-0-131-183.ec2.internal 3/3 Running 0 123m etcd-ip-10-0-164-97.ec2.internal 3/3 Running 0 123m etcd-ip-10-0-154-204.ec2.internal 3/3 Running 0 124m
etcd-ip-10-0-131-183.ec2.internal 3/3 Running 0 123m etcd-ip-10-0-164-97.ec2.internal 3/3 Running 0 123m etcd-ip-10-0-154-204.ec2.internal 3/3 Running 0 124mCopy to Clipboard Copied! Toggle word wrap Toggle overflow 连接到正在运行的 etcd 容器,传递没有在受影响节点上的 pod 的名称:
在一个终端中使用
cluster-admin用户连接到集群,运行以下命令:oc rsh -n openshift-etcd etcd-ip-10-0-154-204.ec2.internal
$ oc rsh -n openshift-etcd etcd-ip-10-0-154-204.ec2.internalCopy to Clipboard Copied! Toggle word wrap Toggle overflow 查看成员列表:
etcdctl member list -w table
sh-4.2# etcdctl member list -w tableCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 记录不健康的 etcd 成员的 ID 和名称,因为稍后需要这些值。
$ etcdctl endpoint health命令将列出已删除的成员,直到完成替换过程并添加了新成员。通过向
etcdctl member remove命令提供 ID 来删除不健康的 etcd 成员 :etcdctl member remove 6fc1e7c9db35841d
sh-4.2# etcdctl member remove 6fc1e7c9db35841dCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Member 6fc1e7c9db35841d removed from cluster ead669ce1fbfb346
Member 6fc1e7c9db35841d removed from cluster ead669ce1fbfb346Copy to Clipboard Copied! Toggle word wrap Toggle overflow 再次查看成员列表,并确认成员已被删除:
etcdctl member list -w table
sh-4.2# etcdctl member list -w tableCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 现在您可以退出节点 shell。
输入以下命令关闭仲裁保护:
oc patch etcd/cluster --type=merge -p '{"spec": {"unsupportedConfigOverrides": {"useUnsupportedUnsafeNonHANonProductionUnstableEtcd": true}}}'$ oc patch etcd/cluster --type=merge -p '{"spec": {"unsupportedConfigOverrides": {"useUnsupportedUnsafeNonHANonProductionUnstableEtcd": true}}}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 此命令可确保您可以成功重新创建机密并推出静态 pod。
重要关闭仲裁保护后,在剩余的 etcd 实例进行重启以使配置改变生效期间,集群可能无法访问。
注意在只使用两个成员运行时,etcd 将无法容忍任何成员失败。重启剩余的成员会破坏仲裁,并导致集群出现停机问题。由于可能导致停机的配置更改,仲裁保护可以防止 etcd 重启,因此必须禁用它才能完成这个过程。
运行以下命令来删除受影响的节点:
oc delete node <node_name>
$ oc delete node <node_name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 示例命令
oc delete node ip-10-0-131-183.ec2.internal
$ oc delete node ip-10-0-131-183.ec2.internalCopy to Clipboard Copied! Toggle word wrap Toggle overflow 删除已删除的不健康 etcd 成员的旧 secret。
列出已删除的不健康 etcd 成员的 secret。
oc get secrets -n openshift-etcd | grep ip-10-0-131-183.ec2.internal
$ oc get secrets -n openshift-etcd | grep ip-10-0-131-183.ec2.internal1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 传递您之前在这个过程中记录的不健康 etcd 成员的名称。
有一个对等的、服务和指标的 secret,如以下输出所示:
输出示例
etcd-peer-ip-10-0-131-183.ec2.internal kubernetes.io/tls 2 47m etcd-serving-ip-10-0-131-183.ec2.internal kubernetes.io/tls 2 47m etcd-serving-metrics-ip-10-0-131-183.ec2.internal kubernetes.io/tls 2 47m
etcd-peer-ip-10-0-131-183.ec2.internal kubernetes.io/tls 2 47m etcd-serving-ip-10-0-131-183.ec2.internal kubernetes.io/tls 2 47m etcd-serving-metrics-ip-10-0-131-183.ec2.internal kubernetes.io/tls 2 47mCopy to Clipboard Copied! Toggle word wrap Toggle overflow 删除已删除的不健康 etcd 成员的 secret。
删除 peer(对等)secret:
oc delete secret -n openshift-etcd etcd-peer-ip-10-0-131-183.ec2.internal
$ oc delete secret -n openshift-etcd etcd-peer-ip-10-0-131-183.ec2.internalCopy to Clipboard Copied! Toggle word wrap Toggle overflow 删除 serving secret:
oc delete secret -n openshift-etcd etcd-serving-ip-10-0-131-183.ec2.internal
$ oc delete secret -n openshift-etcd etcd-serving-ip-10-0-131-183.ec2.internalCopy to Clipboard Copied! Toggle word wrap Toggle overflow 删除 metrics secret:
oc delete secret -n openshift-etcd etcd-serving-metrics-ip-10-0-131-183.ec2.internal
$ oc delete secret -n openshift-etcd etcd-serving-metrics-ip-10-0-131-183.ec2.internalCopy to Clipboard Copied! Toggle word wrap Toggle overflow
输入以下命令检查 control plane 机器集是否存在:
oc -n openshift-machine-api get controlplanemachineset
$ oc -n openshift-machine-api get controlplanemachinesetCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果 control plane 机器集存在,则删除并重新创建 control plane 机器。重新创建此机器后,会强制一个新修订版本并自动扩展 etcd。如需更多信息,请参阅"替换没有运行或节点未就绪"的不健康 etcd 成员"。
如果您正在运行安装程序置备的基础架构,或者您使用 Machine API 创建机器,请按照以下步骤执行。否则,您必须使用最初创建控制平面节点时使用的相同方法创建新的控制平面。
获取不健康成员的机器。
在一个终端中使用
cluster-admin用户连接到集群,运行以下命令:oc get machines -n openshift-machine-api -o wide
$ oc get machines -n openshift-machine-api -o wideCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 这是不健康节点的 control plane 机器
ip-10-0-131-183.ec2.internal。
删除不健康成员的机器:
oc delete machine -n openshift-machine-api clustername-8qw5l-master-0
$ oc delete machine -n openshift-machine-api clustername-8qw5l-master-01 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 为不健康的节点指定 control plane 机器的名称。
删除不健康成员机器后会自动置备新机器。
验证新机器是否已创建:
oc get machines -n openshift-machine-api -o wide
$ oc get machines -n openshift-machine-api -o wideCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 新机器
clustername-8qw5l-master-3将被创建,并当阶段从Provisioning变为Running后就可以使用。
创建新机器可能需要几分钟时间。当机器或节点返回健康状态时,etcd 集群 Operator 会自动同步。
注意验证您用于机器集的子网 ID,以确保它们最终在正确的可用区中。
如果 control plane 机器集不存在,请删除和重新创建 control plane 机器。重新创建此机器后,会强制一个新修订版本并自动扩展 etcd。
如果您正在运行安装程序置备的基础架构,或者您使用 Machine API 创建机器,请按照以下步骤执行。否则,您必须使用最初创建控制平面节点时使用的相同方法创建新的控制平面。
获取不健康成员的机器。
在一个终端中使用
cluster-admin用户连接到集群,运行以下命令:oc get machines -n openshift-machine-api -o wide
$ oc get machines -n openshift-machine-api -o wideCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 这是不健康节点的 control plane 机器
ip-10-0-131-183.ec2.internal。
将机器配置保存到文件系统中的一个文件中:
oc get machine clustername-8qw5l-master-0 \ -n openshift-machine-api \ -o yaml \ > new-master-machine.yaml$ oc get machine clustername-8qw5l-master-0 \1 -n openshift-machine-api \ -o yaml \ > new-master-machine.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 为不健康的节点指定 control plane 机器的名称。
编辑上一步中创建的
new-master-machine.yaml文件,以分配新名称并删除不必要的字段。删除整个
status部分:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将
metadata.name字段更改为新名称。保留与旧机器相同的基础名称,并将结尾的号更改为下一个可用数字。在本例中,
clustername-8qw5l-master-0改为clustername-8qw5l-master-3。例如:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 删除
spec.providerID字段:providerID: aws:///us-east-1a/i-0fdb85790d76d0c3f
providerID: aws:///us-east-1a/i-0fdb85790d76d0c3fCopy to Clipboard Copied! Toggle word wrap Toggle overflow
删除不健康成员的机器:
oc delete machine -n openshift-machine-api clustername-8qw5l-master-0
$ oc delete machine -n openshift-machine-api clustername-8qw5l-master-01 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 为不健康的节点指定 control plane 机器的名称。
验证机器是否已删除:
oc get machines -n openshift-machine-api -o wide
$ oc get machines -n openshift-machine-api -o wideCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
new-master-machine.yaml文件创建新机器:oc apply -f new-master-machine.yaml
$ oc apply -f new-master-machine.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 验证新机器是否已创建:
oc get machines -n openshift-machine-api -o wide
$ oc get machines -n openshift-machine-api -o wideCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 新机器
clustername-8qw5l-master-3将被创建,并当阶段从Provisioning变为Running后就可以使用。
创建新机器可能需要几分钟时间。当机器或节点返回健康状态时,etcd 集群 Operator 会自动同步。
输入以下命令重新打开仲裁保护:
oc patch etcd/cluster --type=merge -p '{"spec": {"unsupportedConfigOverrides": null}}'$ oc patch etcd/cluster --type=merge -p '{"spec": {"unsupportedConfigOverrides": null}}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 您可以输入以下命令验证
unsupportedConfigOverrides部分是否已从对象中删除:oc get etcd/cluster -oyaml
$ oc get etcd/cluster -oyamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果使用单节点 OpenShift,请重启该节点。否则,您可能会在 etcd 集群 Operator 中遇到以下错误:
输出示例
EtcdCertSignerControllerDegraded: [Operation cannot be fulfilled on secrets "etcd-peer-sno-0": the object has been modified; please apply your changes to the latest version and try again, Operation cannot be fulfilled on secrets "etcd-serving-sno-0": the object has been modified; please apply your changes to the latest version and try again, Operation cannot be fulfilled on secrets "etcd-serving-metrics-sno-0": the object has been modified; please apply your changes to the latest version and try again]
EtcdCertSignerControllerDegraded: [Operation cannot be fulfilled on secrets "etcd-peer-sno-0": the object has been modified; please apply your changes to the latest version and try again, Operation cannot be fulfilled on secrets "etcd-serving-sno-0": the object has been modified; please apply your changes to the latest version and try again, Operation cannot be fulfilled on secrets "etcd-serving-metrics-sno-0": the object has been modified; please apply your changes to the latest version and try again]Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
验证所有 etcd pod 是否都正常运行。
在一个终端中使用
cluster-admin用户连接到集群,运行以下命令:oc -n openshift-etcd get pods -l k8s-app=etcd
$ oc -n openshift-etcd get pods -l k8s-app=etcdCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
etcd-ip-10-0-133-53.ec2.internal 3/3 Running 0 7m49s etcd-ip-10-0-164-97.ec2.internal 3/3 Running 0 123m etcd-ip-10-0-154-204.ec2.internal 3/3 Running 0 124m
etcd-ip-10-0-133-53.ec2.internal 3/3 Running 0 7m49s etcd-ip-10-0-164-97.ec2.internal 3/3 Running 0 123m etcd-ip-10-0-154-204.ec2.internal 3/3 Running 0 124mCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果上一命令的输出只列出两个 pod,您可以手动强制重新部署 etcd。在一个终端中使用
cluster-admin用户连接到集群,运行以下命令:oc patch etcd cluster -p='{"spec": {"forceRedeploymentReason": "recovery-'"$( date --rfc-3339=ns )"'"}}' --type=merge$ oc patch etcd cluster -p='{"spec": {"forceRedeploymentReason": "recovery-'"$( date --rfc-3339=ns )"'"}}' --type=merge1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
forceRedeploymentReason值必须是唯一的,这就是为什么附加时间戳的原因。
验证只有三个 etcd 成员。
连接到正在运行的 etcd 容器,传递没有在受影响节点上的 pod 的名称:
在一个终端中使用
cluster-admin用户连接到集群,运行以下命令:oc rsh -n openshift-etcd etcd-ip-10-0-154-204.ec2.internal
$ oc rsh -n openshift-etcd etcd-ip-10-0-154-204.ec2.internalCopy to Clipboard Copied! Toggle word wrap Toggle overflow 查看成员列表:
etcdctl member list -w table
sh-4.2# etcdctl member list -w tableCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果上一命令的输出列出了超过三个 etcd 成员,您必须删除不需要的成员。
警告确保删除正确的 etcd 成员;如果删除了正常的 etcd 成员则有可能会导致仲裁丢失。
4.2.3.2. 替换其 etcd Pod 处于 crashlooping 状态的不健康 etcd 成员 复制链接链接已复制到粘贴板!
此流程详细介绍了替换因 etcd pod 处于 crashlooping 状态造成不健康的 etcd 成员的步骤。
先决条件
- 您已找出不健康的 etcd 成员。
- 已确认 etcd pod 处于 crashlooping 状态。
-
您可以使用具有
cluster-admin角色的用户访问集群。 已进行 etcd 备份。
重要执行此流程前务必要进行 etcd 备份,以便在遇到任何问题时可以恢复集群。
流程
停止处于 crashlooping 状态的 etcd pod。
对处于 crashlooping 状态的节点进行调试。
在一个终端中使用
cluster-admin用户连接到集群,运行以下命令:oc debug node/ip-10-0-131-183.ec2.internal
$ oc debug node/ip-10-0-131-183.ec2.internal1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 使用不健康节点的名称来替换它。
将您的根目录改为
/host:chroot /host
sh-4.2# chroot /hostCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将现有 etcd pod 文件从 Kubelet 清单目录中移出:
mkdir /var/lib/etcd-backup
sh-4.2# mkdir /var/lib/etcd-backupCopy to Clipboard Copied! Toggle word wrap Toggle overflow mv /etc/kubernetes/manifests/etcd-pod.yaml /var/lib/etcd-backup/
sh-4.2# mv /etc/kubernetes/manifests/etcd-pod.yaml /var/lib/etcd-backup/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将 etcd 数据目录移到不同的位置:
mv /var/lib/etcd/ /tmp
sh-4.2# mv /var/lib/etcd/ /tmpCopy to Clipboard Copied! Toggle word wrap Toggle overflow 现在您可以退出节点 shell。
删除不健康的成员。
选择一个不在受影响节点上的 pod。
在一个终端中使用
cluster-admin用户连接到集群,运行以下命令:oc -n openshift-etcd get pods -l k8s-app=etcd
$ oc -n openshift-etcd get pods -l k8s-app=etcdCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
etcd-ip-10-0-131-183.ec2.internal 2/3 Error 7 6h9m etcd-ip-10-0-164-97.ec2.internal 3/3 Running 0 6h6m etcd-ip-10-0-154-204.ec2.internal 3/3 Running 0 6h6m
etcd-ip-10-0-131-183.ec2.internal 2/3 Error 7 6h9m etcd-ip-10-0-164-97.ec2.internal 3/3 Running 0 6h6m etcd-ip-10-0-154-204.ec2.internal 3/3 Running 0 6h6mCopy to Clipboard Copied! Toggle word wrap Toggle overflow 连接到正在运行的 etcd 容器,传递没有在受影响节点上的 pod 的名称。
在一个终端中使用
cluster-admin用户连接到集群,运行以下命令:oc rsh -n openshift-etcd etcd-ip-10-0-154-204.ec2.internal
$ oc rsh -n openshift-etcd etcd-ip-10-0-154-204.ec2.internalCopy to Clipboard Copied! Toggle word wrap Toggle overflow 查看成员列表:
etcdctl member list -w table
sh-4.2# etcdctl member list -w tableCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 记录不健康的 etcd 成员的 ID 和名称,因为稍后需要这些值。
通过向
etcdctl member remove命令提供 ID 来删除不健康的 etcd 成员 :etcdctl member remove 62bcf33650a7170a
sh-4.2# etcdctl member remove 62bcf33650a7170aCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Member 62bcf33650a7170a removed from cluster ead669ce1fbfb346
Member 62bcf33650a7170a removed from cluster ead669ce1fbfb346Copy to Clipboard Copied! Toggle word wrap Toggle overflow 再次查看成员列表,并确认成员已被删除:
etcdctl member list -w table
sh-4.2# etcdctl member list -w tableCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 现在您可以退出节点 shell。
输入以下命令关闭仲裁保护:
oc patch etcd/cluster --type=merge -p '{"spec": {"unsupportedConfigOverrides": {"useUnsupportedUnsafeNonHANonProductionUnstableEtcd": true}}}'$ oc patch etcd/cluster --type=merge -p '{"spec": {"unsupportedConfigOverrides": {"useUnsupportedUnsafeNonHANonProductionUnstableEtcd": true}}}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 此命令可确保您可以成功重新创建机密并推出静态 pod。
删除已删除的不健康 etcd 成员的旧 secret。
列出已删除的不健康 etcd 成员的 secret。
oc get secrets -n openshift-etcd | grep ip-10-0-131-183.ec2.internal
$ oc get secrets -n openshift-etcd | grep ip-10-0-131-183.ec2.internal1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 传递您之前在这个过程中记录的不健康 etcd 成员的名称。
有一个对等的、服务和指标的 secret,如以下输出所示:
输出示例
etcd-peer-ip-10-0-131-183.ec2.internal kubernetes.io/tls 2 47m etcd-serving-ip-10-0-131-183.ec2.internal kubernetes.io/tls 2 47m etcd-serving-metrics-ip-10-0-131-183.ec2.internal kubernetes.io/tls 2 47m
etcd-peer-ip-10-0-131-183.ec2.internal kubernetes.io/tls 2 47m etcd-serving-ip-10-0-131-183.ec2.internal kubernetes.io/tls 2 47m etcd-serving-metrics-ip-10-0-131-183.ec2.internal kubernetes.io/tls 2 47mCopy to Clipboard Copied! Toggle word wrap Toggle overflow 删除已删除的不健康 etcd 成员的 secret。
删除 peer(对等)secret:
oc delete secret -n openshift-etcd etcd-peer-ip-10-0-131-183.ec2.internal
$ oc delete secret -n openshift-etcd etcd-peer-ip-10-0-131-183.ec2.internalCopy to Clipboard Copied! Toggle word wrap Toggle overflow 删除 serving secret:
oc delete secret -n openshift-etcd etcd-serving-ip-10-0-131-183.ec2.internal
$ oc delete secret -n openshift-etcd etcd-serving-ip-10-0-131-183.ec2.internalCopy to Clipboard Copied! Toggle word wrap Toggle overflow 删除 metrics secret:
oc delete secret -n openshift-etcd etcd-serving-metrics-ip-10-0-131-183.ec2.internal
$ oc delete secret -n openshift-etcd etcd-serving-metrics-ip-10-0-131-183.ec2.internalCopy to Clipboard Copied! Toggle word wrap Toggle overflow
强制 etcd 重新部署。
在一个终端中使用
cluster-admin用户连接到集群,运行以下命令:oc patch etcd cluster -p='{"spec": {"forceRedeploymentReason": "single-master-recovery-'"$( date --rfc-3339=ns )"'"}}' --type=merge$ oc patch etcd cluster -p='{"spec": {"forceRedeploymentReason": "single-master-recovery-'"$( date --rfc-3339=ns )"'"}}' --type=merge1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
forceRedeploymentReason值必须是唯一的,这就是为什么附加时间戳的原因。
当 etcd 集群 Operator 执行重新部署时,它会确保所有 control plane 节点都有可正常工作的 etcd pod。
输入以下命令重新打开仲裁保护:
oc patch etcd/cluster --type=merge -p '{"spec": {"unsupportedConfigOverrides": null}}'$ oc patch etcd/cluster --type=merge -p '{"spec": {"unsupportedConfigOverrides": null}}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 您可以输入以下命令验证
unsupportedConfigOverrides部分是否已从对象中删除:oc get etcd/cluster -oyaml
$ oc get etcd/cluster -oyamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果使用单节点 OpenShift,请重启该节点。否则,您可能会在 etcd 集群 Operator 中遇到以下错误:
输出示例
EtcdCertSignerControllerDegraded: [Operation cannot be fulfilled on secrets "etcd-peer-sno-0": the object has been modified; please apply your changes to the latest version and try again, Operation cannot be fulfilled on secrets "etcd-serving-sno-0": the object has been modified; please apply your changes to the latest version and try again, Operation cannot be fulfilled on secrets "etcd-serving-metrics-sno-0": the object has been modified; please apply your changes to the latest version and try again]
EtcdCertSignerControllerDegraded: [Operation cannot be fulfilled on secrets "etcd-peer-sno-0": the object has been modified; please apply your changes to the latest version and try again, Operation cannot be fulfilled on secrets "etcd-serving-sno-0": the object has been modified; please apply your changes to the latest version and try again, Operation cannot be fulfilled on secrets "etcd-serving-metrics-sno-0": the object has been modified; please apply your changes to the latest version and try again]Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
确认新成员可用且健康。
连接到正在运行的 etcd 容器。
在一个终端中使用 cluster-admin 用户连接到集群,运行以下命令:
oc rsh -n openshift-etcd etcd-ip-10-0-154-204.ec2.internal
$ oc rsh -n openshift-etcd etcd-ip-10-0-154-204.ec2.internalCopy to Clipboard Copied! Toggle word wrap Toggle overflow 验证所有成员是否健康:
etcdctl endpoint health
sh-4.2# etcdctl endpoint healthCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
https://10.0.131.183:2379 is healthy: successfully committed proposal: took = 16.671434ms https://10.0.154.204:2379 is healthy: successfully committed proposal: took = 16.698331ms https://10.0.164.97:2379 is healthy: successfully committed proposal: took = 16.621645ms
https://10.0.131.183:2379 is healthy: successfully committed proposal: took = 16.671434ms https://10.0.154.204:2379 is healthy: successfully committed proposal: took = 16.698331ms https://10.0.164.97:2379 is healthy: successfully committed proposal: took = 16.621645msCopy to Clipboard Copied! Toggle word wrap Toggle overflow
4.2.3.3. 替换机器没有运行或节点未就绪的不健康裸机 etcd 成员 复制链接链接已复制到粘贴板!
此流程详细介绍了替换因机器没有运行或节点未就绪造成不健康的裸机 etcd 成员的步骤。
如果您正在运行安装程序置备的基础架构,或者您使用 Machine API 创建机器,请按照以下步骤执行。否则,您必须使用最初创建控制平面节点时使用的相同方法创建新的控制平面。
先决条件
- 您已找出不健康的裸机 etcd 成员。
- 您已确认机器没有运行,或者该节点未就绪。
-
您可以使用具有
cluster-admin角色的用户访问集群。 已进行 etcd 备份。
重要执行此流程前务必要进行 etcd 备份,以便在遇到任何问题时可以恢复集群。
流程
验证并删除不健康的成员。
选择一个不在受影响节点上的 pod:
在一个终端中使用
cluster-admin用户连接到集群,运行以下命令:oc -n openshift-etcd get pods -l k8s-app=etcd -o wide
$ oc -n openshift-etcd get pods -l k8s-app=etcd -o wideCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
etcd-openshift-control-plane-0 5/5 Running 11 3h56m 192.168.10.9 openshift-control-plane-0 <none> <none> etcd-openshift-control-plane-1 5/5 Running 0 3h54m 192.168.10.10 openshift-control-plane-1 <none> <none> etcd-openshift-control-plane-2 5/5 Running 0 3h58m 192.168.10.11 openshift-control-plane-2 <none> <none>
etcd-openshift-control-plane-0 5/5 Running 11 3h56m 192.168.10.9 openshift-control-plane-0 <none> <none> etcd-openshift-control-plane-1 5/5 Running 0 3h54m 192.168.10.10 openshift-control-plane-1 <none> <none> etcd-openshift-control-plane-2 5/5 Running 0 3h58m 192.168.10.11 openshift-control-plane-2 <none> <none>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 连接到正在运行的 etcd 容器,传递没有在受影响节点上的 pod 的名称:
在一个终端中使用
cluster-admin用户连接到集群,运行以下命令:oc rsh -n openshift-etcd etcd-openshift-control-plane-0
$ oc rsh -n openshift-etcd etcd-openshift-control-plane-0Copy to Clipboard Copied! Toggle word wrap Toggle overflow 查看成员列表:
etcdctl member list -w table
sh-4.2# etcdctl member list -w tableCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 记录不健康的 etcd 成员的 ID 和名称,因为稍后需要这些值。
etcdctl endpoint health命令将列出已删除的成员,直到完成替换过程并添加了新成员。通过向
etcdctl member remove命令提供 ID 来删除不健康的 etcd 成员 :警告确保删除正确的 etcd 成员;如果删除了正常的 etcd 成员则有可能会导致仲裁丢失。
etcdctl member remove 7a8197040a5126c8
sh-4.2# etcdctl member remove 7a8197040a5126c8Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Member 7a8197040a5126c8 removed from cluster b23536c33f2cdd1b
Member 7a8197040a5126c8 removed from cluster b23536c33f2cdd1bCopy to Clipboard Copied! Toggle word wrap Toggle overflow 再次查看成员列表,并确认成员已被删除:
etcdctl member list -w table
sh-4.2# etcdctl member list -w tableCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 现在您可以退出节点 shell。
重要删除成员后,在剩余的 etcd 实例重启时,集群可能无法访问。
输入以下命令关闭仲裁保护:
oc patch etcd/cluster --type=merge -p '{"spec": {"unsupportedConfigOverrides": {"useUnsupportedUnsafeNonHANonProductionUnstableEtcd": true}}}'$ oc patch etcd/cluster --type=merge -p '{"spec": {"unsupportedConfigOverrides": {"useUnsupportedUnsafeNonHANonProductionUnstableEtcd": true}}}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 此命令可确保您可以成功重新创建机密并推出静态 pod。
运行以下命令,删除已删除的不健康 etcd 成员的旧 secret。
列出已删除的不健康 etcd 成员的 secret。
oc get secrets -n openshift-etcd | grep openshift-control-plane-2
$ oc get secrets -n openshift-etcd | grep openshift-control-plane-2Copy to Clipboard Copied! Toggle word wrap Toggle overflow 传递您之前在这个过程中记录的不健康 etcd 成员的名称。
有一个对等的、服务和指标的 secret,如以下输出所示:
etcd-peer-openshift-control-plane-2 kubernetes.io/tls 2 134m etcd-serving-metrics-openshift-control-plane-2 kubernetes.io/tls 2 134m etcd-serving-openshift-control-plane-2 kubernetes.io/tls 2 134m
etcd-peer-openshift-control-plane-2 kubernetes.io/tls 2 134m etcd-serving-metrics-openshift-control-plane-2 kubernetes.io/tls 2 134m etcd-serving-openshift-control-plane-2 kubernetes.io/tls 2 134mCopy to Clipboard Copied! Toggle word wrap Toggle overflow 删除已删除的不健康 etcd 成员的 secret。
删除 peer(对等)secret:
oc delete secret etcd-peer-openshift-control-plane-2 -n openshift-etcd
$ oc delete secret etcd-peer-openshift-control-plane-2 -n openshift-etcd secret "etcd-peer-openshift-control-plane-2" deletedCopy to Clipboard Copied! Toggle word wrap Toggle overflow 删除 serving secret:
oc delete secret etcd-serving-metrics-openshift-control-plane-2 -n openshift-etcd
$ oc delete secret etcd-serving-metrics-openshift-control-plane-2 -n openshift-etcd secret "etcd-serving-metrics-openshift-control-plane-2" deletedCopy to Clipboard Copied! Toggle word wrap Toggle overflow 删除 metrics secret:
oc delete secret etcd-serving-openshift-control-plane-2 -n openshift-etcd
$ oc delete secret etcd-serving-openshift-control-plane-2 -n openshift-etcd secret "etcd-serving-openshift-control-plane-2" deletedCopy to Clipboard Copied! Toggle word wrap Toggle overflow
获取不健康成员的机器。
在一个终端中使用
cluster-admin用户连接到集群,运行以下命令:oc get machines -n openshift-machine-api -o wide
$ oc get machines -n openshift-machine-api -o wideCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 这是不健康节点的 control plane 机器,
examplecluster-control-plane-2。
运行以下命令,确保 Bare Metal Operator 可用:
oc get clusteroperator baremetal
$ oc get clusteroperator baremetalCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME VERSION AVAILABLE PROGRESSING DEGRADED SINCE MESSAGE baremetal 4.19.0 True False False 3d15h
NAME VERSION AVAILABLE PROGRESSING DEGRADED SINCE MESSAGE baremetal 4.19.0 True False False 3d15hCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来删除旧的
BareMetalHost对象:oc delete bmh openshift-control-plane-2 -n openshift-machine-api
$ oc delete bmh openshift-control-plane-2 -n openshift-machine-apiCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
baremetalhost.metal3.io "openshift-control-plane-2" deleted
baremetalhost.metal3.io "openshift-control-plane-2" deletedCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来删除不健康成员的机器:
oc delete machine -n openshift-machine-api examplecluster-control-plane-2
$ oc delete machine -n openshift-machine-api examplecluster-control-plane-2Copy to Clipboard Copied! Toggle word wrap Toggle overflow 删除
BareMetalHost和Machine对象后,MachineController 会自动删除Node对象。如果删除机器因任何原因或者命令被移动而延迟而延迟而延迟,您可以通过删除机器对象终结器字段来强制删除。
重要不要通过按
Ctrl+c中断机器删除。您必须允许命令继续完成。打开一个新的终端窗口来编辑并删除 finalizer 字段。删除不健康成员机器后会自动置备新机器。
运行以下命令来编辑机器配置:
oc edit machine -n openshift-machine-api examplecluster-control-plane-2
$ oc edit machine -n openshift-machine-api examplecluster-control-plane-2Copy to Clipboard Copied! Toggle word wrap Toggle overflow 删除
Machine自定义资源中的以下字段,然后保存更新的文件:finalizers: - machine.machine.openshift.io
finalizers: - machine.machine.openshift.ioCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
machine.machine.openshift.io/examplecluster-control-plane-2 edited
machine.machine.openshift.io/examplecluster-control-plane-2 editedCopy to Clipboard Copied! Toggle word wrap Toggle overflow
运行以下命令验证机器是否已删除:
oc get machines -n openshift-machine-api -o wide
$ oc get machines -n openshift-machine-api -o wideCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME PHASE TYPE REGION ZONE AGE NODE PROVIDERID STATE examplecluster-control-plane-0 Running 3h11m openshift-control-plane-0 baremetalhost:///openshift-machine-api/openshift-control-plane-0/da1ebe11-3ff2-41c5-b099-0aa41222964e externally provisioned examplecluster-control-plane-1 Running 3h11m openshift-control-plane-1 baremetalhost:///openshift-machine-api/openshift-control-plane-1/d9f9acbc-329c-475e-8d81-03b20280a3e1 externally provisioned examplecluster-compute-0 Running 165m openshift-compute-0 baremetalhost:///openshift-machine-api/openshift-compute-0/3d685b81-7410-4bb3-80ec-13a31858241f provisioned examplecluster-compute-1 Running 165m openshift-compute-1 baremetalhost:///openshift-machine-api/openshift-compute-1/0fdae6eb-2066-4241-91dc-e7ea72ab13b9 provisioned
NAME PHASE TYPE REGION ZONE AGE NODE PROVIDERID STATE examplecluster-control-plane-0 Running 3h11m openshift-control-plane-0 baremetalhost:///openshift-machine-api/openshift-control-plane-0/da1ebe11-3ff2-41c5-b099-0aa41222964e externally provisioned examplecluster-control-plane-1 Running 3h11m openshift-control-plane-1 baremetalhost:///openshift-machine-api/openshift-control-plane-1/d9f9acbc-329c-475e-8d81-03b20280a3e1 externally provisioned examplecluster-compute-0 Running 165m openshift-compute-0 baremetalhost:///openshift-machine-api/openshift-compute-0/3d685b81-7410-4bb3-80ec-13a31858241f provisioned examplecluster-compute-1 Running 165m openshift-compute-1 baremetalhost:///openshift-machine-api/openshift-compute-1/0fdae6eb-2066-4241-91dc-e7ea72ab13b9 provisionedCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令验证节点是否已删除:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建新的
BareMetalHost对象和 secret,以存储 BMC 凭证:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意用户名和密码可从其他裸机主机的 secret 中找到。
bmc:address中使用的协议可以从其他 bmh 对象获取。重要如果您从现有 control plane 主机重复使用
BareMetalHost对象定义,请不要将 externalProvisioned字段保留为true。如果 OpenShift Container Platform 安装程序置备,现有 control plane
BareMetalHost对象可能会将externallyProvisioned标记设为true。检查完成后,
BareMetalHost对象会被创建并可用置备。使用可用的
BareMetalHost对象验证创建过程:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 验证新机器是否已创建:
oc get machines -n openshift-machine-api -o wide
$ oc get machines -n openshift-machine-api -o wideCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 新机器
clustername-8qw5l-master-3会被创建,并在阶段从Provisioning变为Running后就绪。
创建新机器需要几分钟时间。当机器或节点返回一个健康状态时,etcd cluster Operator 将自动同步。
运行以下命令验证裸机主机是否被置备,且没有报告的错误:
oc get bmh -n openshift-machine-api
$ oc get bmh -n openshift-machine-apiCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令验证新节点是否已添加并处于就绪状态:
oc get nodes
$ oc get nodesCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
输入以下命令重新打开仲裁保护:
oc patch etcd/cluster --type=merge -p '{"spec": {"unsupportedConfigOverrides": null}}'$ oc patch etcd/cluster --type=merge -p '{"spec": {"unsupportedConfigOverrides": null}}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 您可以输入以下命令验证
unsupportedConfigOverrides部分是否已从对象中删除:oc get etcd/cluster -oyaml
$ oc get etcd/cluster -oyamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果使用单节点 OpenShift,请重启该节点。否则,您可能会在 etcd 集群 Operator 中遇到以下错误:
输出示例
EtcdCertSignerControllerDegraded: [Operation cannot be fulfilled on secrets "etcd-peer-sno-0": the object has been modified; please apply your changes to the latest version and try again, Operation cannot be fulfilled on secrets "etcd-serving-sno-0": the object has been modified; please apply your changes to the latest version and try again, Operation cannot be fulfilled on secrets "etcd-serving-metrics-sno-0": the object has been modified; please apply your changes to the latest version and try again]
EtcdCertSignerControllerDegraded: [Operation cannot be fulfilled on secrets "etcd-peer-sno-0": the object has been modified; please apply your changes to the latest version and try again, Operation cannot be fulfilled on secrets "etcd-serving-sno-0": the object has been modified; please apply your changes to the latest version and try again, Operation cannot be fulfilled on secrets "etcd-serving-metrics-sno-0": the object has been modified; please apply your changes to the latest version and try again]Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
验证所有 etcd pod 是否都正常运行。
在一个终端中使用
cluster-admin用户连接到集群,运行以下命令:oc -n openshift-etcd get pods -l k8s-app=etcd
$ oc -n openshift-etcd get pods -l k8s-app=etcdCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
etcd-openshift-control-plane-0 5/5 Running 0 105m etcd-openshift-control-plane-1 5/5 Running 0 107m etcd-openshift-control-plane-2 5/5 Running 0 103m
etcd-openshift-control-plane-0 5/5 Running 0 105m etcd-openshift-control-plane-1 5/5 Running 0 107m etcd-openshift-control-plane-2 5/5 Running 0 103mCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果上一命令的输出只列出两个 pod,您可以手动强制重新部署 etcd。在一个终端中使用
cluster-admin用户连接到集群,运行以下命令:oc patch etcd cluster -p='{"spec": {"forceRedeploymentReason": "recovery-'"$( date --rfc-3339=ns )"'"}}' --type=merge$ oc patch etcd cluster -p='{"spec": {"forceRedeploymentReason": "recovery-'"$( date --rfc-3339=ns )"'"}}' --type=merge1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
forceRedeploymentReason值必须是唯一的,这就是为什么附加时间戳的原因。
要验证是否有完全有三个 etcd 成员,连接到正在运行的 etcd 容器,传递没有在受影响节点上的 pod 的名称。在一个终端中使用
cluster-admin用户连接到集群,运行以下命令:oc rsh -n openshift-etcd etcd-openshift-control-plane-0
$ oc rsh -n openshift-etcd etcd-openshift-control-plane-0Copy to Clipboard Copied! Toggle word wrap Toggle overflow 查看成员列表:
etcdctl member list -w table
sh-4.2# etcdctl member list -w tableCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意如果上一命令的输出列出了超过三个 etcd 成员,您必须删除不需要的成员。
运行以下命令,验证所有 etcd 成员是否健康:
etcdctl endpoint health --cluster
# etcdctl endpoint health --clusterCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
https://192.168.10.10:2379 is healthy: successfully committed proposal: took = 8.973065ms https://192.168.10.9:2379 is healthy: successfully committed proposal: took = 11.559829ms https://192.168.10.11:2379 is healthy: successfully committed proposal: took = 11.665203ms
https://192.168.10.10:2379 is healthy: successfully committed proposal: took = 8.973065ms https://192.168.10.9:2379 is healthy: successfully committed proposal: took = 11.559829ms https://192.168.10.11:2379 is healthy: successfully committed proposal: took = 11.665203msCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,验证所有节点是否处于最新的修订版本:
oc get etcd -o=jsonpath='{range.items[0].status.conditions[?(@.type=="NodeInstallerProgressing")]}{.reason}{"\n"}{.message}{"\n"}'$ oc get etcd -o=jsonpath='{range.items[0].status.conditions[?(@.type=="NodeInstallerProgressing")]}{.reason}{"\n"}{.message}{"\n"}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow AllNodesAtLatestRevision
AllNodesAtLatestRevisionCopy to Clipboard Copied! Toggle word wrap Toggle overflow
4.3. 灾难恢复 复制链接链接已复制到粘贴板!
灾难恢复文档为管理员提供了如何从 OpenShift Container Platform 集群可能出现的几个灾难情形中恢复的信息。作为管理员,您可能需要遵循以下一个或多个步骤将集群恢复为工作状态。
灾难恢复要求您至少有一个健康的 control plane 主机。
4.3.1. 仲裁恢复 复制链接链接已复制到粘贴板!
您可以使用 quorum-restore.sh 脚本来恢复因为仲裁丢失而离线的集群中的 etcd 仲裁。当 quorum 丢失时,OpenShift Container Platform API 将变为只读。恢复仲裁后,OpenShift Container Platform API 会返回读/写模式。
4.3.1.1. 为高可用性集群恢复 etcd 仲裁 复制链接链接已复制到粘贴板!
您可以使用 quorum-restore.sh 脚本来恢复因为仲裁丢失而离线的集群中的 etcd 仲裁。当 quorum 丢失时,OpenShift Container Platform API 将变为只读。恢复仲裁后,OpenShift Container Platform API 会返回读/写模式。
您可以使用 quorum-restore.sh 脚本根据其本地数据目录立即恢复一个新的单成员 etcd 集群,并通过停用之前的集群标识符将所有其他成员标记为无效。无需预先备份就可以从 control plane 中恢复。
对于高可用性 (HA) 集群,三节点集群需要在两个主机上关闭 etcd,以避免出现集群分割的情况。在四节点和五个节点 HA 集群中,您必须关闭三个主机。仲裁只需要具有多数节点的情况。三节点 HA 集群中,仲裁最少需要两个节点。在四节点和五个节点 HA 集群中,仲裁需要的最小节点数为三。如果您从恢复主机上的备份启动新集群,其他 etcd 成员可能仍然可以组成仲裁并继续服务。
如果运行恢复的主机没有复制其中的所有数据,您可能会遇到数据丢失的情况。
仲裁恢复不应用于减少恢复过程外的节点数量。减少节点数会导致出现不受支持的集群配置。
先决条件
- 有到用来恢复仲裁的节点的 SSH 访问权限。
流程
选择一个要用作恢复主机的 control plane 主机。您可以在此主机上运行恢复操作。
运行以下命令列出正在运行的 etcd pod:
oc get pods -n openshift-etcd -l app=etcd --field-selector="status.phase==Running"
$ oc get pods -n openshift-etcd -l app=etcd --field-selector="status.phase==Running"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 选择 pod 并运行以下命令来获取其 IP 地址:
oc exec -n openshift-etcd <etcd-pod> -c etcdctl -- etcdctl endpoint status -w table
$ oc exec -n openshift-etcd <etcd-pod> -c etcdctl -- etcdctl endpoint status -w tableCopy to Clipboard Copied! Toggle word wrap Toggle overflow 记录在不是 learner,且具有最高 Raft 索引的成员的 IP 地址。
运行以下命令并记录与所选 etcd 成员的 IP 地址对应的节点名称:
oc get nodes -o jsonpath='{range .items[*]}[{.metadata.name},{.status.addresses[?(@.type=="InternalIP")].address}]{end}'$ oc get nodes -o jsonpath='{range .items[*]}[{.metadata.name},{.status.addresses[?(@.type=="InternalIP")].address}]{end}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow
使用 SSH 连接到所选恢复节点,并运行以下命令来恢复 etcd 仲裁:
sudo -E /usr/local/bin/quorum-restore.sh
$ sudo -E /usr/local/bin/quorum-restore.shCopy to Clipboard Copied! Toggle word wrap Toggle overflow 几分钟后,关闭的节点会自动与运行恢复脚本的节点同步。任何剩余的在线节点都会自动重新加入由
quorum-restore.sh脚本创建的新 etcd 集群。这个过程需要几分钟时间。- 退出 SSH 会话。
如果有任何节点离线,则返回三节点配置。对离线的每个节点重复此步骤,以删除并重新创建它们。重新创建机器后,会强制一个新修订版本,etcd 会自动扩展。
如果使用用户置备的裸机安装,您可以使用最初创建它时使用的相同方法重新创建 control plane 机器。如需更多信息,请参阅"在裸机上安装用户置备的集群"。
警告不要为恢复主机删除并重新创建机器。
如果您正在运行安装程序置备的基础架构,或者您使用 Machine API 创建机器,请按照以下步骤执行:
警告不要为恢复主机删除并重新创建机器。
对于安装程序置备的基础架构上的裸机安装,不会重新创建 control plane 机器。如需更多信息,请参阅"替换裸机控制平面节点"。
为其中一个离线节点获取机器。
在一个终端中使用
cluster-admin用户连接到集群,运行以下命令:oc get machines -n openshift-machine-api -o wide
$ oc get machines -n openshift-machine-api -o wideCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 这是离线节点的 control plane 机器
ip-10-0-131-183.ec2.internal。
运行以下命令来删除离线节点的机器:
oc delete machine -n openshift-machine-api clustername-8qw5l-master-0
$ oc delete machine -n openshift-machine-api clustername-8qw5l-master-01 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 为离线节点指定 control plane 机器的名称。
删除离线节点的机器后会自动置备新机器。
运行以下命令验证新机器是否已创建:
oc get machines -n openshift-machine-api -o wide
$ oc get machines -n openshift-machine-api -o wideCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 新机器
clustername-8qw5l-master-3会被创建,并在阶段从Provisioning变为Running后就绪。
创建新机器可能需要几分钟时间。当机器或节点返回健康状态时,etcd 集群 Operator 将自动同步。
- 对离线的每个节点重复这些步骤。
运行以下命令等待 control plane 恢复:
oc adm wait-for-stable-cluster
$ oc adm wait-for-stable-clusterCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注意control plane 最多可能需要 15 分钟才能恢复。
故障排除
如果推出 etcd 静态 pod 的过程没有进展,您可以通过运行以下命令来强制从 etcd 集群 Operator 重新部署:
oc patch etcd cluster -p='{"spec": {"forceRedeploymentReason": "recovery-'"$(date --rfc-3339=ns )"'"}}' --type=merge$ oc patch etcd cluster -p='{"spec": {"forceRedeploymentReason": "recovery-'"$(date --rfc-3339=ns )"'"}}' --type=mergeCopy to Clipboard Copied! Toggle word wrap Toggle overflow
如果大多数 control plane 节点仍可用,且有 etcd 仲裁,则替换单个不健康的 etcd 成员。
4.3.2. 恢复到一个以前的集群状态 复制链接链接已复制到粘贴板!
要将集群恢复到以前的状态,您必须已通过创建快照来备份 etcd 数据。您将需要使用此快照来还原集群状态。如需更多信息,请参阅"恢复 etcd 数据"。
如果适用,可能还需要从过期的 control plane 证书中恢复。
在一个正在运行的集群中恢复到以前的集群状态是破坏性的,而不稳定的操作。这仅应作为最后的手段使用。
在执行恢复前,请参阅 "About restoring to a previous cluster state" 以了解有关对集群的影响的更多信息。
4.3.2.1. 关于恢复到以前的集群状态 复制链接链接已复制到粘贴板!
要将集群恢复到以前的状态,您必须已通过创建快照来备份 etcd 数据。您将需要使用此快照来还原集群状态。如需更多信息,请参阅"恢复 etcd 数据"。
您可以使用 etcd 备份将集群恢复到以前的状态。在以下情况中可以使用这个方法进行恢复:
- 集群丢失了大多数 control plane 主机(仲裁丢失)。
- 管理员删除了一些关键内容,必须恢复才能恢复集群。
在一个正在运行的集群中恢复到以前的集群状态是破坏性的,而不稳定的操作。这仅应作为最后的手段使用。
如果您可以使用 Kubernetes API 服务器检索数据,则代表 etcd 可用,且您不应该使用 etcd 备份来恢复。
恢复 etcd 实际相当于把集群返回到以前的一个状态,所有客户端都会遇到一个有冲突的、并行历史记录。这会影响 kubelet、Kubernetes 控制器管理器、持久性卷控制器和 OpenShift Container Platform Operator 等监视组件的行为,包括网络操作器。
当 etcd 中的内容与磁盘上的实际内容不匹配时,可能会导致 Operator churn,从而导致 Kubernetes API 服务器、Kubernetes 控制器管理器、Kubernetes 调度程序和 etcd 的 Operator 在磁盘上的文件与 etcd 中的内容冲突时卡住。这可能需要手动操作来解决问题。
在极端情况下,集群可能会丢失持久性卷跟踪,删除已不存在的关键工作负载,重新镜像机器,以及重写带有过期证书的 CA 捆绑包。
4.3.2.2. 将单一节点恢复到以前的集群状态 复制链接链接已复制到粘贴板!
您可以使用已保存的 etcd 备份,将单一节点恢复到以前的集群状态。
恢复集群时,必须使用同一 z-stream 发行版本中获取的 etcd 备份。例如,OpenShift Container Platform 4.19.2 集群必须使用在 4.19.2 中进行的 etcd 备份。
先决条件
-
通过一个基于证书的
kubeconfig使用具有cluster-admin角色的用户访问集群,如安装期间的情况。 - 有到 control plane 主机的 SSH 访问权限。
-
包含从同一备份中获取的 etcd 快照和静态 pod 资源的备份目录。该目录中的文件名必须采用以下格式:
snapshot_<datetimestamp>.db和static_kuberesources_<datetimestamp>.tar.gz。
流程
运行以下命令,使用 SSH 连接到单一节点,并将 etcd 备份复制到
/home/core目录中:cp <etcd_backup_directory> /home/core
$ cp <etcd_backup_directory> /home/coreCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在单一节点中运行以下命令从以前的备份中恢复集群:
sudo -E /usr/local/bin/cluster-restore.sh /home/core/<etcd_backup_directory>
$ sudo -E /usr/local/bin/cluster-restore.sh /home/core/<etcd_backup_directory>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 退出 SSH 会话。
运行以下命令监控 control plane 的恢复进度:
oc adm wait-for-stable-cluster
$ oc adm wait-for-stable-clusterCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注意control plane 最多可能需要 15 分钟才能恢复。
4.3.2.3. 为多个节点恢复到一个以前的集群状态 复制链接链接已复制到粘贴板!
您可以使用保存的 etcd 备份来恢复以前的集群状态,或恢复丢失了大多数 control plane 主机的集群。
对于高可用性 (HA) 集群,三节点集群需要在两个主机上关闭 etcd,以避免出现集群分割的情况。在四节点和五个节点 HA 集群中,您必须关闭三个主机。仲裁只需要具有多数节点的情况。三节点 HA 集群中,仲裁最少需要两个节点。在四节点和五个节点 HA 集群中,仲裁需要的最小节点数为三。如果您从恢复主机上的备份启动新集群,其他 etcd 成员可能仍然可以组成仲裁并继续服务。
如果您的集群使用 control plane 机器集,请参阅"为 etcd 恢复 control plane 机器集"中的"恢复降级的 etcd Operator"。对于单一节点上的 OpenShift Container Platform,请参阅"为单一节点提供以前的集群状态"。
恢复集群时,必须使用同一 z-stream 发行版本中获取的 etcd 备份。例如,OpenShift Container Platform 4.19.2 集群必须使用在 4.19.2 中进行的 etcd 备份。
先决条件
-
通过一个基于证书的
kubeconfig使用具有cluster-admin角色的用户访问集群,如安装期间的情况。 - 用作恢复主机的健康 control plane 主机。
- 有到 control plane 主机的 SSH 访问权限。
-
包含从同一备份中获取的 etcd 快照和静态
pod资源的备份目录。该目录中的文件名必须采用以下格式:snapshot_<datetimestamp>.db和static_kuberesources_<datetimestamp>.tar.gz。 - 节点必须能够访问或可引导。
对于非恢复 control plane 节点,不需要建立 SSH 连接或停止静态 pod。您可以逐个删除并重新创建其他非恢复 control plane 机器。
流程
- 选择一个要用作恢复主机的 control plane 主机。这是在其中运行恢复操作的主机。
建立到每个 control plane 节点(包括恢复主机)的 SSH 连接。
恢复过程启动后,
kube-apiserver将无法访问,因此您无法访问 control plane 节点。因此,建议在一个单独的终端中建立到每个control plane 主机的 SSH 连接。重要如果没有完成这个步骤,将无法访问 control plane 主机来完成恢复过程,您将无法从这个状态恢复集群。
使用 SSH 连接到每个 control plane 节点,并运行以下命令来禁用 etcd:
sudo -E /usr/local/bin/disable-etcd.sh
$ sudo -E /usr/local/bin/disable-etcd.shCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将 etcd 备份目录复制复制到恢复 control plane 主机上。
此流程假设您将
backup目录(其中包含 etcd 快照和静态 pod 资源)复制到恢复 control plane 主机的/home/core/目录中。运行以下命令,使用 SSH 连接到恢复主机并从以前的备份中恢复集群:
sudo -E /usr/local/bin/cluster-restore.sh /home/core/<etcd-backup-directory>
$ sudo -E /usr/local/bin/cluster-restore.sh /home/core/<etcd-backup-directory>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 退出 SSH 会话。
API 响应后,通过运行nning 来关闭 etcd Operator 仲裁保护:
oc patch etcd/cluster --type=merge -p '{"spec": {"unsupportedConfigOverrides": {"useUnsupportedUnsafeNonHANonProductionUnstableEtcd": true}}}'$ oc patch etcd/cluster --type=merge -p '{"spec": {"unsupportedConfigOverrides": {"useUnsupportedUnsafeNonHANonProductionUnstableEtcd": true}}}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令监控 control plane 的恢复进度:
oc adm wait-for-stable-cluster
$ oc adm wait-for-stable-clusterCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注意control plane 最多可能需要 15 分钟才能恢复。
恢复后,运行以下命令来启用仲裁保护:
oc patch etcd/cluster --type=merge -p '{"spec": {"unsupportedConfigOverrides": null}}'$ oc patch etcd/cluster --type=merge -p '{"spec": {"unsupportedConfigOverrides": null}}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow
故障排除
如果推出 etcd 静态 pod 的过程没有进展,您可以通过运行以下命令来强制从 cluster-etcd-operator 重新部署:
oc patch etcd cluster -p='{"spec": {"forceRedeploymentReason": "recovery-'"$(date --rfc-3339=ns )"'"}}' --type=merge
$ oc patch etcd cluster -p='{"spec": {"forceRedeploymentReason": "recovery-'"$(date --rfc-3339=ns )"'"}}' --type=merge
4.3.2.4. 从 etcd 备份手动恢复集群 复制链接链接已复制到粘贴板!
恢复过程在 "Restoring to a previous cluster state" 部分中介绍:
-
需要 2 个 control plane 节点的完整重新创建,这可能是使用 UPI 安装方法安装的集群的一个复杂步骤,因为 UPI 安装不会为 control plane 节点创建任何
Machine或ControlPlaneMachineset。 - 使用脚本 /usr/local/bin/cluster-restore.sh,它会启动新的单成员 etcd 集群,然后将其扩展到三个成员。
相反,这个过程:
- 不需要重新创建任何 control plane 节点。
- 直接启动一个三成员 etcd 集群。
如果集群使用 MachineSet 用于 control plane,建议使用 "Restoring to a previous cluster state" 用于简化 etcd 恢复的步骤。
恢复集群时,必须使用同一 z-stream 发行版本中获取的 etcd 备份。例如,OpenShift Container Platform 4.7.2 集群必须使用从 4.7.2 开始的 etcd 备份。
先决条件
-
使用具有
cluster-admin角色的用户访问集群,例如kubeadmin用户。 -
通过 SSH 访问所有 control plane 主机,允许主机用户成为
root用户;例如,默认的core主机用户。 -
包含之前 etcd 快照和来自同一备份的静态 pod 资源的备份目录。该目录中的文件名必须采用以下格式:
snapshot_<datetimestamp>.db和static_kuberesources_<datetimestamp>.tar.gz。
流程
使用 SSH 连接到每个 control plane 节点。
恢复过程启动后,Kubernetes API 服务器将无法访问,因此您无法访问 control plane 节点。因此,建议针对每个 control plane 主机都使用一个单独的终端来进行 SSH 连接。
重要如果没有完成这个步骤,将无法访问 control plane 主机来完成恢复过程,您将无法从这个状态恢复集群。
将 etcd 备份目录复制到每个 control plane 主机上。
此流程假设您将
backup目录(其中包含 etcd 快照和静态 pod 资源)复制到每个 control plane 主机的/home/core/assets目录中。如果尚未存在,您可能需要创建此assets文件夹。停止所有 control plane 节点上的静态 pod;一次只针对一个主机进行。
将现有 Kubernetes API Server 静态 pod 清单从 kubelet 清单目录中移出。
mkdir -p /root/manifests-backup mv /etc/kubernetes/manifests/kube-apiserver-pod.yaml /root/manifests-backup/
$ mkdir -p /root/manifests-backup $ mv /etc/kubernetes/manifests/kube-apiserver-pod.yaml /root/manifests-backup/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用以下命令验证 Kubernetes API 服务器容器是否已停止:
crictl ps | grep kube-apiserver | grep -E -v "operator|guard"
$ crictl ps | grep kube-apiserver | grep -E -v "operator|guard"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 命令输出应该为空。如果它不是空的,请等待几分钟后再重新检查。
如果 Kubernetes API 服务器容器仍在运行,使用以下命令手动终止它们:
crictl stop <container_id>
$ crictl stop <container_id>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 对
kube-controller-manager-pod.yaml、kube-scheduler-pod.yaml最后为etcd-pod.yaml重复相同的步骤,。使用以下命令停止
kube-controller-managerpod:mv /etc/kubernetes/manifests/kube-controller-manager-pod.yaml /root/manifests-backup/
$ mv /etc/kubernetes/manifests/kube-controller-manager-pod.yaml /root/manifests-backup/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用以下命令检查容器是否已停止:
crictl ps | grep kube-controller-manager | grep -E -v "operator|guard"
$ crictl ps | grep kube-controller-manager | grep -E -v "operator|guard"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用以下命令停止
kube-schedulerpod:mv /etc/kubernetes/manifests/kube-scheduler-pod.yaml /root/manifests-backup/
$ mv /etc/kubernetes/manifests/kube-scheduler-pod.yaml /root/manifests-backup/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用以下命令检查容器是否已停止:
crictl ps | grep kube-scheduler | grep -E -v "operator|guard"
$ crictl ps | grep kube-scheduler | grep -E -v "operator|guard"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用以下命令停止
etcdpod:mv /etc/kubernetes/manifests/etcd-pod.yaml /root/manifests-backup/
$ mv /etc/kubernetes/manifests/etcd-pod.yaml /root/manifests-backup/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用以下命令检查容器是否已停止:
crictl ps | grep etcd | grep -E -v "operator|guard"
$ crictl ps | grep etcd | grep -E -v "operator|guard"Copy to Clipboard Copied! Toggle word wrap Toggle overflow
在每个 control plane 主机上,保存当前的
etcd数据(将它移到backup目录中):mkdir /home/core/assets/old-member-data mv /var/lib/etcd/member /home/core/assets/old-member-data
$ mkdir /home/core/assets/old-member-data $ mv /var/lib/etcd/member /home/core/assets/old-member-dataCopy to Clipboard Copied! Toggle word wrap Toggle overflow 当
etcd备份恢复无法正常工作,且etcd集群必须恢复到当前状态,则这些数据将很有用。为每个 control plane 主机找到正确的 etcd 参数。
<ETCD_NAME>的值对每个 control plane 主机都是唯一的,它等于特定 control plane 主机上的清单/etc/kubernetes/static-pod-resources/etcd-certs/configmaps/restore-etcd-pod/pod.yaml文件中的ETCD_NAME变量的值。它可以通过以下命令找到:RESTORE_ETCD_POD_YAML="/etc/kubernetes/static-pod-resources/etcd-certs/configmaps/restore-etcd-pod/pod.yaml" cat $RESTORE_ETCD_POD_YAML | \ grep -A 1 $(cat $RESTORE_ETCD_POD_YAML | grep 'export ETCD_NAME' | grep -Eo 'NODE_.+_ETCD_NAME') | \ grep -Po '(?<=value: ").+(?=")'
RESTORE_ETCD_POD_YAML="/etc/kubernetes/static-pod-resources/etcd-certs/configmaps/restore-etcd-pod/pod.yaml" cat $RESTORE_ETCD_POD_YAML | \ grep -A 1 $(cat $RESTORE_ETCD_POD_YAML | grep 'export ETCD_NAME' | grep -Eo 'NODE_.+_ETCD_NAME') | \ grep -Po '(?<=value: ").+(?=")'Copy to Clipboard Copied! Toggle word wrap Toggle overflow <UUID>的值可使用以下命令在 control plane 主机中生成:uuidgen
$ uuidgenCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注意<UUID>的值必须只生成一次。在一个 control plane 主机上生成UUID后,请不要在其他主机上再次生成它。相同的UUID会在后续步骤中的所有 control plane 主机上使用。ETCD_NODE_PEER_URL的值应设置为类似以下示例:https://<IP_CURRENT_HOST>:2380
https://<IP_CURRENT_HOST>:2380Copy to Clipboard Copied! Toggle word wrap Toggle overflow 正确的 IP 可以从特定 control plane 主机的
<ETCD_NAME>中找到,使用以下命令:echo <ETCD_NAME> | \ sed -E 's/[.-]/_/g' | \ xargs -I {} grep {} /etc/kubernetes/static-pod-resources/etcd-certs/configmaps/etcd-scripts/etcd.env | \ grep "IP" | grep -Po '(?<=").+(?=")'$ echo <ETCD_NAME> | \ sed -E 's/[.-]/_/g' | \ xargs -I {} grep {} /etc/kubernetes/static-pod-resources/etcd-certs/configmaps/etcd-scripts/etcd.env | \ grep "IP" | grep -Po '(?<=").+(?=")'Copy to Clipboard Copied! Toggle word wrap Toggle overflow <ETCD_INITIAL_CLUSTER>的值应设置为如下所示,其中<ETCD_NAME_n>是每个 control plane 主机的<ETCD_NAME>。注意使用的端口必须是 2380,而不是 2379。端口 2379 用于 etcd 数据库管理,并直接在容器中的 etcd start 命令中配置。
输出示例
<ETCD_NAME_0>=<ETCD_NODE_PEER_URL_0>,<ETCD_NAME_1>=<ETCD_NODE_PEER_URL_1>,<ETCD_NAME_2>=<ETCD_NODE_PEER_URL_2>
<ETCD_NAME_0>=<ETCD_NODE_PEER_URL_0>,<ETCD_NAME_1>=<ETCD_NODE_PEER_URL_1>,<ETCD_NAME_2>=<ETCD_NODE_PEER_URL_2>1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 指定每个 control plane 主机中的
ETCD_NODE_PEER_URL值。
<ETCD_INITIAL_CLUSTER>值在所有 control plane 主机上都是相同的。在后续步骤中,每个 control plane 主机都需要使用相同的值。
从备份中重新生成 etcd 数据库。
此类操作必须在每个 control plane 主机上执行。
使用以下命令将
etcd备份复制到/var/lib/etcd目录中:cp /home/core/assets/backup/<snapshot_yyyy-mm-dd_hhmmss>.db /var/lib/etcd
$ cp /home/core/assets/backup/<snapshot_yyyy-mm-dd_hhmmss>.db /var/lib/etcdCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在继续操作前,识别正确的
etcdctl镜像。使用以下命令从 pod 清单的备份中检索镜像:jq -r '.spec.containers[]|select(.name=="etcdctl")|.image' /root/manifests-backup/etcd-pod.yaml
$ jq -r '.spec.containers[]|select(.name=="etcdctl")|.image' /root/manifests-backup/etcd-pod.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow podman run --rm -it --entrypoint="/bin/bash" -v /var/lib/etcd:/var/lib/etcd:z <image-hash>
$ podman run --rm -it --entrypoint="/bin/bash" -v /var/lib/etcd:/var/lib/etcd:z <image-hash>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 检查
etcdctl工具的版本是创建备份的etcd服务器的版本:etcdctl version
$ etcdctl versionCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令重新生成
etcd数据库,为当前主机使用正确的值:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意在重新生成
etcd数据库时,引号是必需的。
记录下在
added member日志中的值,例如:输出示例
2022-06-28T19:52:43Z info membership/cluster.go:421 added member {"cluster-id": "c5996b7c11c30d6b", "local-member-id": "0", "added-peer-id": "56cd73b614699e7", "added-peer-peer-urls": ["https://10.0.91.5:2380"], "added-peer-is-learner": false} 2022-06-28T19:52:43Z info membership/cluster.go:421 added member {"cluster-id": "c5996b7c11c30d6b", "local-member-id": "0", "added-peer-id": "1f63d01b31bb9a9e", "added-peer-peer-urls": ["https://10.0.90.221:2380"], "added-peer-is-learner": false} 2022-06-28T19:52:43Z info membership/cluster.go:421 added member {"cluster-id": "c5996b7c11c30d6b", "local-member-id": "0", "added-peer-id": "fdc2725b3b70127c", "added-peer-peer-urls": ["https://10.0.94.214:2380"], "added-peer-is-learner": false}2022-06-28T19:52:43Z info membership/cluster.go:421 added member {"cluster-id": "c5996b7c11c30d6b", "local-member-id": "0", "added-peer-id": "56cd73b614699e7", "added-peer-peer-urls": ["https://10.0.91.5:2380"], "added-peer-is-learner": false} 2022-06-28T19:52:43Z info membership/cluster.go:421 added member {"cluster-id": "c5996b7c11c30d6b", "local-member-id": "0", "added-peer-id": "1f63d01b31bb9a9e", "added-peer-peer-urls": ["https://10.0.90.221:2380"], "added-peer-is-learner": false} 2022-06-28T19:52:43Z info membership/cluster.go:421 added member {"cluster-id": "c5996b7c11c30d6b", "local-member-id": "0", "added-peer-id": "fdc2725b3b70127c", "added-peer-peer-urls": ["https://10.0.94.214:2380"], "added-peer-is-learner": false}Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 退出容器。
-
在其他 control plane 主机上重复这些步骤,检查
added member日志中的值对于所有 control plane 主机都是一样的。
将重新生成的
etcd数据库移到默认位置。此类操作必须在每个 control plane 主机上执行。
将重新生成的数据库(上一个
etcdctl snapshot restore命令创建的member文件夹)移到默认的 etcd 位置/var/lib/etcd:mv /var/lib/etcd/restore-<UUID>/member /var/lib/etcd
$ mv /var/lib/etcd/restore-<UUID>/member /var/lib/etcdCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在
/var/lib/etcd目录中恢复/var/lib/etcd/member文件夹的 SELinux 上下文:restorecon -vR /var/lib/etcd/
$ restorecon -vR /var/lib/etcd/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 删除剩下的文件和目录:
rm -rf /var/lib/etcd/restore-<UUID>
$ rm -rf /var/lib/etcd/restore-<UUID>Copy to Clipboard Copied! Toggle word wrap Toggle overflow rm /var/lib/etcd/<snapshot_yyyy-mm-dd_hhmmss>.db
$ rm /var/lib/etcd/<snapshot_yyyy-mm-dd_hhmmss>.dbCopy to Clipboard Copied! Toggle word wrap Toggle overflow 重要完成后,
/var/lib/etcd目录只能包含文件夹member。- 在其他 control plane 主机上重复这些步骤。
重启 etcd 集群。
- 必须在所有 control plane 主机上执行以下步骤,但一次只针对一个主机执行。
将
etcd静态 pod 清单移回到 kubelet 清单目录,以便 kubelet 启动相关的容器:mv /tmp/etcd-pod.yaml /etc/kubernetes/manifests
$ mv /tmp/etcd-pod.yaml /etc/kubernetes/manifestsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 验证所有
etcd容器是否已启动:crictl ps | grep etcd | grep -v operator
$ crictl ps | grep etcd | grep -v operatorCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
38c814767ad983 f79db5a8799fd2c08960ad9ee22f784b9fbe23babe008e8a3bf68323f004c840 28 seconds ago Running etcd-health-monitor 2 fe4b9c3d6483c e1646b15207c6 9d28c15860870e85c91d0e36b45f7a6edd3da757b113ec4abb4507df88b17f06 About a minute ago Running etcd-metrics 0 fe4b9c3d6483c 08ba29b1f58a7 9d28c15860870e85c91d0e36b45f7a6edd3da757b113ec4abb4507df88b17f06 About a minute ago Running etcd 0 fe4b9c3d6483c 2ddc9eda16f53 9d28c15860870e85c91d0e36b45f7a6edd3da757b113ec4abb4507df88b17f06 About a minute ago Running etcdctl
38c814767ad983 f79db5a8799fd2c08960ad9ee22f784b9fbe23babe008e8a3bf68323f004c840 28 seconds ago Running etcd-health-monitor 2 fe4b9c3d6483c e1646b15207c6 9d28c15860870e85c91d0e36b45f7a6edd3da757b113ec4abb4507df88b17f06 About a minute ago Running etcd-metrics 0 fe4b9c3d6483c 08ba29b1f58a7 9d28c15860870e85c91d0e36b45f7a6edd3da757b113ec4abb4507df88b17f06 About a minute ago Running etcd 0 fe4b9c3d6483c 2ddc9eda16f53 9d28c15860870e85c91d0e36b45f7a6edd3da757b113ec4abb4507df88b17f06 About a minute ago Running etcdctlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果这个命令的输出为空,请等待几分钟,然后再次检查。
检查
etcd集群的状态。在任何 control plane 主机上,使用以下命令检查
etcd集群的状态:crictl exec -it $(crictl ps | grep etcdctl | awk '{print $1}') etcdctl endpoint status -w table$ crictl exec -it $(crictl ps | grep etcdctl | awk '{print $1}') etcdctl endpoint status -w tableCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
重启其他静态 pod。
必须在所有 control plane 主机上执行以下步骤,但一次只针对一个主机执行。
将 Kubernetes API Server 静态 pod 清单重新移到 kubelet 清单目录中,以便 kubelet 使用命令启动相关的容器:
mv /root/manifests-backup/kube-apiserver-pod.yaml /etc/kubernetes/manifests
$ mv /root/manifests-backup/kube-apiserver-pod.yaml /etc/kubernetes/manifestsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 验证所有 Kubernetes API 服务器容器是否已启动:
crictl ps | grep kube-apiserver | grep -v operator
$ crictl ps | grep kube-apiserver | grep -v operatorCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注意如果以下命令的输出为空,请等待几分钟,然后再次检查。
对
kube-controller-manager-pod.yaml和kube-scheduler-pod.yaml文件重复相同的步骤。使用以下命令重启所有节点中的 kubelet:
systemctl restart kubelet
$ systemctl restart kubeletCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用以下命令启动剩余的 control plane pod:
mv /root/manifests-backup/kube-* /etc/kubernetes/manifests/
$ mv /root/manifests-backup/kube-* /etc/kubernetes/manifests/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 检查
kube-apiserver、kube-scheduler和kube-controller-managerpod 是否已正确启动:crictl ps | grep -E 'kube-(apiserver|scheduler|controller-manager)' | grep -v -E 'operator|guard'
$ crictl ps | grep -E 'kube-(apiserver|scheduler|controller-manager)' | grep -v -E 'operator|guard'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用以下命令擦除 OVN 数据库:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.3.2.5. 恢复持久性存储状态的问题和解决方法 复制链接链接已复制到粘贴板!
如果您的 OpenShift Container Platform 集群使用任何形式的持久性存储,集群的状态通常存储在 etcd 外部。它可能是在 pod 中运行的 Elasticsearch 集群,或者在 StatefulSet 对象中运行的数据库。从 etcd 备份中恢复时,还会恢复 OpenShift Container Platform 中工作负载的状态。但是,如果 etcd 快照是旧的,其状态可能无效或过期。
持久性卷(PV)的内容绝不会属于 etcd 快照的一部分。从 etcd 快照恢复 OpenShift Container Platform 集群时,非关键工作负载可能会访问关键数据,反之亦然。
以下是生成过时状态的一些示例情况:
- MySQL 数据库在由 PV 对象支持的 pod 中运行。从 etcd 快照恢复 OpenShift Container Platform 不会使卷恢复到存储供应商上,且不会生成正在运行的 MySQL pod,尽管 pod 会重复尝试启动。您必须通过在存储供应商中恢复卷,然后编辑 PV 以指向新卷来手动恢复这个 pod。
- Pod P1 使用卷 A,它附加到节点 X。如果另一个 pod 在节点 Y 上使用相同的卷,则执行 etcd 恢复时,pod P1 可能无法正确启动,因为卷仍然被附加到节点 Y。OpenShift Container Platform 并不知道附加,且不会自动分离它。发生这种情况时,卷必须从节点 Y 手动分离,以便卷可以在节点 X 上附加,然后 pod P1 才可以启动。
- 在执行 etcd 快照后,云供应商或存储供应商凭证会被更新。这会导致任何依赖于这些凭证的 CSI 驱动程序或 Operator 无法正常工作。您可能需要手动更新这些驱动程序或 Operator 所需的凭证。
在生成 etcd 快照后,会从 OpenShift Container Platform 节点中删除或重命名设备。Local Storage Operator 会为从
/dev/disk/by-id或/dev目录中管理的每个 PV 创建符号链接。这种情况可能会导致本地 PV 引用不再存在的设备。要解决这个问题,管理员必须:
- 手动删除带有无效设备的 PV。
- 从对应节点中删除符号链接。
-
删除
LocalVolume或LocalVolumeSet对象(请参阅 Storage → Configuring persistent storage → Persistent storage → Persistent storage → Deleting the Local Storage Operator Resources)。
4.3.3. 从 control plane 证书已过期的情况下恢复 复制链接链接已复制到粘贴板!
集群可以从过期的 control plane 证书中自动恢复。
但是,您需要手动批准待处理的 node-bootstrapper 证书签名请求(CSR)来恢复 kubelet 证书。对于用户置备的安装,您可能需要批准待处理的 kubelet 服务 CSR。
使用以下步骤批准待处理的 CSR:
流程
获取当前 CSR 列表:
oc get csr
$ oc get csrCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 查看一个 CSR 的详细信息以验证其是否有效:
oc describe csr <csr_name>
$ oc describe csr <csr_name>1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
<csr_name>是当前 CSR 列表中 CSR 的名称。
批准每个有效的
node-bootstrapperCSR:oc adm certificate approve <csr_name>
$ oc adm certificate approve <csr_name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 对于用户置备的安装,请批准每个有效的 kubelet 服务 CSR:
oc adm certificate approve <csr_name>
$ oc adm certificate approve <csr_name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.3.4. 测试恢复过程 复制链接链接已复制到粘贴板!
测试恢复过程非常重要,以确保您的自动化和工作负载安全处理新的集群状态。由于 etcd 仲裁的复杂性,以及 etcd Operator 会尝试自动修复,通常很难正确地使您的集群进入一个可以恢复的状态。
您必须有到集群的 SSH 访问权限。如果无法进行 SSH 访问,您的集群可能完全丢失。
先决条件
- 有到 control plane 主机的 SSH 访问权限。
-
已安装 OpenShift CLI(
oc)。
流程
使用 SSH 连接到每个非恢复节点,并运行以下命令来禁用 etcd 和
kubelet服务:运行以下命令来禁用 etcd:
sudo /usr/local/bin/disable-etcd.sh
$ sudo /usr/local/bin/disable-etcd.shCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来删除 etcd 的变量数据:
sudo rm -rf /var/lib/etcd
$ sudo rm -rf /var/lib/etcdCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来禁用
kubelet服务:sudo systemctl disable kubelet.service
$ sudo systemctl disable kubelet.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow
- 退出每个 SSH 会话。
运行以下命令,以确保您的非恢复节点处于
NOT READY状态:oc get nodes
$ oc get nodesCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 按照"恢复到以前的集群状态"中的步骤来恢复集群。
恢复集群和 API 响应后,使用 SSH 连接到每个非恢复节点并启用
kubelet服务:sudo systemctl enable kubelet.service
$ sudo systemctl enable kubelet.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 退出每个 SSH 会话。
运行以下命令,观察您的节点返回
READY状态:oc get nodes
$ oc get nodesCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令验证 etcd 是否可用:
oc get pods -n openshift-etcd
$ oc get pods -n openshift-etcdCopy to Clipboard Copied! Toggle word wrap Toggle overflow
第 5 章 启用 etcd 加密 复制链接链接已复制到粘贴板!
5.1. 关于 etcd 加密 复制链接链接已复制到粘贴板!
默认情况下,OpenShift Container Platform 不加密 etcd 数据。在集群中启用对 etcd 进行加密的功能可为数据的安全性提供额外的保护层。例如,如果 etcd 备份暴露给不应该获得这个数据的人员,它会帮助保护敏感数据。
启用 etcd 加密时,以下 OpenShift API 服务器和 Kubernetes API 服务器资源将被加密:
- Secrets
- 配置映射
- Routes
- OAuth 访问令牌
- OAuth 授权令牌
当您启用 etcd 加密时,会创建加密密钥。您必须具有这些密钥才能从 etcd 备份中恢复。
etcd 加密只加密值,而不加密键。资源类型、命名空间和对象名称是未加密的。
如果在备份过程中启用了 etcd 加密,static_kuberesources_<datetimestamp>.tar.gz 文件包含 etcd 快照的加密密钥。为安全起见,请将此文件与 etcd 快照分开存储。但是,需要这个文件才能从相应的 etcd 快照恢复以前的 etcd 状态。
5.2. 支持的加密类型 复制链接链接已复制到粘贴板!
在 OpenShift Container Platform 中,支持以下加密类型来加密 etcd 数据:
- AES-CBC
- 使用带有 PKCS#7 padding 和 32 字节密钥的 AES-CBC 来执行加密。加密密钥每周轮转。
- AES-GCM
- 使用带有随机 nonce 和 32 字节密钥的 AES-GCM 来执行加密。加密密钥每周轮转。
5.3. 启用 etcd 加密 复制链接链接已复制到粘贴板!
您可以启用 etcd 加密来加密集群中的敏感资源。
在初始加密过程完成前,不要备份 etcd 资源。如果加密过程还没有完成,则备份可能只被部分加密。
启用 etcd 加密后,可能会出现一些更改:
- etcd 加密可能会影响几个资源的内存消耗。
- 您可能会注意到对备份性能具有临时影响,因为领导必须提供备份服务。
- 磁盘 I/O 可能会影响接收备份状态的节点。
您可以在 AES-GCM 或 AES-CBC 加密中加密 etcd 数据库。
要将 etcd 数据库从一个加密类型迁移到另一个加密类型,您可以修改 API 服务器的 spec.encryption.type 字段。将 etcd 数据迁移到新的加密类型会自动进行。
先决条件
-
使用具有
cluster-admin角色的用户访问集群。
流程
修改
APIServer对象:oc edit apiserver
$ oc edit apiserverCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将
spec.encryption.type字段设置为aesgcm或aescbc:spec: encryption: type: aesgcmspec: encryption: type: aesgcm1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 设置为
aesgcm用于 AES-GCM 加密,或设置为aescbc用于 AES-CBC 加密。
保存文件以使改变生效。
加密过程开始。根据 etcd 数据库的大小,这个过程可能需要 20 分钟或更长时间才能完成。
验证 etcd 加密是否成功。
查看 OpenShift API 服务器的
Encrypted状态条件,以验证其资源是否已成功加密:oc get openshiftapiserver -o=jsonpath='{range .items[0].status.conditions[?(@.type=="Encrypted")]}{.reason}{"\n"}{.message}{"\n"}'$ oc get openshiftapiserver -o=jsonpath='{range .items[0].status.conditions[?(@.type=="Encrypted")]}{.reason}{"\n"}{.message}{"\n"}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在成功加密后输出显示
EncryptionCompleted:EncryptionCompleted All resources encrypted: routes.route.openshift.io
EncryptionCompleted All resources encrypted: routes.route.openshift.ioCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果输出显示
EncryptionInProgress,加密仍在进行中。等待几分钟后重试。查看 Kubernetes API 服务器的
Encrypted状态条件,以验证其资源是否已成功加密:oc get kubeapiserver -o=jsonpath='{range .items[0].status.conditions[?(@.type=="Encrypted")]}{.reason}{"\n"}{.message}{"\n"}'$ oc get kubeapiserver -o=jsonpath='{range .items[0].status.conditions[?(@.type=="Encrypted")]}{.reason}{"\n"}{.message}{"\n"}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在成功加密后输出显示
EncryptionCompleted:EncryptionCompleted All resources encrypted: secrets, configmaps
EncryptionCompleted All resources encrypted: secrets, configmapsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果输出显示
EncryptionInProgress,加密仍在进行中。等待几分钟后重试。查看 OpenShift OAuth API 服务器的
Encrypted状态条件,以验证其资源是否已成功加密:oc get authentication.operator.openshift.io -o=jsonpath='{range .items[0].status.conditions[?(@.type=="Encrypted")]}{.reason}{"\n"}{.message}{"\n"}'$ oc get authentication.operator.openshift.io -o=jsonpath='{range .items[0].status.conditions[?(@.type=="Encrypted")]}{.reason}{"\n"}{.message}{"\n"}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在成功加密后输出显示
EncryptionCompleted:EncryptionCompleted All resources encrypted: oauthaccesstokens.oauth.openshift.io, oauthauthorizetokens.oauth.openshift.io
EncryptionCompleted All resources encrypted: oauthaccesstokens.oauth.openshift.io, oauthauthorizetokens.oauth.openshift.ioCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果输出显示
EncryptionInProgress,加密仍在进行中。等待几分钟后重试。
5.4. 禁用 etcd 加密 复制链接链接已复制到粘贴板!
您可以在集群中禁用 etcd 数据的加密。
先决条件
-
使用具有
cluster-admin角色的用户访问集群。
流程
修改
APIServer对象:oc edit apiserver
$ oc edit apiserverCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将
encryption字段类型设置为identity:spec: encryption: type: identityspec: encryption: type: identity1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
identity类型是默认值,意味着没有执行任何加密。
保存文件以使改变生效。
解密过程开始。根据集群的大小,这个过程可能需要 20 分钟或更长的时间才能完成。
验证 etcd 解密是否成功。
查看 OpenShift API 服务器的
Encrypted状态条件,以验证其资源是否已成功解密:oc get openshiftapiserver -o=jsonpath='{range .items[0].status.conditions[?(@.type=="Encrypted")]}{.reason}{"\n"}{.message}{"\n"}'$ oc get openshiftapiserver -o=jsonpath='{range .items[0].status.conditions[?(@.type=="Encrypted")]}{.reason}{"\n"}{.message}{"\n"}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在成功解密后输出显示
DecryptionCompleted:DecryptionCompleted Encryption mode set to identity and everything is decrypted
DecryptionCompleted Encryption mode set to identity and everything is decryptedCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果输出显示
DecryptionInProgress,解密仍在进行中。等待几分钟后重试。查看 Kubernetes API 服务器的
Encrypted状态条件,以验证其资源是否已成功解密:oc get kubeapiserver -o=jsonpath='{range .items[0].status.conditions[?(@.type=="Encrypted")]}{.reason}{"\n"}{.message}{"\n"}'$ oc get kubeapiserver -o=jsonpath='{range .items[0].status.conditions[?(@.type=="Encrypted")]}{.reason}{"\n"}{.message}{"\n"}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在成功解密后输出显示
DecryptionCompleted:DecryptionCompleted Encryption mode set to identity and everything is decrypted
DecryptionCompleted Encryption mode set to identity and everything is decryptedCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果输出显示
DecryptionInProgress,解密仍在进行中。等待几分钟后重试。查看 OpenShift OAuth API 服务器的
Encrypted状态条件,以验证其资源是否已成功解密:oc get authentication.operator.openshift.io -o=jsonpath='{range .items[0].status.conditions[?(@.type=="Encrypted")]}{.reason}{"\n"}{.message}{"\n"}'$ oc get authentication.operator.openshift.io -o=jsonpath='{range .items[0].status.conditions[?(@.type=="Encrypted")]}{.reason}{"\n"}{.message}{"\n"}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在成功解密后输出显示
DecryptionCompleted:DecryptionCompleted Encryption mode set to identity and everything is decrypted
DecryptionCompleted Encryption mode set to identity and everything is decryptedCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果输出显示
DecryptionInProgress,解密仍在进行中。等待几分钟后重试。
Legal Notice
复制链接链接已复制到粘贴板!
Copyright © 2025 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 Joyent. Red Hat Software Collections is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
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.