OpenShift 4 - 利用 RHCOS 不可变新特性发现并恢复节点配置漂移(附视频)

76 篇文章 6 订阅
5 篇文章 0 订阅

OpenShift / RHEL / DevSecOps 汇总目录
本文在 OpenShift 4.10 验证。

不可变(Immutable)特性提升 OpenShift 可管理性和安全性

对于 Kubernetes 集群,无论是在 Master 还是 Worker 节点上运行的 systemd、Kubelet、proxy 等核心服务或模块都是直接运行在 Linux 操作系统上面的。由于这些关键配置都可直接在 Linux 中直接修改,这就给 Kubernetes 集群带来可维护性问题以及运行安全问题。

  1. 不同的维护人员在不同时间修改这些配置,导致 Kubernetes 集群的不同节点出现不同的配置,从而维护变得越来越混乱。最终可能因为可维护性的问题出现 Kubernetes 集群运行异常。
  2. 对 Kubernetes 运行所依赖的关键服务活模块进行不适当配置,导致该容器运行节点出现安全隐患。致命的是这种基于错误配置的安全隐患管理员很难跟踪察觉到。

为此 OpenShift 结合底层支撑的 Linux 操作系统 - RedHat CoreOS Linux(RHCOS)为 OpenShift 提供了 “不可变(Immutable)特性”,从而能有效提升集群节点的安全性,并极大降低了对 Kubernetes 集群节点的主机维护管理工作量和难度。

OpenShift 的不可变特性并非是让管理员无法对运行 Kubernetes 集群的 Linux 节点进行任何更改,而是最大限度让这些更改成为**可控(即便root用户也不能对所有文件进行修改)、可跟踪(记录对操作系统关键服务配置进行的更改)**的操作。OpenShift 的不可变特性表现在以下几个方面:

  1. 即便是 root 用户也只能修改 RHCOS 中的 /etc 和 /var 目录,而其他目录都是 readonly 的。
  2. 通过 OpenShift 的 Machine Config Operator 机制管理运行在 RHCOS 上的诸如 systemd、Kubelet、proxy 等 Kubernetes 依赖的核心服务的配置。
  3. 对 OpenShift 集群的操作系统 RHCOS 进行升级过程有些类似容器镜像的更新,即在更新过程中,RHCOS 升级的新环境不会覆盖旧版环境。只有在 RHCOS 重启后升级的新版环境才能全部生效。这样就能确保在 OpenShift 集群整体升级过程中即便有一个节点出现问题,这个节点和其他没问题的节点能回退到升级前的版本。

Machine Config Operator 和 Machine Config 的作用

在 OpenShift 集群中 Machine Config Operator(MCO)负责管理运行在 OpenShift 集群节 RHCOS 点上的 systemd、CRI-O 和 Kubelet、Kernel、Network Manager 和其他系统功能是如何更新的。MCO 通过 MachineConfig CRD 把配置文件写到主机上。为了实现对 OpenShift 集群进行系统级的修改和高级管理、必须了解 MCO 的作用以及它与其他组件的互动方式:

  1. Machine Config 用来改变 OpenShift 集群中每个节点的系统的操作系统上的文件或服务。
  2. 用 MCO 对 Machine 中的操作系统进行更改。所有 OpenShift 集群开始时都有工作平面和控制平面节点池。通过添加更多的角色标签,你可以配置自定义的节点池。
  3. MCO 管理在 Machine Config 中设置的项目。你对系统所做的手动修改不会被 MCO所覆盖,除非 MCO 被明确告知要管理一个冲突的文件。换句话说,MCO 只做你要求的特定更新,它不要求对整个节点的控制。
  4. 不鼓励对节点进行手动更改。因为如果这个节点退出集群,所有手动修改都将丢失。
  5. OpenShift 的 MCO 只能修改 /etc 和 /var 目录下的文件,另外还有通过符号链接到这些区域的目录,例如 /opt 和 /usr/local。

可以使用 MCO 来修改节点的以下配置:

  1. 配置- 通过 Ignition 修改
    Configuration files - 在 /var 或 /etc 目录中创建或修改文件
    systemd units - 创建或修改 systemd service
    users and groups - 修改 passwd 的 SSH 秘钥
  2. 系统内核参数 - 添加集群节点启动使用的内核参数
  3. 系统内核类型 - 选择非标准内核,例如 realtime 内核
  4. FIPS - 允许使用 FIPS 模式
  5. 扩展 - 通过增加软件包扩展 RHCOS 特性
  6. 定制化资源 - 修改 ContainerRuntime 和 Kubelet 配置

