×

默认情况下,当您对MachineConfig对象中的字段进行某些更改时,机器配置操作符 (MCO) 将清空并重新引导与该机器配置关联的节点。但是,您可以创建一个节点中断策略,该策略定义对某些 Ignition 配置对象进行的更改,这些更改几乎不会对您的工作负载造成中断。

节点中断策略允许您定义导致集群中断的配置更改以及不会导致中断的更改。这允许您在对集群中进行小的机器配置更改时减少节点停机时间。要配置策略,您需要修改MachineConfiguration对象,该对象位于openshift-machine-config-operator命名空间中。请参阅以下MachineConfiguration对象中的节点中断策略示例。

无论任何节点中断策略如何,某些机器配置更改始终需要重新引导。有关更多信息,请参阅关于机器配置操作符

创建节点中断策略后,MCO 将验证策略以搜索文件中潜在的问题,例如格式问题。然后,MCO 将策略与集群默认值合并,并使用在将来对机器配置进行更改时要执行的操作填充机器配置中的status.nodeDisruptionPolicyStatus字段。策略中的配置始终会覆盖集群默认值。

MCO 不会验证您的节点中断策略是否可以成功应用更改。因此,您有责任确保节点中断策略的准确性。

例如,您可以配置节点中断策略,以便 sudo 配置不需要清空和重新引导节点。或者,您可以配置集群,以便仅重新加载一项服务即可应用对sshd的更新。

您可以控制在对以下 Ignition 配置对象进行更改时 MCO 的行为

  • 配置文件:您添加到或更新/var/etc目录中的文件。您可以为目录中的任何特定文件或特定目录的路径配置策略。对于路径,对该目录中任何文件的更改或添加都会触发策略。

    如果一个文件包含在多个策略中,则只应用与该文件最佳匹配的策略。

    例如,如果您有一个针对/etc/目录的策略和一个针对/etc/pki/目录的策略,则对/etc/pki/tls/certs/ca-bundle.crt文件的更改将应用etc/pki策略。

  • systemd 单元:您可以创建并设置 systemd 服务的状态或修改 systemd 服务。

  • 用户和组:您在安装后更改passwd部分中的 SSH 密钥。

  • ICSPITMSIDMS 对象:您可以从ImageContentSourcePolicy (ICSP)、ImageTagMirrorSet (ITMS) 和ImageDigestMirrorSet (IDMS) 对象中删除镜像规则。

当您进行任何这些更改时,节点中断策略将确定 MCO 实施更改时需要执行以下哪些操作

  • 重新引导:MCO 将清空并重新引导节点。这是默认行为。

  • :MCO 不会清空或重新引导节点。MCO 将应用更改,无需进一步操作。

  • 清空:MCO 将隔离其工作负载并将其从节点中清空。工作负载将使用新配置重新启动。

  • 重新加载:对于服务,MCO 将重新加载指定的服务,而无需重新启动服务。

  • 重新启动:对于服务,MCO 将完全重新启动指定的服务。

  • DaemonReload:MCO 重新加载 systemd 管理器配置。

  • 特殊:这是一个仅限 MCO 内部使用的操作,用户无法设置。

  • RebootNone 动作不能与任何其他动作一起使用,因为 RebootNone 动作会覆盖其他动作。

  • 动作将按照其在节点中断策略列表中设置的顺序应用。

  • 如果您进行其他需要重新引导或对节点进行其他中断的机器配置更改,则该重新引导将优先于节点中断策略动作。

节点中断策略示例

以下示例 MachineConfiguration 对象包含节点中断策略。

MachineConfiguration 对象和 MachineConfig 对象是不同的对象。MachineConfiguration 对象是 MCO 命名空间中的单例对象,包含 MCO 运算符的配置参数。MachineConfig 对象定义应用于机器配置池的更改。

以下示例 MachineConfiguration 对象显示没有用户定义的策略。默认节点中断策略值显示在 status 部分中。

