一、现象描述
1. 生产环境规模架构
4.8.18版本OCP集群,集群中3个Master节点(且每个Master节点都运行一个Etcd数据库)、29个Node节点(Infra+Worker)
2. 故障现象
OpenShift 生产集群的Etcd数据库证书过期,导致与集群连接认证失效,进而无法执行新增、更新、删除集群中所有资源的操作,严重影响集群的维护和管理。
二. 故障分析
OpenShift 4.6、4.7 和 4.8 中的 ETCD 证书不会自动更新有效时间,证书默认将在 3 年后过期。
三. 解决方案和建议
1. 检查环境
适用本解决方案的集群版本:• 4.5.x• 4.6.x• 4.7.x• 4.8.x
需满足以下先决条件:
(1)可通过SSH连通各主节点
(2)具备主节点ROOT权限
(3)未启用ETCD加密功能
(4)主节点配备OpenSSL工具以生成证书
(5)主节点是RedHat8版操作系统,或其他主机是RedHat8版本操作系统,以运行生成证书脚本。
(6)堡垒机与主节点之间能进行文件传输,或者主节点间能够互传文件。
2. 解决思路
当 Etcd 证书过期时,需要手动创建证书。在此过程中,etcd-signer、etcd-metric-signer证书和密钥需要在Etcd API 运行时从 API 获取,或者直接从 Etcd 数据库获取;通过etcd-signer、etcd-metric-signer证书和密钥后生成新的Etcd证书后,替换旧证书,具体步骤请参阅后续内容。
3. 解决步骤
(1)获取Etcd证书
从Etcd数据文件中获取Etcd证书,获取etcd-signer和etcd-metric-signer两部分证书认证信息。过滤获取etcd-signer
获取内容如下:

过滤出etcd-signer证书内容,手动编辑并分别将“CERTIFICATE”中内容保存到etcd-signer.crt和将“RSA PRIVATE KEY”中内容保存到etcd-signer.key:

过滤获取etcd-metric-signer证书内容,将过滤的内容手动编辑保存到etcd-metric-signer.crt和etcd-metric-signer.key中。
补充:证书信息会出现两次,只复制一份到证书文件中即可。

(2)停止Master节点控制平面
恢复Etcd之前必须停止每个Master节点的控制组件。通过移动控制组件的yaml配置文件,集群会自动关停控制组件的容器。

通过上个命令检查容器是否停止运行,如果没有停止,运行如下命令手动停止:

(3)备份Etcd密钥和证书
在所有主节点本地备份Etcd密钥和证书

验证备份文件和源文件一致性

(4)创建新的Etcd证书和密钥
复制etcd-signer.{crt,key}和etcd-metric-signer.{crt,key}到etcd目录。

移动到etcd证书目录下

创建并执行脚本,脚本会生成需要的证书,这里只需要在master1节点执行,然后打包传入到其他master节点。


执行完脚本后,会在执行目录生成“new_certificates”目录存放新的证书和密钥,进入目录验证证书文件有效性。

master1节点操作,打包证书文件并复制到其他master节点。

(5)替换Etcd证书
将创建的密钥和证书文件覆盖到每个主节点
● 列出目录,如果缺少任何目录,就进行创建

● 删除所有旧证书

● 解压新证书

● 将证书移动到相应目录中

● 验证证书有效性

将Etcd的yaml文件移动回原目录,集群会自动运行Etcd容器。

动态观察Etcd是否启动,一般等5分钟左右所有master节点的Etcd都会完成启动;该命令一直占用命令行,启动成功后快捷键Ctrl+c终止该命令。

所有master节点的Etcd启动后,使用如下命令检查Etcd集群健康状态:

(7)启动Kube Apiserver、Kube Controller 和 Kube Scheduler
Etcd集群启动并状态正常后,启动其他控制组件,全部启动成功后集群恢复正常。

建议
a) 建议升级至4.9或以上版本,4.8版本Etcd证书过期后不会自动更新,4.9版本开始,实现了证书的自动轮换更新。
b) 升级集群版本需要考虑的因素较多,如果不方便升级版本,建议在监控中增加Etcd、apiServer、Controller Manager、Scheduler、kubelet核心组件证书过期时间,过期阈值为过期前1-6个月,最好提前延长证书过期时间,规避风险。
c) 建议在Worker节点监控kubelet证书过期时间。
四. Etcd在OpenShift集群中作用
Etcd数据库负责储存OpenShift所有元数据及资源对象,Master节点的apiServer将集群数据写入存储至Etcd数据库,同时也从Etcd读取信息;在集群运行期间,所有操作均依赖于对Etcd的读写操作实现,若Etcd数据库出现故障,虽然不会影响正在运行的Pod,但会导致整个集群无法正常运作。
在OpenShift部署过程中,仅允许将Master及Etcd置于同一节点,即Etcd数据储存在Master节点的本地磁盘,默认为/var/lib/etcd/目录下,此目录需至少达到20GB的存储空间,且底层存储应选用读写高效的存储设备。