Node 预处理
在安装 global 集群之前,所有节点(控制平面节点和 worker 节点)都必须完成预处理。
本页适用于运行 传统操作系统 的节点,例如 RHEL、CentOS 或 Ubuntu,这些节点由 通过 SSH 进行部署。下面的部分检查——例如 SSH 用户以及 /etc/ssh/sshd_config 设置——是为了保证基于 SSH 的节点加入流程能够正常工作。如果你的环境运行在 Immutable Infrastructure(华为 DCS 上的 Alauda OS、VMware vSphere 或华为云 Stack)上,则节点部署采用基于镜像的方式,此预处理不适用;请参见 在 Immutable Infrastructure 上安装 global 集群。
目录
支持的 OS 和 Kernel 版本x86ARM执行快速配置脚本节点检查附录为什么必须禁用 SELinux 和 AppArmor加固节点安全配置保持主机防火墙启用,而不是在之后再将其开启操作顺序如果某个节点已经执行了完整的init.sh主机防火墙删除冲突软件包配置 Search Domain支持的 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 架构不满足要求,请联系技术支持。
- Kylin V10、V10-SP1 和 V10-SP2 已知存在 kernel 问题,可能导致 NodePort 网络访问失败,建议升级到 Kylin V10 SP3。
- 使用 Kylin V10 SP3 时,建议使用 kernel build
4.19.90-89.11.v2401或更高版本。
x86
- RHEL 7.8:
3.10.0-1127.el7.x86_64 - RHEL 8.0 to 8.6:
4.18.0-80.el8.x86_64and4.18.0-372.9.1.el8.x86_64 - RHEL 8.10:
4.18.0-553 - RHEL 9.6:
5.14.0-570.12.1
Note: RHEL 7.8 不支持 Calico Vxlan IPv6。
ARM
- Kylin V10 SP3 2403:
4.19.90-89.11.v2401.ky10.aarch64 - Kylin V11 2503: 发行版随附的官方 kernel
Note: 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 Domain)。 - ✅ 机器的 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 - worker 节点:
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)下,这些目录使用操作系统默认的文件标签。在传统操作系统上,container runtime 在配置时不使用 SELinux 标签,因此这些挂载会按照宿主机策略进行校验;当 SELinux 运行在 enforcing 模式时,这些挂载会被拒绝。随后 container runtime 会在进程启动前创建容器失败,镜像仓库组件也无法完成安装,从而导致平台安装或升级中止。
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 plugin 创建的网络接口视为可信来源,以便集群内部流量不会按端口被过滤。接口名称取决于 CNI plugin 和环境,因此应从节点上读取,而不要假定固定名称。
运行安装器的节点还会使用 8080、12080、12443 和 16443。在开始安装前,请先在该节点上放行这些端口。
删除冲突软件包
在安装之前,节点上可能已经运行了 docker/nerdctl/containerd 环境中的应用,或者已安装了与 global 集群冲突的软件。因此,有必要检查并卸载冲突软件包。
- 为避免应用中断或数据丢失,请务必确认是否存在冲突软件包。发现冲突时,请先制定应用切换方案并备份数据,再执行卸载。
- 卸载冲突软件包后,仍需检查
/usr/local/bin/等目录中是否存在其他可能冲突的二进制文件(例如与 docker、nerdctl、containerd、runc、podman、容器网络、container runtime 或 Kubernetes 相关的软件)。
可参考以下命令。
检查:
卸载:
配置 Search Domain
在 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文件之前,建议先备份该文件。