节点预处理
在安装 global 集群之前,所有节点(控制平面节点和工作节点)都必须完成预处理。
本页面适用于运行 传统操作系统 的节点,例如 RHEL、CentOS 或 Ubuntu,这些节点由 通过 SSH 进行部署。下面的某些检查项——例如 SSH 用户以及 /etc/ssh/sshd_config 设置——用于确保基于 SSH 的节点加入流程能够正常工作。
目录
支持的 OS 和 Kernel 版本x86ARM执行快速配置脚本节点检查附录为什么必须禁用 SELinux 和 AppArmor强化节点安全配置保持主机防火墙启用,而不是在之后重新打开操作顺序如果节点已经完整执行过init.sh主机防火墙删除冲突软件包配置 Search 域支持的 OS 和 Kernel 版本
下表列出了支持的操作系统、经过验证的版本,以及对应的已测试 Kernel 版本。
平台对官方支持实施严格的版本匹配策略:
- OS 版本 (x.y.z):补丁版本(
z)可以不同,但主版本和次版本(x和y)必须与已验证版本严格一致。不支持修改x或y。 - Kernel 版本 (x.y.z-build):构建后缀(
build)可以不同,但核心 Kernel 版本(x.y.z)必须与已测试版本严格一致。不支持修改x.y.z。当列表中某个操作系统版本未指定 Kernel 值时,请使用该版本随系统官方发布的 Kernel。
- 仅支持操作系统官方自带的 Kernel 版本。如果 OS、Kernel 版本或 CPU 架构不满足要求,请联系技术支持。
- 麒麟 V10、V10-SP1 和 V10-SP2 存在已知的 Kernel 问题,可能导致 NodePort 网络访问失败,建议升级到 麒麟 V10 SP3。
- 使用麒麟 V10 SP3 时,建议使用
4.19.90-89.11.v2401或更高版本的 Kernel build。
x86
- RHEL 7.8:
3.10.0-1127.el7.x86_64 - RHEL 8.0 到 8.6:
4.18.0-80.el8.x86_64和4.18.0-372.9.1.el8.x86_64 - RHEL 8.10:
4.18.0-553 - RHEL 9.6:
5.14.0-570.12.1
**注意:**RHEL 7.8 不支持 Calico Vxlan IPv6。
ARM
- Kylin V10 SP3 2403:
4.19.90-89.11.v2401.ky10.aarch64 - Kylin V11 2503: 发行版随附的官方 Kernel
**注意:**ARM 架构仅支持 Kunpeng 920。对于其他型号,请联系技术支持。
执行快速配置脚本
安装包提供了一个用于快速配置节点的脚本。
解压安装包后,可在 res 目录下找到 init.sh 脚本文件。将该脚本文件复制到各节点,并确保您具备 root 权限。
执行脚本:
init.sh 无法保证以下所有检查都已正确处理,您仍需继续执行下面的步骤。
节点检查
下面列出了节点上必须完成的所有检查。根据节点的角色,不同节点所需的检查项会有所不同。例如,某些检查仅适用于控制平面节点。
检查分为两类:
- ✅ 表示该检查必须通过。
- ⚠️ 表示该检查仅在特定场景下必须满足。请根据说明判断对应条件是否满足;如果满足,则必须将其解决。
以下是检查项列表:
-
OS 和 Kernel
- ✅ 机器的 grub 启动配置必须包含
transparent_hugepage=never参数。 - ✅ CentOS 7.x 系统机器的 grub 启动配置必须包含
cgroup.memory=nokmem参数。 - ✅ 检查 Kernel 模块
ip_vs、ip_vs_rr、ip_vs_wrr和ip_vs_sh是否已启用。 - ⚠️ 当 Kernel 版本低于 4.19.0(或 RHEL 低于 4.18.0)时,检查 Kernel 模块
nf_conntrack_ipv4以及(对于 IPv6)nf_conntrack_ipv6是否已启用。 - ⚠️ 如果
global集群计划使用Kube-OVNCNI,则必须启用 Kernel 模块geneve和openvswitch。 - ✅ 必须禁用 SELinux 和 AppArmor。运行传统操作系统的节点上不能保持它们处于启用状态;请参见为什么必须禁用 SELinux 和 AppArmor。
- ✅ 必须禁用主机防火墙,除非您的安全策略要求其保持启用。若必须启用,则在安装平台之前,节点必须按照强化节点安全配置中的说明进行配置。
init.sh会禁用主机防火墙。若要保持其启用状态,请向init.sh传入匹配的--skip-参数,而不是在之后再将其重新打开。- 保持主机防火墙启用属于非默认配置。平台不会管理传统操作系统,因此启用主机防火墙可能会导致节点或集群出现意外故障。在此配置下,您需要自行负责节点的运维和故障排查。
- 当主机防火墙启用时,您需要在每个节点上配置并维护端口规则。平台所需端口请参见通信矩阵。
- ✅ 禁用
swap。
- ✅ 机器的 grub 启动配置必须包含
-
用户和权限
- ✅ 节点的 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;如果限制过低(例如 RHEL 7 / CentOS 7 的默认值512),繁忙的容器将无法创建线程。如果不是infinity,请在/etc/systemd/system.conf中设置DefaultTasksMax=infinity,并执行systemctl daemon-reexec。
- ✅ 节点的 SSH 用户必须具备
-
节点网络
- ✅
hostname必须符合以下规则:- 不超过 36 个字符。
- 以字母或数字开头并结尾。
- 仅包含小写字母、数字、
-和.,且不能包含.-、..或-.。
- ✅
/etc/hosts中的localhost必须解析为127.0.0.1。 - ✅
/etc/resolv.conf文件必须存在且包含nameserver配置,但不能包含以 172 开头的地址(禁用 systemd-resolved)。 - ⚠️
/etc/resolv.conf文件中不应配置 search 域(如果必须配置,请参见配置 Search 域)。 - ✅ 机器的 IP 地址不能是 loopback、multicast、link-local、全 0 或 broadcast 地址。
- ✅ 执行
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
- Kube-OVN:
- ⚠️ 请确保 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集群中的节点之间不得存在网络防火墙限制。 - ✅ 集群中每个节点的
hostname必须唯一。 - ✅ 所有节点的时区必须统一,且时间同步误差必须 ≤ 10 秒。
- ✅
附录
为什么必须禁用 SELinux 和 AppArmor
在运行传统操作系统的节点上,必须禁用 SELinux 和 AppArmor。这是本版本的平台要求,不是加固建议。init.sh 会同时禁用这两个功能,节点加入流程在节点加入集群时也会再次将其禁用。
SELinux。 平台组件会将主机路径挂载到容器中。镜像仓库安装程序会将主机的 /proc/mounts 文件以 bind-mount 方式挂载到其容器中,而镜像仓库和对象存储组件则将其数据保存在 /cpaas 和 /etc/kubernetes 等主机目录下,这些目录带有操作系统的默认文件标签。在传统操作系统上,容器运行时的配置不包含 SELinux labeling,因此这些挂载会按照主机策略进行评估,并在 SELinux 以 enforcing 模式运行时被拒绝。随后容器运行时会在进程启动前创建容器失败,镜像仓库组件也无法完成安装,平台安装或升级将因此停止。
permissive 模式并不是替代方案:它只会改变日志记录方式,而不会改变该要求。安装后如果节点又切回 enforcing,则已超出受支持配置范围。
AppArmor。 节点预处理会禁用 AppArmor,且平台未验证在集群节点上强制启用 AppArmor profile 的情况。在本版本中,启用 AppArmor 的节点超出了受支持配置范围。
Ubuntu Security Guide 提供的 STIG profile 之类的加固操作系统配置会启用这些机制。基于同样的原因,将此类 profile 应用于集群节点也超出受支持配置范围。
如果您的安全策略要求这些机制保持启用。 请使用 Alauda OS,这是平台随附的不可变操作系统。在 Alauda OS 上,SELinux 和主机防火墙默认启用,平台会为您维护策略和端口规则。请参见 不可变基础设施文档。
未来版本计划支持在 enforcing 模式下运行启用 SELinux 的 Red Hat Enterprise Linux 9.6。请联系技术支持了解其状态。
强化节点安全配置
仅当强制性的安全策略(例如 STIG 基线)要求集群节点上的主机防火墙保持启用时,才使用本节。保持主机防火墙禁用是默认且推荐的节点配置,这也是在不带参数运行 init.sh 时的结果。启用主机防火墙属于非默认配置,需要由您自行负责,并且该配置尚未在本版本支持列表中的所有操作系统上完成验证,因此在应用到生产节点之前,请先在非生产环境中进行验证。
SELinux 和 AppArmor 是另一种情况:它们必须保持禁用状态。请参见为什么必须禁用 SELinux 和 AppArmor。
保持主机防火墙启用,而不是在之后重新打开
init.sh 可以跳过单个步骤。请传入对应的 --skip- 参数,这样脚本就不会禁用您的策略要求启用的主机防火墙:
例如,要在 RHEL 节点上保持 firewalld 启用:
这是推荐的方式。节点将保持其安装时的状态,而 init.sh 仍会执行其他所有节点预处理步骤。
操作顺序
应在平台安装之前配置节点,而不是在安装之后。这样,如果防火墙存在问题,会在安装程序运行期间暴露出来,而不是在集群已经承载工作负载之后才出现。
- 使用与主机防火墙实现相匹配的
--skip-参数运行init.sh。 - 配置主机防火墙规则。
- 使用防火墙实现对应的状态命令验证节点上的最终状态,例如
firewall-cmd --list-all或ufw status verbose。 - 安装平台。
如果节点已经完整执行过 init.sh
仅当主机防火墙之前已被禁用,而您必须将其重新启用时,才使用此流程。相比一开始就跳过该步骤,这会更费工夫。
- 启用并启动服务,例如使用
systemctl enable --now firewalld,或者在 Ubuntu 上使用ufw enable。 - 按如下所述配置端口规则。
- 使用
firewall-cmd --list-all或ufw status verbose确认最终规则集。
主机防火墙
平台不要求使用特定的主机防火墙实现。RHEL 和 Kylin Linux Advanced Server 节点通常使用 firewalld,Ubuntu 节点通常使用 ufw。无论使用哪种实现,都应放行相同的一组端口。端口列表请参见通信矩阵。
通信矩阵列出了节点监听的端口。Pod-to-Pod 和 Pod-to-Service 流量使用的是任意端口,不在该列表覆盖范围内,因此如果防火墙只允许列表中的端口,将会破坏集群网络。当主机防火墙启用时,还应将 Pod CIDR、Service CIDR 以及 CNI 插件创建的网络接口视为可信来源,以便集群内部流量不会被按端口过滤。接口名称取决于 CNI 插件和环境,因此请从节点上读取实际名称,不要假定为固定名称。
运行安装程序的节点还会使用 8080、12080、12443 和 16443。在开始安装之前,请先在该节点上放行这些端口。
删除冲突软件包
安装之前,节点上可能已经在 docker/nerdctl/containerd 环境中运行了应用,或者安装了与 global 集群冲突的软件。因此,有必要检查并卸载冲突软件包。
- 为避免应用中断或数据丢失,请务必确认是否存在冲突软件包。发现冲突时,请先制定应用切换方案并备份数据,再执行卸载。
- 卸载冲突软件包后,仍需检查
/usr/local/bin/等目录中是否存在其他可能冲突的二进制文件(例如与 docker、nerdctl、containerd、runc、podman、容器网络、容器运行时或 Kubernetes 相关的软件)。
可参考以下命令。
检查:
卸载:
配置 Search 域
在 Linux OS 中,/etc/resolv.conf 文件用于配置 DNS 客户端的域名解析设置。search 行用于指定 DNS 查询的域搜索路径。
配置要求
- 域数量:
search行中的域数量应小于domainCountLimit - 3(默认domainCountLimit为 32)。 - 单个域长度: 每个域名不得超过 253 个字符。
- 总字符长度: 所有域名及空格的总字符数不得超过
MaxDNSSearchListChar(默认值为 2048)。
示例
- 域的总数为 3。
- 单个域的长度,例如
domain1.com,为 11。 - 总字符长度为 35,即 11 + 11 + 11 + 2(两个空格)。
- 如果
/etc/resolv.conf文件中的search行不满足上述限制,可能会导致 DNS 查询失败或性能下降。 - 在修改
/etc/resolv.conf文件之前,建议先备份该文件。