概览

机器配置的工作原理

Machine Configuration 负责在集群节点之间更新文件、管理 systemd 单元以及部署 SSH 公钥。系统提供 MachineConfig Custom Resource Definition (CRD),用于将配置文件写入主机;同时提供 MachineConfigPool CRD,用于将节点组织到配置组中。

每个 MachineConfigPool 管理一组节点及其关联的 MachineConfig。节点角色决定其 MachineConfigPool 成员身份——池根据节点的角色标签管理节点。

Machine Configuration 仅管理运行 Alauda OS 的节点。控制平面节点由控制平面池管理,其他所有节点由 worker 池管理。

Machine Configuration 随 Alauda OS 集群一起提供,无需单独安装。当 Machine Configuration Operator 首次在集群上启动时,它会自动创建两个 MachineConfigPool(控制平面和 worker),以及两个空的 MachineConfig(00-master 和 00-worker)。控制平面池管理 00-master 配置,而 worker 池管理 00-worker 配置。

您可以为需要专用配置的 worker 节点创建自定义 MachineConfigPool。控制平面节点不能使用自定义池。

自定义 MachineConfigPool 会继承 worker 池的所有配置,并添加自身的特定设置。对 worker 池的任何更改都会自动传播到自定义池。Machine Configuration 不支持不继承 worker 池的自定义池。

operator 还会创建一个名为 "cluster" 的默认 MachineConfiguration CR,用于设置全局节点更新策略。有关详细信息,请参阅节点中断策略文档。

有时,节点配置会偏离其预期状态。machine-config-daemon 会持续监控配置偏差,并将受影响的节点标记为 Degraded,直到管理员解决问题。Degraded 节点仍可正常运行,但无法接收更新。

关键概念

配置处理

MachineConfig 按字母顺序处理。第一个配置作为基础,后续配置逐层叠加。每个 MachineConfigPool 都会将其管理的配置渲染为一个名为 render-<pool-name>-<content-hash> 的 MachineConfig,并将其应用于该池中的所有节点。

更新策略

Machine Configuration 按节点年龄更新节点,从最旧的节点开始。每个 MachineConfigPool 中的 maxUnavailable 字段控制同时更新的节点数量。

管理范围

Machine Configuration 仅管理明确配置的项目。手动进行的系统更改不会受到 Machine Configuration Operator 的影响。

配置格式

所有 MachineConfig 均使用 Ignition v3.4.0 规范格式。

偏差检测

当 Machine Configuration 管理的文件在系统外部发生更改时,machine-config-daemon 会将节点标记为 Degraded,但不会覆盖已修改的文件。

池的优势

MachineConfigPool 可确保新节点加入集群时自动获得正确的配置。

支持的修改

  • 普通文件(位于可写的非根目录中)
  • systemd 单元及其配置
  • 仅适用于 boot 用户的 SSH 公钥

Machine Configuration 不会创建用户或组。配置 SSH 密钥之前,必须先创建 boot 用户和组。

重要信息:避免手动修改节点,否则可能导致配置冲突。

配置类型

文件

创建或修改文件内容及权限。只有在文件所在分区可写时,才能管理这些文件。

Systemd 单元

定义新的 systemd 服务,或使用其他配置扩展现有服务。

SSH 公钥

为 boot 用户配置 SSH 访问权限。其他用户的密钥会被视为无效并拒绝。

节点更新过程

应用 MachineConfig 时,Machine Configuration 会确保所有受影响的节点达到所需状态。Machine Configuration Operator 会生成新的渲染配置,machine-config-daemon 则在每个节点上执行以下步骤:

  1. 隔离 - 将节点标记为不可调度新工作负载
  2. 排空 - 终止现有工作负载,并将其重新调度到其他位置
  3. 应用 - 将新配置写入磁盘
  4. 重启 - 重启节点以激活更改
  5. 解除隔离 - 将节点标记为可再次调度

验证 Machine Configuration 是否正在运行