查看 OpenShift 的 MachineConfig 对象

$ oc get mc
NAME                                               GENERATEDBYCONTROLLER                      IGNITIONVERSION   AGE
00-master                                          14a1ca2cb91ff7e0faf9146b21ba12cd6c652d22   3.2.0             7h9m
00-worker                                          14a1ca2cb91ff7e0faf9146b21ba12cd6c652d22   3.2.0             7h9m
01-master-container-runtime                        14a1ca2cb91ff7e0faf9146b21ba12cd6c652d22   3.2.0             7h9m
01-master-kubelet                                  14a1ca2cb91ff7e0faf9146b21ba12cd6c652d22   3.2.0             7h9m
01-worker-container-runtime                        14a1ca2cb91ff7e0faf9146b21ba12cd6c652d22   3.2.0             7h9m
01-worker-kubelet                                  14a1ca2cb91ff7e0faf9146b21ba12cd6c652d22   3.2.0             7h9m
99-master-generated-registries                     14a1ca2cb91ff7e0faf9146b21ba12cd6c652d22   3.2.0             7h9m
99-master-ssh                                                                                 3.2.0             7h12m
99-worker-generated-registries                     14a1ca2cb91ff7e0faf9146b21ba12cd6c652d22   3.2.0             7h9m
99-worker-ssh                                                                                 3.2.0             7h12m
rendered-master-776795ba386f51183d369194cba4fff7   ce39533a3346da509f49379c537133eea9bb6c06   3.2.0             5h34m
rendered-master-7a44c3f1feac5e0b973266d4a84e4f96   14a1ca2cb91ff7e0faf9146b21ba12cd6c652d22   3.2.0             3h13m
rendered-master-a4b9cda006883e9d42ef59fb46e6ced7   d2d236b1952843821602ec36cd5817e72fd0a407   3.2.0             7h9m
rendered-worker-64e6908fe1f39234d699c16e2432a507   ce39533a3346da509f49379c537133eea9bb6c06   3.2.0             5h34m
rendered-worker-7b6b0b0b8220ec65cd353739a28eb321   d2d236b1952843821602ec36cd5817e72fd0a407   3.2.0             7h9m
rendered-worker-cacd3898ae540c0ceff38fefcc91a815   14a1ca2cb91ff7e0faf9146b21ba12cd6c652d22   3.2.0             3h13m

查看一个 “rendered-worker-xxxxx” 对象,其中包含由 OpenShift 的 MachineConfig 维护的配置文件。

$ oc describe mc rendered-worker-64e6908fe1f39234d699c16e2432a507

什么是配置漂移

在 OpenShift 运行的时候,一个运行 RHCOS 的节点的状态会不同于 OpenShift Machine Config 中的配置。这就是所谓的“配置漂移”。例如,集群管理员可能会手动修改一个 RHCOS 节点中的文件,例如一个 systemd 单元文件,或者 RHCOS 中一个通过 MachineConfig 配置的文件权限。这就差异就是配置漂移。配置漂移不但有可能产生安全隐患,还有可能在 MachineConfigPool 中的节点之间或 MachineConfig 更新时造成问题。

OpenShift 的 Machine Config Operator(MCO)使用 Machine Config Daemon(MCD)定期检查节点的配置漂移。MCD 在以下情况会执行配置漂移检测:

  • 当一个节点启动时。
  • 绕过 OpenShift Machine Config 机制对主机配置(Ignition 文件和 systemd 单元)进行修改后。
  • 在应用新的 MachineConfig 之前。

在进行配置漂移检测时,MCD 会验证文件内容和权限是否与当前应用的 Machine Config 所规定的完全一致。如果 MCD 检测到了配置漂移,MCD会执行以下任务。

  • 向控制台日志发出一个错误信息
  • 发出一个 Kubernetes 事件
  • 停止对节点的进一步检测
  • 将节点和 Machine Config Pool 设置为 “Degraded”