默认节点中断策略
apiVersion: operator.openshift.io/v1
kind: MachineConfiguration
  name: cluster
spec:
  logLevel: Normal
  managementState: Managed
  operatorLogLevel: Normal
status:
  nodeDisruptionPolicyStatus:
    clusterPolicies:
      files:
      - actions:
        - type: None
        path: /etc/mco/internal-registry-pull-secret.json
      - actions:
        - type: None
        path: /var/lib/kubelet/config.json
      - actions:
        - reload:
            serviceName: crio.service
          type: Reload
        path: /etc/machine-config-daemon/no-reboot/containers-gpg.pub
      - actions:
        - reload:
            serviceName: crio.service
          type: Reload
        path: /etc/containers/policy.json
      - actions:
        - type: Special
        path: /etc/containers/registries.conf
      - actions:
        - reload:
            serviceName: crio.service
          type: Reload
        path: /etc/containers/registries.d
      - actions:
        - type: None
        path: /etc/nmstate/openshift
      - actions:
        - restart:
            serviceName: coreos-update-ca-trust.service
          type: Restart
        - restart:
            serviceName: crio.service
          type: Restart
        path: /etc/pki/ca-trust/source/anchors/openshift-config-user-ca-bundle.crt
      sshkey:
        actions:
        - type: None
  observedGeneration: 9

在以下示例中,当对 SSH 密钥进行更改时,MCO 会清空集群节点,重新加载 crio.service,重新加载 systemd 配置,并重新启动 crio-service

SSH 密钥更改的节点中断策略示例
apiVersion: operator.openshift.io/v1
kind: MachineConfiguration
metadata:
  name: cluster
  namespace: openshift-machine-config-operator
# ...
spec:
  nodeDisruptionPolicy:
    sshkey:
      actions:
      - type: Drain
      - reload:
          serviceName: crio.service
        type: Reload
      - type: DaemonReload
      - restart:
          serviceName: crio.service
        type: Restart
# ...

在以下示例中,当对 /etc/chrony.conf 文件进行更改时,MCO 会重新加载集群节点上的 chronyd.service。如果向 /var/run 目录添加文件或修改文件,则 MCO 会应用更改,而无需执行其他操作。

配置文件更改的节点中断策略示例
apiVersion: operator.openshift.io/v1
kind: MachineConfiguration
metadata:
  name: cluster
  namespace: openshift-machine-config-operator
# ...
spec:
  nodeDisruptionPolicy:
    files:
    - actions:
      - reload:
          serviceName: chronyd.service
        type: Reload
        path: /etc/chrony.conf
    - actions:
      - type: None
      path: /var/run

在以下示例中,当对 auditd.service systemd 单元进行更改时,MCO 会清空集群节点,重新加载 crio.service,重新加载 systemd 管理器配置,并重新启动 crio-service

systemd 单元更改的节点中断策略示例
apiVersion: operator.openshift.io/v1
kind: MachineConfiguration
metadata:
  name: cluster
  namespace: openshift-machine-config-operator
# ...
spec:
  nodeDisruptionPolicy:
    units:
      - name: auditd.service
        actions:
          - type: Drain
          - type: Reload
            reload:
              serviceName: crio.service
          - type: DaemonReload
          - type: Restart
            restart:
              serviceName: crio.service

在以下示例中,当对 registries.conf 文件进行更改时(例如,通过编辑 ImageContentSourcePolicy (ICSP) 对象),MCO 不会清空或重新引导节点,并应用更改而无需执行其他操作。

registries.conf 文件更改的节点中断策略示例
apiVersion: operator.openshift.io/v1
kind: MachineConfiguration
metadata:
  name: cluster
  namespace: openshift-machine-config-operator
# ...
spec:
  nodeDisruptionPolicy:
    files:
      - actions:
        - type: None
        path: /etc/containers/registries.conf

配置机器配置更改后节点重启行为

您可以创建一个节点中断策略来定义导致集群中断的机器配置更改,以及哪些更改不会导致中断。

