节点预处理

在安装 global 集群之前,所有节点(控制平面节点和工作节点)都必须完成预处理。

INFO

此页面适用于运行非 Alauda OS 的节点,例如 Kylin Linux Advanced Server、RHEL 或 Ubuntu,并且由 通过 SSH 进行置备。下面的多项检查(例如 SSH 用户和 /etc/ssh/sshd_config 设置)用于确保基于 SSH 的节点加入操作正常运行。如果您的集群使用 Alauda OS,则本页面中的节点预处理步骤不适用。请改为遵循 在 Alauda OS 上安装 global 集群。

支持的 OS 和内核版本

下表列出了支持的操作系统、经过验证的版本以及相应的测试内核版本。

平台会强制执行支持列表中声明的版本匹配粒度:

  • OS 版本:使用下面列出的发行版版本。除非同时列出,否则不正式支持其他主版本或次版本。
  • 内核版本:使用操作系统供应商提供的官方内核。当列表给出确切的 x.y.z-build 值时,构建后缀可以不同,但 x.y.z 必须匹配。当列表列出操作系统版本但未指定内核值时,请使用该版本随附的官方内核。不要假定任意更新的内核都受支持。
INFO

x86-64-v2 是 CPU 指令集基线,但 不会将其作为运行非 Alauda OS 的 x86 节点的统一要求。CPU 仍必须满足所选操作系统和待部署组件的要求。如果无法确认兼容性,请联系技术支持。

x86

Red Hat Enterprise Linux (RHEL)
Ubuntu
Kylin Linux Advanced Server
  • RHEL 9.6: 5.14.0-570.12.1

ARM

Kylin Linux Advanced Server
  • Kylin Linux Advanced Server V11 2503:该版本随附的官方 6.6 系列内核

注意:ARM 架构仅支持 Kunpeng 920。对于其他 CPU 型号,请联系技术支持。

操作系统支持范围变更

4.4 引入了 Kubernetes 1.35,而 Kubernetes 1.35 移除了 cgroup v1。运行 Kubernetes 1.35 或更高版本的集群中的节点必须使用 cgroup v2 和 Linux 内核 5.8 或更高版本。

由于以下操作系统的内核早于 5.8,这些操作系统在 4.3 及更早版本中受支持,但从 4.4 起不再属于支持范围:

  • Kylin Linux Advanced Server V10 和 V10 SP3(内核 4.19)
  • Ubuntu 20.04 LTS(内核 5.4)
  • RHEL 7.x 和 RHEL 8.x(内核 3.10 和内核 4.18)
  • CentOS 7.x(内核 3.10)

如果您的节点运行上述某个操作系统,请选择以下路径之一。迁移到同一操作系统供应商的较新版本通常是成本最低的选项,因为这样可以保留现有的供应商关系、工具和运维实践:

  • 将 RHEL 7.x 或 RHEL 8.x 节点迁移到 RHEL 9.6。
  • 将 Ubuntu 20.04 LTS 节点迁移到 Ubuntu 22.04 LTS。
  • 将 Kylin Linux Advanced Server V10 或 V10 SP3 节点迁移到 Kylin Linux Advanced Server V11 2503。
  • 将节点迁移到 Alauda OS。对于 global 集群,请参阅Alauda OS 上的安装;对于工作负载集群,请参阅Alauda OS 上的创建。Alauda OS 是不可变操作系统,因此此路径会改变节点的管理方式,通常也是成本最高的选项。
  • 继续使用 4.3.x,直到能够完成操作系统变更。

CentOS 7.x 在支持列表中没有后续版本。请将这些节点迁移到上述受支持的操作系统之一。

WARNING

在集群仍运行当前 版本时变更操作系统,并且仅在所有节点都运行受支持的操作系统后,再升级到 4.4 或更高版本。此变更通常需要重建节点或更换机器。升级 不会将节点迁移到其他操作系统。

执行快速配置脚本

安装包提供了用于快速配置节点的脚本。

解压安装包,在 res 目录中获取 init.sh 脚本文件。将脚本文件复制到节点,并确保您具有 root 权限。

执行脚本:

bash init.sh
WARNING

init.sh 无法保证正确处理以下所有检查。您仍需继续执行下面的操作步骤。

节点检查