如果检测到节点发生配置漂移,MCO 就会将节点和 Machine Config Pool(MCP)设置为 “Degraded” 降级状态并报告错误。被降级的节点虽然还处于在线可以运行状态,但是已经不能被更新。

形成配置漂移

  1. 查看当前针对 Worker 节点 MCP,当前 DEGRADEDMACHINECOUNT 数量为 “0”。
$ oc get machineconfigpool worker
NAME     CONFIG                                             UPDATED   UPDATING   DEGRADED   MACHINECOUNT   READYMACHINECOUNT   UPDATEDMACHINECOUNT   DEGRADEDMACHINECOUNT   AGE
worker   rendered-worker-cacd3898ae540c0ceff38fefcc91a815   True      False      False      2              2                   2                     0                      6h40m
  1. 通过 debug 进入一个 Worker Node。
$ oc debug node/WORKER-NODENAME
To use host binaries, run `chroot /host`
Pod IP: 10.0.189.30
If you don't see a command prompt, try pressing enter.
sh-4.4# chroot /host
  1. 修改 /etc/mco/proxy.env 文件为以下内容。
/etc/mco/proxy.env
sh-4.4# more /etc/mco/proxy.env
# Proxy environment variables will be populated in this file. Properly
# url encoded passwords with special characters will use '%<HEX><HEX>'.
# Systemd requires that any % used in a password be represented as
# %% in a unit file since % is a prefix for macros; this restriction does not
# apply for environment files. Templates that need the proxy set should use
EnvironmentFile=/etc/mco/proxy.env
  1. 用命令或在 OpenShift 控制台中再次查看 MCP (机器配置池)对象。可以看到名为 worker 的 MCP 已经处于 “DEGRADEDMACHINECOUNT (降级)” 状态了。
$ oc get machineconfigpool worker
NAME     CONFIG                                             UPDATED   UPDATING   DEGRADED   MACHINECOUNT   READYMACHINECOUNT   UPDATEDM                             ACHINECOUNT   DEGRADEDMACHINECOUNT   AGE
worker   rendered-worker-cacd3898ae540c0ceff38fefcc91a815   False     True       True       2              1                   1                                                  1                      6h52m

在这里插入图片描述

  1. 查看名为 worker 的 MCP,其中提示是哪个节点出现了配置漂移,以及配置漂移文件是 “/etc/mco/proxy.env”。

这条消息显示一个节点的 /etc/mco/proxy.env 文件是由 MachineConfig 添加的,但是在 MachineConfig 之外发生了变化。

$ oc describe machineconfigpool worker
 ...
    Last Transition Time:  2022-02-26T09:43:02Z
    Message:               All nodes are updating to rendered-worker-cacd3898ae540c0ceff38fefcc91a815
    Reason:
    Status:                True
    Type:                  Updating
    Last Transition Time:  2022-02-26T09:43:02Z
    Message:               Node ip-10-0-189-30.us-east-2.compute.internal is reporting: "content mismatch for file \"/etc/mco/proxy.env\""
    Reason:                1 nodes are reporting degraded status on sync
    Status:                True
 ...
  1. 查看上一步提示的出现配置漂移的节点,根据提示可知该节点的 "/etc/mco/proxy.env"和名为“rendered-worker-cacd3898ae540c0ceff38fefcc91a815”的 MachineConfig 冲突了。
$ oc describe node/ip-10-0-189-30.us-east-2.compute.internal
 ...
Annotations:        cloud.network.openshift.io/egress-ipconfig:
                      [{"interface":"eni-052f54f017dc3ae35","ifaddr":{"ipv4":"10.0.128.0/17"},"capacity":{"ipv4":29,"ipv6":30}}]
                    csi.volume.kubernetes.io/nodeid: {"ebs.csi.aws.com":"i-055d02acee78fd8b4"}
                    machine.openshift.io/machine: openshift-machine-api/cluster-4sfw7-d97vt-worker-us-east-2b-9nh4v
                    machineconfiguration.openshift.io/controlPlaneTopology: HighlyAvailable
                    machineconfiguration.openshift.io/currentConfig: rendered-worker-cacd3898ae540c0ceff38fefcc91a815
                    machineconfiguration.openshift.io/desiredConfig: rendered-worker-cacd3898ae540c0ceff38fefcc91a815
                    machineconfiguration.openshift.io/reason: content mismatch for file "/etc/mco/proxy.env"
                    machineconfiguration.openshift.io/state: Degraded
 ...

