概览

目录

机器配置的工作原理

机器配置负责集群节点上的文件更新、systemd 单元管理以及 SSH 公钥部署。系统提供了 MachineConfig 自定义资源定义(CRD)用于向主机写入配置文件,以及 MachineConfigPool CRD 用于将节点组织成配置组。

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

在集群安装过程中,系统会自动创建两个 MachineConfigPool(控制平面和工作节点)以及两个空的 MachineConfig(00-master 和 00-worker)。控制平面池管理 00-master 配置,工作节点池管理 00-worker 配置。

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

自定义 MachineConfigPool 会继承工作节点池的所有配置,并添加其特定设置。对工作节点池的任何更改都会自动传播到自定义池。机器配置不支持不继承工作节点池的自定义池。

集群包含一个名为 "cluster" 的默认 MachineConfiguration CR,用于设置全局节点更新策略。详情请参见节点中断策略文档。

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

关键概念

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

更新策略
机器配置按节点年龄顺序更新,从最旧节点开始。每个 MachineConfigPool 的 maxUnavailable 字段控制同时更新的节点数量。

管理范围
机器配置仅管理显式配置的项目。手动系统更改不会被机器配置 Operator 覆盖。

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

漂移检测
当机器配置管理的文件被系统外更改时,machine-config-daemon 会将节点标记为 Degraded,但不会覆盖被修改的文件。

池的优势
MachineConfigPool 确保新加入的节点自动获得正确配置。

支持的修改类型

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

机器配置不会创建用户或组。您必须先创建 boot 用户和组,才能配置 SSH 密钥。

重要提示:避免手动修改节点,可能导致配置冲突。

配置类型

文件
创建或修改文件内容和权限。仅当文件所在分区可写时,文件才能被管理。

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

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

节点更新流程

应用 MachineConfig 后,机器配置确保所有受影响节点达到期望状态。机器配置 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 或无法调和的节点数

此示例中,三个控制平面节点均为当前状态,工作节点池正在更新——两个节点已完成,一个节点正在进行中。

获取详细池信息:

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:检测到配置漂移或应用失败,请检查日志以查明原因