节点预处理

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

INFO

本页面适用于运行传统操作系统的节点,例如 Kylin Linux Advanced Server、RHEL 或 Ubuntu,这些节点由 通过 SSH 进行部署。下面的部分检查项——例如 SSH 用户以及 /etc/ssh/sshd_config 设置——是为了确保基于 SSH 的节点加入流程能够正常工作。如果您的集群使用 Alauda OS,则本页面中的节点预处理步骤不适用。请改为参考 Immutable Infrastructure 文档中的 Installing the global Cluster on Immutable Infrastructure。

支持的 OS 和 Kernel 版本

下表列出了受支持的操作系统、已验证版本以及对应的测试 Kernel 版本。

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

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

x86-64-v2 是一个 CPU 指令集基线,但 并未将其作为运行用户提供的传统操作系统的 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 系列 Kernel

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

操作系统支持范围变更

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

由于这些操作系统的 Kernel 版本早于 5.8,以下操作系统在 4.3 中受支持,但从 4.4 开始已不在支持范围内:

  • Kylin Linux Advanced Server V10 和 V10 SP3(Kernel 4.19)
  • Ubuntu 20.04 LTS(Kernel 5.4)
  • RHEL 7.x 和 RHEL 8.x(Kernel 3.10 和 Kernel 4.18)
  • CentOS 7.x(Kernel 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。请参见 the Immutable Infrastructure documentation。Alauda OS 是不可变操作系统,因此此路径会改变节点的管理方式,通常也是成本最高的选项。
  • 继续使用 4.3.x,直到完成操作系统变更。

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

WARNING

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

执行快速配置脚本

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

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

执行该脚本:

bash init.sh
WARNING

init.sh 无法保证下列所有检查都被正确处理。您仍然需要继续执行下面的步骤。

节点检查

以下列出了必须在节点上完成的所有检查。根据节点的角色,所需检查会有所不同。例如,某些检查仅适用于控制平面节点。

检查分为两类:

  • ✅ 表示该检查必须通过。
  • ⚠️ 表示该检查仅在特定场景下必须满足。请根据说明判断是否满足对应条件。如果满足,则必须进行处理。

以下为检查列表:

  • OS 和 Kernel

    • ✅ 机器的 grub 启动配置中必须包含 transparent_hugepage=never 参数。
    • ✅ 检查 Kernel 模块 ip_vs、ip_vs_rr、ip_vs_wrr 和 ip_vs_sh 是否已启用。
    • ⚠️ 如果 global 集群计划使用 Kube-OVN CNI,则必须启用 Kernel 模块 geneve 和 openvswitch。
    • ✅ 必须禁用 SELinux 和 AppArmor。对于运行传统操作系统的节点,不能保持启用状态;请参见为什么必须禁用 SELinux 和 AppArmor。
    • ✅ 必须禁用宿主机防火墙,除非您的安全策略要求其保持启用。在这种情况下,在安装平台之前,节点必须按照加固节点安全配置中的说明进行配置。
      • init.sh 会禁用宿主机防火墙。若要保持其启用,请向 init.sh 传入相应的 --skip- 参数,而不是在之后重新开启。
      • 保持宿主机防火墙启用不是默认配置。平台不会管理传统操作系统,因此启用宿主机防火墙可能会导致节点或集群出现意外故障。对于这种配置,您需要负责节点的运行和故障排查。
      • 当宿主机防火墙启用时,您需要在每个节点上配置并维护端口规则。平台所需端口请参见通信矩阵。
    • ✅ 禁用 swap。
  • Users and Permissions

    • ✅ 节点的 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。
  • Node Network

    • ✅ hostname 必须符合以下规则:
      • 不超过 36 个字符。
      • 以字母或数字开头和结尾。
      • 仅包含小写字母、数字、- 和 .,且不能包含 .-、.. 或 -.。
    • ✅ /etc/hosts 中的 localhost 必须解析为 127.0.0.1。
    • ✅ /etc/resolv.conf 文件必须存在并包含 nameserver 配置,但不能包含以 172 开头的地址(禁用 systemd-resolved)。
    • ⚠️ /etc/resolv.conf 文件中不应配置 search domain(如果必须配置,请参见配置 Search Domain)。
    • ✅ 机器的 IP 地址不能是 loopback、multicast、link-local、all-0 或 broadcast 地址。
    • ✅ 执行 ip route 必须返回默认路由或指向 0.0.0.0 的路由。
    • ✅ 节点上不得占用以下端口。此检查用于确认安装开始前端口可用;它不是宿主机防火墙必须放行的端口列表。该列表请参见通信矩阵。
      • 控制平面节点: 2379、2380、6443、10249 ~ 10256
      • 安装器所在节点: 8080、12080、12443、16443、2379、2380、6443、10249 ~ 10256
      • worker 节点: 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

在运行传统操作系统的节点上,必须禁用 SELinux 和 AppArmor。这是本版本的平台要求,而不是加固建议。init.sh 会禁用这两者,且节点加入流程在节点加入集群时会再次禁用它们。

SELinux。 平台组件会将宿主机路径挂载到容器中。镜像仓库安装器会将宿主机的 /proc/mounts 文件以 bind mount 方式挂载到其容器中,而镜像仓库和对象存储组件会将其数据保存在宿主机目录中,例如 /cpaas 和 /etc/kubernetes,这些目录带有操作系统的默认文件标签。在传统操作系统上,容器运行时的配置不使用 SELinux 标记,因此这些挂载会按照宿主机策略进行评估,并且在 SELinux 运行于 enforcing 模式时会被拒绝。随后容器运行时会在进程启动前创建容器失败,镜像仓库组件无法完成安装,平台安装或升级也会停止。

permissive 模式并不是替代方案:它只会改变日志记录方式,而不会改变要求。安装后若将节点切回 enforcing,则属于不受支持的配置。

AppArmor。 节点准备会禁用 AppArmor,而平台并未在集群节点上启用 AppArmor profile 的情况下进行验证。在本版本中,运行启用 AppArmor 的节点属于不受支持的配置。

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

如果您的安全策略要求这些机制保持启用。 请使用 Alauda OS,这是平台提供的不可变操作系统。在 Alauda OS 上,SELinux 和宿主机防火墙默认启用,平台会为您维护策略和端口规则。请参见 the Immutable Infrastructure documentation。

计划在未来版本中支持在启用 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。无论使用哪种实现,都应放行相同的一组端口。端口列表请参见通信矩阵。

DANGER

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

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

移除冲突软件包

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

DANGER
  • 为避免应用中断或数据丢失,请务必确认是否存在冲突的软件包。发现冲突时,请在卸载前制定应用切换方案并备份数据。
  • 卸载冲突软件包后,仍需检查 /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(两个空格)。
WARNING
  • 如果 /etc/resolv.conf 文件中的 search 行不满足上述限制,可能会导致 DNS 查询失败或性能下降。
  • 在修改 /etc/resolv.conf 文件之前,建议先备份该文件。