处理配置漂移

可以通过执行以下任意补救措施来纠正配置漂移并将节点返回到 “Ready” 状态。

  • 根据根据当前 OpenShift 的 MachineConfig 配置手动修改降级的节点的相关文件内容或改变文件权限。
  • 在降级的节点上生成一个强制文件。强制文件使 MCD 绕过通常的配置漂移检测,重新应用当前的机器配置。

手工恢复配置

  1. 找到在上一步中名为 “machineconfiguration.openshift.io/desiredConfig” 注释内容 “rendered-worker-cacd3898ae540c0ceff38fefcc91a815”,然后查看这个 MachineConfig 中的 “proxy.env” 内容。
$ oc describe mc rendered-worker-cacd3898ae540c0ceff38fefcc91a815 | grep proxy.env
          Source:   data:,%23%20Proxy%20environment%20variables%20will%20be%20populated%20in%20this%20file.%20Properly%0A%23%20url%20encoded%20passwords%20with%20special%20characters%20will%20use%20'%25%3CHEX%3E%3CHEX%3E'.%0A%23%20Systemd%20requires%20that%20any%20%25%20used%20in%20a%20password%20be%20represented%20as%0A%23%20%25%25%20in%20a%20unit%20file%20since%20%25%20is%20a%20prefix%20for%20macros%3B%20this%20restriction%20does%20not%0A%23%20apply%20for%20environment%20files.%20Templates%20that%20need%20the%20proxy%20set%20should%20use%0A%23%20'EnvironmentFile%3D%2Fetc%2Fmco%2Fproxy.env'.%0A
  1. 将上一步 “data:,” 后面的内容(这部分内容被 URL 编码了)复制到 “https://www.urldecoder.net/” 网页中,在 DECODE 后可以看到 “proxy.env” 文件的原始信息。
    在这里插入图片描述
    或者执行以下命令,显示上面的 “data:,” 后面的内容。
$ DATA="%23%20Proxy%20environment%20variables%20will%20be%20populated%20in%20this%20file.%20Properly%0A%23%20url%20encoded%20passwords%20with%20special%20characters%20will%20use%20'%25%3CHEX%3E%3CHEX%3E'.%0A%23%20Systemd%20requires%20that%20any%20%25%20used%20in%20a%20password%20be%20represented%20as%0A%23%20%25%25%20in%20a%20unit%20file%20since%20%25%20is%20a%20prefix%20for%20macros%3B%20this%20restriction%20does%20not%0A%23%20apply%20for%20environment%20files.%20Templates%20that%20need%20the%20proxy%20set%20should%20use%0A%23%20'EnvironmentFile%3D%2Fetc%2Fmco%2Fproxy.env'.%0A"

$ echo -e "$(echo "${DATA}" | sed 'y/+/ /; s/%/\\x/g')"
# Proxy environment variables will be populated in this file. Properly
# url encoded passwords with special characters will use '%<HEX><HEX>'.
# Systemd requires that any % used in a password be represented as
# %% in a unit file since % is a prefix for macros; this restriction does not
# apply for environment files. Templates that need the proxy set should use
# 'EnvironmentFile=/etc/mco/proxy.env'.
  1. 可以进入提示有配置漂移的 Node 中,再根据上面获得原始文件内容修改 /etc/mco/proxy.env 文件。

强制恢复配置

  1. 使用前面说明的 “oc debug” 命令再次进入出现配置漂移的 Node,然后执行以下命令即可强制恢复漂移配置。
sh-4.4# touch /run/machine-config-daemon-force
  1. 执行上面命令后先退出 Node,然后再执行以下命令,确认最终 DEGRADEDMACHINECOUNT 又恢复 “0” 了。
$ oc get machineconfigpool worker -w
NAME     CONFIG                                             UPDATED   UPDATING   DEGRADED   MACHINECOUNT   READYMACHINECOUNT   UPDATEDMACHINECOUNT   DEGRADEDMACHINECOUNT   AGE
worker   rendered-worker-cacd3898ae540c0ceff38fefcc91a815   True      False      False      2              2                   2                     0                      8h

演示视频

视频

参考

https://access.redhat.com/solutions/5414371

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值