以下列出了节点上必须完成的所有检查。所需的检查因节点角色而异。例如,某些检查仅适用于控制平面节点。

检查分为两类:

  • ✅ 表示检查必须通过。
  • ⚠️ 表示检查必须在特定场景下满足。请根据说明确定相应条件是否满足。如果满足,则必须解决相关问题。

以下是检查列表:

  • 操作系统和内核

    • ✅ 机器的 grub 启动配置必须包含 transparent_hugepage=never 参数。
    • ✅ 检查内核模块 ip_vs、ip_vs_rr、ip_vs_wrr 和 ip_vs_sh 是否已启用。
    • ⚠️ 如果 global 集群计划使用 Kube-OVN CNI,则必须启用内核模块 geneve 和 openvswitch。
    • ✅ 必须禁用 SELinux 和 AppArmor。在运行非 Alauda OS 的节点上,不能保持启用状态;请参阅为何必须禁用 SELinux 和 AppArmor。
    • ✅ 必须禁用主机防火墙,除非您的安全策略要求保持启用。在这种情况下,必须按照强化节点安全配置中的说明配置节点,然后再安装平台。
      • init.sh 会禁用主机防火墙。若要保持其启用状态,请向 init.sh 传递匹配的 --skip- 参数,而不是在之后重新启用防火墙。
      • 保持主机防火墙启用属于非默认配置。平台不会管理非 Alauda OS,因此启用的主机防火墙可能导致节点或集群中出现意外故障。您需要负责在此配置下运维和排查节点问题。
      • 启用主机防火墙后,您需要在每个节点上配置和维护端口规则。平台所需的端口请参阅通信矩阵。
    • ✅ 禁用 swap。
  • 用户和权限

    • ✅ 节点的 SSH 用户具有 root 权限,并且可以免密码使用 sudo。
    • ✅ /etc/ssh/sshd_config 中的 UseDNS 参数必须设置为 no。
    • ✅ 在添加节点之前,将 /etc/ssh/sshd_config 中的 UsePAM 参数设置为 no,然后重启 sshd。否则,PAM 会话策略(例如强制修改密码、pam_access、faillock 或 pam_limits)可能会阻止基于 SSH 的节点加入。节点达到 Ready 状态后,可以恢复 UsePAM yes。在使用密码认证且 SELinux 处于强制执行模式的系统上,UsePAM no 本身可能会导致 SSH 登录失败;在这种情况下,请使用基于密钥的认证。
    • ✅ systemctl show --property=DefaultTasksMax 必须返回 infinity;限制过低可能导致繁忙的容器创建线程失败。如果不是 infinity,请在 /etc/systemd/system.conf 中设置 DefaultTasksMax=infinity,然后运行 systemctl daemon-reexec。
  • 节点网络

    • ✅ hostname 必须符合以下规则:
      • 不超过 36 个字符。
      • 以字母或数字开头和结尾。
      • 只能包含小写字母、数字、- 和 .,但不能包含 .-、.. 或 -.。
    • ✅ /etc/hosts 中的 localhost 必须解析为 127.0.0.1。
    • ✅ /etc/resolv.conf 文件必须存在,并包含 nameserver 配置,但不得包含以 172 开头的地址(禁用 systemd-resolved)。
    • ⚠️ /etc/resolv.conf 文件不应配置搜索域(如必须配置,请参阅配置搜索域)。
    • ✅ 机器的 IP 地址不能是环回地址、多播地址、链路本地地址、全 0 地址或广播地址。
    • ✅ 执行 ip route 必须返回默认路由或指向 0.0.0.0 的路由。
    • ✅ 节点不得占用以下端口。此检查用于确认安装开始前端口处于空闲状态,而不是列出主机防火墙必须允许的端口。端口列表请参阅通信矩阵。
      • 控制平面节点: 2379、2380、6443、10249 ~ 10256
      • 安装程序所在的节点: 8080、12080、12443、16443、2379、2380、6443、10249 ~ 10256
      • 工作节点: 10249 ~ 10256
    • ✅ 如果集群使用 Kube-OVN 或 Calico,请确保以下端口未被占用:
      • Kube-OVN: 6641、6642
      • Calico: 179
    • ⚠️ 确保 nerdctl 所需网络段 172.17.x.x ~ 172.18.x.x 中的 IP 地址未被占用。如果此网络段中的 IP 已被占用且无法更改,请联系技术支持。
  • 软件和目录要求:

    • ✅ 必须安装以下软件:ip、ss、tar、swapoff、modprobe、sysctl、md5sum,以及 scp 或 sftp。
    • ⚠️ 如果计划使用本地存储 TopoLVM 或 Rook,则需要安装 lvm2。
    • ✅ 不允许存在 /etc/systemd/system/kubelet.service 文件。
    • ✅ /tmp 的挂载参数不得包含 noexec。
    • ✅ 删除与 global 集群组件冲突的软件包(请参阅删除冲突的软件包)。
    • ✅ 如果存在,必须删除以下文件:
      • /var/lib/docker
      • /var/lib/nerdctl
      • /opt/nerdctl/
      • /var/lib/containerd
      • /var/log/pods
      • /var/lib/kubelet/pki
  • 跨节点检查

    • ✅ global 集群中节点之间的网络通信不得受到限制:
      • 在未启用主机防火墙的默认配置中,节点之间不得存在网络防火墙限制。
      • 在节点上启用主机防火墙时,通信矩阵中的每个端口都必须允许节点之间进行通信,并且集群内部的 Pod 和 Service 流量不得按端口进行过滤。
    • ✅ 集群中每个节点的 hostname 必须唯一。
    • ✅ 所有节点的时区必须统一,时间同步误差必须 ≤ 10 秒。

