概览

Machine Configuration 的工作原理

Machine Configuration 负责跨集群节点的文件更新、systemd 单元管理以及 SSH 公钥部署。该系统提供 MachineConfig Custom Resource Definition(CRD),用于向主机写入配置文件;还提供 MachineConfigPool CRD,用于将节点组织为配置组。

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

在集群安装期间,系统会自动创建两个 MachineConfigPools(control plane 和 worker),以及两个空的 MachineConfigs(00-master 和 00-worker)。control plane 池管理 00-master 配置,而 worker 池管理 00-worker 配置。

你可以为需要特殊配置的 worker 节点创建自定义 MachineConfigPools。control plane 节点不能使用自定义池。

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

集群包含一个默认的 MachineConfiguration CR,名为 "cluster",用于设置全局节点更新策略。有关详细信息,请参阅 Node Disruption Policy 文档。

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

关键概念

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

更新策略 Machine Configuration 按节点创建时间从旧到新更新节点。每个 MachineConfigPool 中的 maxUnavailable 字段控制可同时更新的节点数量。

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

配置格式 所有 MachineConfigs 都使用 Ignition v3.4.0 规范格式。

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

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

支持的修改

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

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

重要:避免手动修改节点——这可能会导致配置冲突。

配置类型

文件 创建或修改文件内容和权限。只有当文件所在分区可写时,才能对该文件进行管理。

systemd 单元 定义新的 systemd 服务,或通过附加配置扩展现有服务。

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

节点更新流程

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

  1. Cordon - 将节点标记为不可调度,以避免接收新工作负载
  2. Drain - 终止现有工作负载,并将其重新调度到其他位置
  3. Apply - 将新配置写入磁盘
  4. Reboot - 重启节点以使更改生效
  5. Uncordon - 将节点重新标记为可调度

检查 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:被标记为 degraded 或无法修复的节点数

在此示例中,三个 control plane 节点都已是最新状态,而 worker 池正在更新——其中两个节点已完成,一个正在进行中。

获取详细的池信息:

kubectl describe machineconfigpool worker

查看所有 MachineConfigs:

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:节点正在更新(current ≠ desired)
    • Degraded:检测到配置漂移或应用失败——请检查日志以定位根本原因