节点预处理

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

INFO

本页适用于运行 传统操作系统 的节点,例如 RHEL、CentOS 或 Ubuntu,这些节点由 通过 SSH 进行部署。下面的一些检查项——例如 SSH 用户以及 /etc/ssh/sshd_config 设置——是为了保持基于 SSH 的节点加入流程可用。

支持的 OS 和内核版本

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

该平台对官方支持实施严格的版本匹配策略:

  • OS 版本 (x.y.z):补丁版本 (z) 可以不同,但主版本和次版本 (xy) 必须与已验证版本严格匹配。不支持修改 xy
  • Kernel 版本 (x.y.z-build):构建后缀 (build) 可以不同,但核心内核版本 (x.y.z) 必须与已测试版本严格匹配。不支持修改 x.y.z。当列表中某个操作系统发行版未指定 kernel 值时,请使用该发行版官方随附的 kernel。
INFO
  • 仅支持操作系统官方随附的 kernel 版本。如果 OS、kernel 版本或 CPU 架构不满足要求,请联系技术支持。
  • Kylin V10、V10-SP1 和 V10-SP2 存在已知 kernel 问题,可能导致 NodePort 网络访问失败,建议升级到 Kylin V10 SP3
  • 使用 Kylin V10 SP3 时,建议使用 kernel build 4.19.90-89.11.v2401 或更高版本。

x86

Red Hat Enterprise Linux (RHEL)
CentOS
Ubuntu
Kylin Linux Advanced Server
  • RHEL 7.8: 3.10.0-1127.el7.x86_64
  • RHEL 8.0 to 8.6: 4.18.0-80.el8.x86_64 and 4.18.0-372.9.1.el8.x86_64

Note: RHEL 7.8 does not support Calico Vxlan IPv6.

ARM

Kylin Linux Advanced Server
  • Kylin V10 SP3 2403: 4.19.90-89.11.v2401.ky10.aarch64
  • Kylin V11 2503: official kernel shipped with the release

Note: ARM architecture only supports Kunpeng 920, and Flannel is not supported on Kylin V11. For other models, please contact technical support.

执行快速配置脚本

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

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

执行脚本:

bash init.sh
WARNING

init.sh 不能保证以下所有检查都已正确处理。您仍然需要继续完成下面的步骤。

节点检查

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

检查分为两类:

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

以下为检查列表:

  • OS 和 Kernel

    • ✅ 机器的 grub 启动配置必须包含 transparent_hugepage=never 参数。
    • ✅ CentOS 7.x 系统机器的 grub 启动配置必须包含 cgroup.memory=nokmem 参数。
    • ✅ 检查 kernel 模块 ip_vsip_vs_rrip_vs_wrrip_vs_sh 是否已启用。
    • ⚠️ 当 kernel 版本低于 4.19.0(或 RHEL 低于 4.18.0)时,检查 kernel 模块 nf_conntrack_ipv4 以及(对于 IPv6)nf_conntrack_ipv6 是否已启用。
    • ⚠️ 如果 global 集群计划使用 Kube-OVN CNI,则必须启用 kernel 模块 geneveopenvswitch
    • ✅ 必须禁用 SELinux 和 AppArmor。对于运行传统操作系统的节点,它们不能保持启用状态;请参见 为什么必须禁用 SELinux 和 AppArmor
    • ✅ 必须禁用主机防火墙,除非您的安全策略要求其保持启用。在这种情况下,必须在安装平台之前按照 加固节点安全配置 的说明对节点进行配置。
      • init.sh 会禁用主机防火墙。若要保持其启用状态,请将匹配的 --skip- 参数传递给 init.sh,而不是在之后再将其重新打开。
      • 保持主机防火墙启用属于非默认配置。平台不会管理传统操作系统,因此启用的主机防火墙可能会导致节点或集群出现意外故障。在这种配置下,节点的运行和故障排查由您负责。
      • 当主机防火墙启用时,您需要在每个节点上配置并维护端口规则。平台所需端口请参见 通信矩阵
    • ✅ 禁用 swap
  • 用户和权限

    • ✅ 节点的 SSH 用户必须具有 root 权限,并且可以免密码使用 sudo
    • /etc/ssh/sshd_config 中的 UseDNS 参数必须设置为 no
    • ✅ 在添加节点之前,将 /etc/ssh/sshd_config 中的 UsePAM 参数设置为 no,然后重启 sshd。否则 PAM 会话策略(例如强制修改密码、pam_accessfaillockpam_limits)可能会阻止基于 SSH 的节点加入流程。节点进入 Ready 状态后,您可以恢复为 UsePAM yes。在使用密码认证且启用了 SELinux enforcing 的系统上,UsePAM no 本身可能会导致 SSH 登录失败;在这种情况下,请使用基于密钥的认证。
    • systemctl show --property=DefaultTasksMax 必须返回 infinity;较低的限制(例如 RHEL 7 / CentOS 7 上默认的 512)会导致繁忙的容器无法创建线程。如果不是 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 文件不应配置 search 域(如果必须配置,请参见 配置 Search Domain)。
    • ✅ 机器的 IP 地址不能是 loopback、multicast、link-local、全 0 或 broadcast 地址。
    • ✅ 执行 ip route 必须返回默认路由或指向 0.0.0.0 的路由。
    • ✅ 节点不得占用以下端口:
      • 控制平面节点: 23792380644310249 ~ 10256
      • 安装程序所在节点: 808012080124431644323792380644310249 ~ 10256
      • 工作节点: 10249 ~ 10256
    • ✅ 如果 global 集群使用 Kube-OVNCalico,请确保以下端口未被占用:
      • Kube-OVN: 66416642
      • Calico: 179
    • ⚠️ 确保 Docker 所需的网络段 172.16.x.x ~ 172.32.x.x 中的 IP 地址未被占用。如果该网段中的 IP 已被占用且无法更改,请联系技术支持。
  • 软件和目录要求:

    • ✅ 必须安装以下软件:ipsstarswapoffmodprobesysctlmd5sum,以及 scpsftp
    • ⚠️ 如果您计划使用本地存储 TopoLVMRook,则需要安装 lvm2
    • /etc/systemd/system/kubelet.service 文件不得存在。
    • /tmp 的挂载参数中不得包含 noexec
    • ✅ 删除与 global 集群组件冲突的软件包(请参见 删除冲突软件包)。
    • ✅ 如果以下文件存在,必须将其删除:
      • /var/lib/docker
      • /var/lib/containerd
      • /var/log/pods
      • /var/lib/kubelet/pki
  • 跨节点检查

    • global 集群中的节点之间不得存在网络防火墙限制。
    • ✅ 集群中每个节点的 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 和主机防火墙默认启用,平台会为您维护策略和端口规则。请参见 不可变基础设施文档

计划在未来版本中支持在启用 enforcing 模式的情况下运行 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-allufw status verbose
  4. 安装平台。

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

仅当主机防火墙已经被禁用,而您必须将其重新开启时,才使用此路径。与一开始就跳过该步骤相比,这样会更费事。

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

主机防火墙

平台不要求特定的主机防火墙实现。RHEL 和 Kylin Linux Advanced Server 节点通常使用 firewalld,Ubuntu 节点通常使用 ufw。无论您使用哪种实现,都应放行相同的一组端口。端口列表请参见 通信矩阵

DANGER

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

运行安装程序的节点还会使用 8080120801244316443。在开始安装之前,请在该节点上放行这些端口。

删除冲突软件包

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

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

以下命令可供参考。

CentOS / RedHat
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 文件之前,建议先备份该文件。