附录

为什么必须禁用 SELinux 和 AppArmor

在运行非 Alauda OS 的节点上,必须禁用 SELinux 和 AppArmor。这是此版本的平台要求,而不是加固建议。init.sh 会禁用这两项功能,并且节点加入集群时,节点加入操作步骤会再次禁用它们。

SELinux。 平台组件会将主机路径挂载到容器中。镜像仓库安装程序会将主机上的 /proc/mounts 文件绑定挂载到其容器中,而镜像仓库和对象存储组件会将数据存储在主机上的 /cpaas、/etc/kubernetes 等目录下,这些目录带有操作系统的默认文件标签。在非 Alauda OS 上,容器运行时配置为不使用 SELinux 标签,因此这些挂载会根据主机策略进行评估;当 SELinux 以 enforcing 模式运行时,这些挂载会被拒绝。随后,容器运行时会在容器进程启动前创建容器失败,镜像仓库组件也无法完成安装,导致平台安装或升级停止。

permissive 模式并不是替代方案:它只会改变记录的日志内容,并不会改变这一要求。安装完成后再切换回 enforcing 的节点不属于受支持的配置。

AppArmor。 节点预处理会禁用 AppArmor,并且平台未经验证,不支持在强制执行 AppArmor 配置文件的集群节点上运行。在启用 AppArmor 的节点上运行不属于此版本支持的配置。

加固的操作系统配置文件(例如 Ubuntu Security Guide 提供的 STIG 配置文件)会启用这些机制。由于相同原因,将此类配置文件应用到集群节点不属于受支持的配置。

如果安全策略要求保持启用这些机制:请使用 Alauda OS,这是平台提供的不可变操作系统。在 Alauda OS 上,SELinux 和主机防火墙默认处于启用状态,平台会为你维护策略和端口规则。请参阅Alauda OS 上的安装和在 Alauda OS 上创建。

计划在未来版本中支持以 enforcing 模式运行启用 SELinux 的 Red Hat Enterprise Linux 9.6。有关其状态,请联系技术支持。

加固节点安全配置

仅当强制性安全策略(例如 STIG 基线)要求在集群节点上保持启用主机防火墙时,才使用本节。保持主机防火墙禁用是默认且推荐的节点配置,也是直接运行不带参数的 init.sh 所产生的配置。启用主机防火墙属于非默认配置,由你负责,因此请先在非生产环境中验证,然后再应用到生产节点。

SELinux 和 AppArmor 的情况不同:它们必须保持禁用。请参阅为什么必须禁用 SELinux 和 AppArmor。

保持主机防火墙启用,而不是重新启用

init.sh 可以跳过单个操作步骤。传入匹配的 --skip- 参数,以确保脚本不会禁用策略要求保持启用的主机防火墙:

实现方式参数
firewalld--skip-disable_firewalld
ufw--skip-disable_ufw