您可以控制节点如何响应 /var/etc 目录中的文件、systemd 单元、SSH 密钥和 registries.conf 文件的更改。

当您进行任何这些更改时,节点中断策略将确定 MCO 实施更改时需要执行以下哪些操作

  • 重新引导:MCO 将清空并重新引导节点。这是默认行为。

  • :MCO 不会清空或重新引导节点。MCO 将应用更改,无需进一步操作。

  • 清空:MCO 将隔离其工作负载并将其从节点中清空。工作负载将使用新配置重新启动。

  • 重新加载:对于服务,MCO 将重新加载指定的服务,而无需重新启动服务。

  • 重新启动:对于服务,MCO 将完全重新启动指定的服务。

  • DaemonReload:MCO 重新加载 systemd 管理器配置。

  • 特殊:这是一个仅限 MCO 内部使用的操作,用户无法设置。

  • RebootNone 动作不能与任何其他动作一起使用,因为 RebootNone 动作会覆盖其他动作。

  • 动作将按照其在节点中断策略列表中设置的顺序应用。

  • 如果您进行其他需要重新引导或对节点进行其他中断的机器配置更改,则该重新引导将优先于节点中断策略动作。

步骤
  1. 编辑 machineconfigurations.operator.openshift.io 对象以定义节点中断策略

    $ oc edit MachineConfiguration cluster -n openshift-machine-config-operator
  2. 添加类似于以下内容的节点中断策略

    apiVersion: operator.openshift.io/v1
    kind: MachineConfiguration
    metadata:
      name: cluster
    # ...
    spec:
      nodeDisruptionPolicy: (1)
        files: (2)
        - actions: (3)
          - reload: (4)
              serviceName: chronyd.service (5)
            type: Reload
          path: /etc/chrony.conf (6)
        sshkey: (7)
          actions:
          - type: Drain
          - reload:
              serviceName: crio.service
            type: Reload
          - type: DaemonReload
          - restart:
              serviceName: crio.service
            type: Restart
        units: (8)
        - actions:
          - type: Drain
          - reload:
              serviceName: crio.service
            type: Reload
          - type: DaemonReload
          - restart:
              serviceName: crio.service
            type: Restart
          name: test.service
    1 指定节点中断策略。
    2 指定机器配置文件定义列表以及对这些路径上的更改采取的操作。此列表最多支持 50 个条目。
    3 指定对指定文件进行更改后要执行的一系列操作。操作将按照在此列表中设置的顺序应用。此列表最多支持 10 个条目。
    4 指定对指定文件进行更改后要重新加载列出的服务。
    5 指定要对其进行操作的服务的完整名称。
    6 指定由机器配置管理的文件的位置。当对 path 中的文件进行更改时,策略中的操作将适用。
    7 指定服务名称列表以及对集群中 SSH 密钥的更改采取的操作。
    8 指定 systemd 单元名称列表以及对这些单元的更改采取的操作。
验证
  • 查看您创建的 MachineConfiguration 对象文件

    $ oc get MachineConfiguration/cluster -o yaml
    示例输出
    apiVersion: operator.openshift.io/v1
    kind: MachineConfiguration
    metadata:
      labels:
        machineconfiguration.openshift.io/role: worker
      name: cluster
    # ...
    status:
      nodeDisruptionPolicyStatus: (1)
        clusterPolicies:
          files:
    # ...
          - actions:
            - reload:
                serviceName: chronyd.service
              type: Reload
            path: /etc/chrony.conf
          sshkey:
            actions:
            - type: Drain
            - reload:
                serviceName: crio.service
              type: Reload
            - type: DaemonReload
            - restart:
                serviceName: crio.service
              type: Restart
          units:
          - actions:
            - type: Drain
            - reload:
                serviceName: crio.service
              type: Reload
            - type: DaemonReload
            - restart:
                serviceName: crio.service
              type: Restart
            name: test.se
    # ...
    1 指定当前集群验证的策略。