节点预处理
在安装 global 集群之前,所有节点(控制平面节点和 worker 节点)都必须完成预处理。
本页面适用于运行传统操作系统的节点,例如 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 版本x86ARM操作系统支持范围变更执行快速配置脚本节点检查附录为什么必须禁用 SELinux 和 AppArmor加固节点安全配置保持宿主机防火墙启用,而不是事后重新开启操作顺序如果节点已经完整运行过init.sh宿主机防火墙移除冲突软件包配置 Search Domain支持的 OS 和 Kernel 版本
下表列出了受支持的操作系统、已验证版本以及对应的测试 Kernel 版本。
平台会强制执行支持列表中声明的版本匹配粒度:
- OS 版本:使用下方列出的发行版版本。除非另有列出,否则不正式支持其他主版本或次版本。
- Kernel 版本:使用操作系统供应商提供的官方 Kernel。当列表给出精确的
x.y.z-build值时,build 后缀可以不同,但x.y.z必须匹配。当列表只给出操作系统版本而未给出 Kernel 值时,请使用该版本随附的官方 Kernel。不要假定任意更新的 Kernel 都受支持。
x86-64-v2 是一个 CPU 指令集基线,但 并未将其作为运行用户提供的传统操作系统的 x86 节点的通用要求。CPU 仍必须满足所选操作系统以及待部署组件的要求。如果无法确认兼容性,请联系技术支持。
x86
- RHEL 9.6:
5.14.0-570.12.1
ARM
- 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 在支持列表中没有后续版本。请将这些节点迁移到上述受支持的操作系统之一。
请在集群仍运行当前 版本时更改操作系统,并且仅在每个节点都运行受支持的操作系统之后,才升级到 4.4 或更高版本。此变更通常需要重建节点或更换机器。升级 不会将节点迁移到不同的操作系统。
执行快速配置脚本
安装包提供了一个用于快速配置节点的脚本。
解压安装包后,可在 res 目录中找到 init.sh 脚本文件。将该脚本文件复制到各节点,并确保您具有 root 权限。
执行该脚本:
init.sh 无法保证下列所有检查都被正确处理。您仍然需要继续执行下面的步骤。
节点检查
以下列出了必须在节点上完成的所有检查。根据节点的角色,所需检查会有所不同。例如,某些检查仅适用于控制平面节点。
检查分为两类:
- ✅ 表示该检查必须通过。
- ⚠️ 表示该检查仅在特定场景下必须满足。请根据说明判断是否满足对应条件。如果满足,则必须进行处理。
以下为检查列表:
-
OS 和 Kernel
- ✅ 机器的 grub 启动配置中必须包含
transparent_hugepage=never参数。 - ✅ 检查 Kernel 模块
ip_vs、ip_vs_rr、ip_vs_wrr和ip_vs_sh是否已启用。 - ⚠️ 如果
global集群计划使用Kube-OVNCNI,则必须启用 Kernel 模块geneve和openvswitch。 - ✅ 必须禁用 SELinux 和 AppArmor。对于运行传统操作系统的节点,不能保持启用状态;请参见为什么必须禁用 SELinux 和 AppArmor。
- ✅ 必须禁用宿主机防火墙,除非您的安全策略要求其保持启用。在这种情况下,在安装平台之前,节点必须按照加固节点安全配置中的说明进行配置。
init.sh会禁用宿主机防火墙。若要保持其启用,请向init.sh传入相应的--skip-参数,而不是在之后重新开启。- 保持宿主机防火墙启用不是默认配置。平台不会管理传统操作系统,因此启用宿主机防火墙可能会导致节点或集群出现意外故障。对于这种配置,您需要负责节点的运行和故障排查。
- 当宿主机防火墙启用时,您需要在每个节点上配置并维护端口规则。平台所需端口请参见通信矩阵。
- ✅ 禁用
swap。
- ✅ 机器的 grub 启动配置中必须包含
-
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。
- ✅ 节点的 SSH 用户必须拥有
-
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
- 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集群中节点之间的网络通信不得受到限制:- 在默认配置下,如果未启用宿主机防火墙,则节点之间不得存在网络防火墙限制。
- 当节点启用了宿主机防火墙时,节点之间必须允许 通信矩阵中的每个端口,并且集群内部的 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- 参数,这样脚本就不会禁用您的策略要求保留的宿主机防火墙:
例如,要在 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 到 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 相关的软件)。
可参考使用以下命令。
检查:
卸载:
配置 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文件之前,建议先备份该文件。