调整节点内核参数 (sysctl)

某些内核参数是按节点而不是按工作负载设置的,例如 ARP/neighbor 表垃圾回收阈值。这些是节点级别的(非命名空间)设置,因此无法通过 Pod 的 securityContext.sysctls 或安全上下文约束来设置;必须在主机上应用。

你可以通过使用 MachineConfig 对象写入一个 sysctl drop-in 文件来设置它们。该设置会作为单独的文件写入 /etc/sysctl.d/ 下,因此节点的其他内核设置保持不变。将 MachineConfig 与节点中断策略配对,以便在不重启节点的情况下应用该值。

何时使用此功能

一个常见场景是大型集群中的节点记录了 neighbour table overflow 错误:ARP/neighbor 表对于对等方数量来说太小,需要提高其垃圾回收阈值。下面的示例会提高这些阈值;同样的操作步骤也适用于任何节点级别的 sysctl 键。

设置内核参数

以下示例会在工作节点上提高 ARP/neighbor 表垃圾回收阈值。

  1. 创建 sysctl drop-in 文件。每一行都是一个 key = value 对:

    net.ipv4.neigh.default.gc_thresh1 = 32768
    net.ipv4.neigh.default.gc_thresh2 = 65536
    net.ipv4.neigh.default.gc_thresh3 = 262144
  2. 将内容进行 Base64 编码:

    base64 -w0 99-neigh-thresh.conf
  3. 创建一个 MachineConfig 对象,将该文件写入 /etc/sysctl.d/ 下:

    apiVersion: machineconfiguration.alauda.io/v1alpha1
    kind: MachineConfig
    metadata:
      name: 99-worker-neigh-thresh
      labels:
        machineconfiguration.alauda.io/role: worker
    spec:
      config:
        ignition:
          version: 3.4.0
        storage:
          files:
            - path: /etc/sysctl.d/99-neigh-thresh.conf
              mode: 0o644
              overwrite: true
              contents:
                source: 'data:text/plain;base64,bmV0LmlwdjQubmVpZ2guZGVmYXVsdC5nY190aHJlc2gxID0gMzI3NjgKbmV0LmlwdjQubmVpZ2guZGVmYXVsdC5nY190aHJlc2gyID0gNjU1MzYKbmV0LmlwdjQubmVpZ2guZGVmYXVsdC5nY190aHJlc2gzID0gMjYyMTQ0Cg=='

    role 标签用于选择将文件应用到哪些节点。若只想针对节点的一个子集,请创建自定义的 MachineConfigPool,并将标签设置为该池的 role

  4. 配置一个节点中断策略,以便在此文件发生更改时重新应用 sysctl 设置。由于文件更改的默认操作是 None,否则该文件只会写入磁盘而不会生效。请将以下内容添加到 cpaas-system 命名空间中的 cluster MachineConfiguration 对象,并在应用 MachineConfig 之前 确认它已反映在 status.nodeDisruptionPolicyStatus 中:

    apiVersion: machineconfiguration.alauda.io/v1alpha1
    kind: MachineConfiguration
    metadata:
      name: cluster
    spec:
      nodeDisruptionPolicy:
        files:
          - path: /etc/sysctl.d/99-neigh-thresh.conf
            actions:
              - type: Restart
                restart:
                  serviceName: systemd-sysctl.service
        sshkey:
          actions:
            - type: None

重新启动 systemd-sysctl.service 会重新应用 /etc/sysctl.d/ 下的所有文件。新值会立即生效,且节点不会重启。

WARNING

请先为该文件路径设置节点中断策略,并等待它出现在 status.nodeDisruptionPolicyStatus 中。如果在策略生效之前应用 MachineConfig,文件会被写入磁盘,但该值不会被应用。有关完整的中断操作列表,请参阅 节点中断策略

验证更改

在目标节点上,读取该参数:

sysctl net.ipv4.neigh.default.gc_thresh2

输出应显示你设置的值:

net.ipv4.neigh.default.gc_thresh2 = 65536

回滚更改

删除 MachineConfig 对象以移除 drop-in 文件。已经应用的值会在运行中的内核上继续生效,直到节点下次重启,之后将应用节点的默认值。