例如,要在 RHEL 节点上保持 firewalld 启用:

bash init.sh --skip-disable_firewalld

这是推荐的方式。节点会保留安装时的状态,同时 init.sh 仍会执行其他所有节点预处理操作步骤。

操作顺序

请在平台安装之前配置节点,而不是在安装之后配置。这样,防火墙问题会在安装程序运行期间暴露,而不是在集群承载工作负载后才出现。

  1. 使用你所用主机防火墙实现的 --skip- 参数运行 init.sh。
  2. 配置主机防火墙规则。
  3. 使用防火墙实现的状态命令验证节点上的最终状态,例如 firewall-cmd --list-all 或 ufw status verbose。
  4. 安装平台。

如果节点已经运行过完整的 init.sh

仅当主机防火墙已经被禁用且必须重新启用时,才使用此方式。这比一开始就跳过该步骤需要更多操作。

  1. 启用并启动服务,例如使用 systemctl enable --now firewalld,或在 Ubuntu 上使用 ufw enable。
  2. 按照下文所述配置端口规则。
  3. 使用 firewall-cmd --list-all 或 ufw status verbose 确认最终规则集。

主机防火墙

平台不要求使用特定的主机防火墙实现。RHEL 和 Kylin Linux Advanced Server 节点通常使用 firewalld,Ubuntu 节点通常使用 ufw。无论使用哪种实现,都必须允许相同的端口集合。端口列表请参阅通信矩阵。

危险

通信矩阵列出了节点侦听的端口。Pod 到 Pod 和 Pod 到 Service 的流量使用任意端口,不在该列表范围内,因此仅允许列表中端口的防火墙会破坏集群网络。启用主机防火墙时,还必须将 Pod CIDR、Service CIDR 以及 CNI 插件创建的网络接口视为可信来源,以免按端口过滤集群内部流量。接口名称取决于 CNI 插件和环境,因此请从节点读取接口名称,不要假定使用固定名称。

运行安装程序的节点还会使用 8080、12080、12443 和 16443。开始安装前,请在该节点上允许这些端口。

删除冲突的软件包

安装之前,节点上的 docker/nerdctl/containerd 环境中可能已经运行应用,或者可能已经安装了与 global 集群冲突的软件。因此,需要检查并卸载冲突的软件包。

危险
  • 为避免应用中断或数据丢失,请务必确认是否存在冲突的软件包。发现冲突时,请在卸载前制定应用切换计划并备份数据。
  • 卸载冲突的软件包后,仍需检查 /usr/local/bin/ 等目录中是否存在其他可能冲突的二进制文件(例如与 docker、nerdctl、containerd、runc、podman、容器网络、容器运行时或 Kubernetes 相关的软件)。

以下命令可供参考。

RHEL
Ubuntu
Kylin

检查:

for x in \
    docker docker-client docker-common docker-latest \
    podman-docker podman \
    runc \
    containernetworking-plugins \
    apptainer \
    kubernetes kubernetes-master kubernetes-node kubernetes-client \
    ; do
    rpm -qa | grep -F "$x"
done

卸载:

for x in \
    docker docker-client docker-common docker-latest \
    podman-docker podman \
    runc \
    containernetworking-plugins \
    apptainer \
    kubernetes kubernetes-master kubernetes-node kubernetes-client \
    ; do
    yum remove "$x"
done

在 Linux OS 中,/etc/resolv.conf 文件用于配置 DNS 客户端域名解析设置。search 行指定 DNS 查询的域搜索路径。

配置要求

  • 域数量:search 行中的域数量应小于 domainCountLimit - 3(默认 domainCountLimit 为 32)。
  • 单个域的长度:每个域名不得超过 253 个字符。
  • 总字符长度:所有域名及空格的字符总数不得超过 MaxDNSSearchListChar(默认值为 2048)。

示例

search domain1.com domain2.com domain3.com
  • 域总数为 3。
  • 单个域的长度(例如 domain1.com)为 11。
  • 总字符长度为 35,即 11 + 11 + 11 + 2(两个空格)。
警告
  • 如果 search 文件中的 /etc/resolv.conf 行不符合上述限制,可能会导致 DNS 查询失败或性能下降。
  • 修改 /etc/resolv.conf 文件前,建议先备份该文件。