在集群上创建 MachineConfig 对象之前,请确认 Machine Configuration 正在运行。

  1. 确认两个组件均已启动。控制器在控制平面节点上运行;守护进程在每个节点上运行:

    kubectl -n cpaas-system get deployment machine-config-controller
    kubectl -n cpaas-system get daemonset machine-config-daemon
  2. 确认 operator 已创建其初始对象:

    kubectl get machineconfigpool
    NAME     CONFIG                   UPDATED   UPDATING   DEGRADED   MACHINECOUNT   READYMACHINECOUNT   UPDATEDMACHINECOUNT   DEGRADEDMACHINECOUNT   AGE
    master   rendered-master-06c9c4   True      False      False      3              3                   3                     0                      3m
    worker   rendered-worker-f4b64    True      False      False      3              3                   3                     0                      3m
    kubectl get machineconfig
    NAME        IGNITIONVERSION   AGE
    00-master   3.4.0             3m
    00-worker   3.4.0             3m
    kubectl get machineconfiguration cluster
  3. 如果未显示分区或基础配置,请检查控制器日志。控制器会在启动时创建所有这些对象:

    kubectl -n cpaas-system logs deployment/machine-config-controller

检查 MachineConfigPool 状态

使用以下命令检查分区状态:

kubectl get machineconfigpool

示例输出:

NAME     CONFIG                    UPDATED  UPDATING  DEGRADED  MACHINECOUNT  READYMACHINECOUNT  UPDATEDMACHINECOUNT  DEGRADEDMACHINECOUNT  AGE
master   rendered-master-06c9c4    True     False     False     3             3                  3                    0                     4h42m
worker   rendered-worker-f4b64     False    True      False     3             2                  2                    0                     4h42m

字段参考:

  • NAME:分区标识符
  • CONFIG:应用于分区所有节点的最新配置
  • UPDATED:所有节点均使用当前配置时为 True;更新期间为 False
  • UPDATING:至少有一个节点正在更新时为 True;所有节点均为最新状态时为 False
  • DEGRADED:至少有一个节点无法应用配置时为 True
  • MACHINECOUNT:分区中的节点总数
  • READYMACHINECOUNT:使用当前配置且处于健康、可调度状态的节点数
  • UPDATEDMACHINECOUNT:已应用当前配置的节点数
  • DEGRADEDMACHINECOUNT:标记为降级或无法协调的节点数

在此示例中,三个控制平面节点均为最新状态,而 worker 分区正在更新——其中两个节点已完成,一个节点正在更新。

获取详细的分区信息:

kubectl describe machineconfigpool worker

查看所有 MachineConfig:

kubectl get machineconfig

示例输出:

NAME                    IGNITIONVERSION  AGE
00-master               3.4.0            3h2m
00-worker               3.4.0            3h2m
rendered-master-ccb     3.4.0            1h12m
rendered-worker-bad     3.4.0            1h20m

检查特定配置:

kubectl describe machineconfig 00-master

检查单个节点的状态:

kubectl get node -o custom-columns=NODE:.metadata.name,DESIRED:.metadata.annotations."machineconfiguration\.alauda\.io/desiredConfig",CURRENT:.metadata.annotations."machineconfiguration\.alauda\.io/currentConfig",STATE:.metadata.annotations."machineconfiguration\.alauda\.io/state"

示例输出:

NODE              DESIRED                                    CURRENT                                    STATE
192.168.132.216   rendered-master-98db9ca4f4b4cd             rendered-master-98db9ca4f4b4cd             Degraded
192.168.135.83    rendered-worker-05f27341ba49cf86dc4b      rendered-master-e08d9cab50e383             Working
192.168.134.99    rendered-worker-05f27341ba49cf86dc4b      rendered-worker-05f27341ba49cf86dc4b      Done

节点状态参考:

  • NODE:节点标识符
  • DESIRED:节点的目标配置
  • CURRENT:当前已应用的配置
  • STATE:配置状态
    • Done:节点健康,目标配置与当前配置匹配
    • Working:节点正在更新(当前配置 ≠ 目标配置)
    • Degraded:检测到配置漂移或应用失败——请检查日志以确定根本原因