节点预处理
在安装 global 集群之前,所有节点(控制平面节点和工作节点)都必须完成预处理。
此页面适用于运行非 Alauda OS 的节点,例如 Kylin Linux Advanced Server、RHEL 或 Ubuntu,并且由 通过 SSH 进行置备。下面的多项检查(例如 SSH 用户和 /etc/ssh/sshd_config 设置)用于确保基于 SSH 的节点加入操作正常运行。如果您的集群使用 Alauda OS,则本页面中的节点预处理步骤不适用。请改为遵循 在 Alauda OS 上安装 global 集群。
目录
支持的 OS 和内核版本x86ARM操作系统支持范围变更执行快速配置脚本节点检查附录为什么必须禁用 SELinux 和 AppArmor加固节点安全配置保持主机防火墙启用,而不是重新启用操作顺序如果节点已经运行过完整的init.sh主机防火墙删除冲突的软件包配置搜索域支持的 OS 和内核版本
下表列出了支持的操作系统、经过验证的版本以及相应的测试内核版本。
平台会强制执行支持列表中声明的版本匹配粒度:
- OS 版本:使用下面列出的发行版版本。除非同时列出,否则不正式支持其他主版本或次版本。
- 内核版本:使用操作系统供应商提供的官方内核。当列表给出确切的
x.y.z-build值时,构建后缀可以不同,但x.y.z必须匹配。当列表列出操作系统版本但未指定内核值时,请使用该版本随附的官方内核。不要假定任意更新的内核都受支持。
x86-64-v2 是 CPU 指令集基线,但 不会将其作为运行非 Alauda OS 的 x86 节点的统一要求。CPU 仍必须满足所选操作系统和待部署组件的要求。如果无法确认兼容性,请联系技术支持。
x86
- RHEL 9.6:
5.14.0-570.12.1
ARM
- Kylin Linux Advanced Server V11 2503:该版本随附的官方 6.6 系列内核
注意:ARM 架构仅支持 Kunpeng 920。对于其他 CPU 型号,请联系技术支持。
操作系统支持范围变更
4.4 引入了 Kubernetes 1.35,而 Kubernetes 1.35 移除了 cgroup v1。运行 Kubernetes 1.35 或更高版本的集群中的节点必须使用 cgroup v2 和 Linux 内核 5.8 或更高版本。
由于以下操作系统的内核早于 5.8,这些操作系统在 4.3 及更早版本中受支持,但从 4.4 起不再属于支持范围:
- Kylin Linux Advanced Server V10 和 V10 SP3(内核 4.19)
- Ubuntu 20.04 LTS(内核 5.4)
- RHEL 7.x 和 RHEL 8.x(内核 3.10 和内核 4.18)
- CentOS 7.x(内核 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。对于
global集群,请参阅Alauda OS 上的安装;对于工作负载集群,请参阅Alauda OS 上的创建。Alauda OS 是不可变操作系统,因此此路径会改变节点的管理方式,通常也是成本最高的选项。 - 继续使用 4.3.x,直到能够完成操作系统变更。
CentOS 7.x 在支持列表中没有后续版本。请将这些节点迁移到上述受支持的操作系统之一。
在集群仍运行当前 版本时变更操作系统,并且仅在所有节点都运行受支持的操作系统后,再升级到 4.4 或更高版本。此变更通常需要重建节点或更换机器。升级 不会将节点迁移到其他操作系统。
执行快速配置脚本
安装包提供了用于快速配置节点的脚本。
解压安装包,在 res 目录中获取 init.sh 脚本文件。将脚本文件复制到节点,并确保您具有 root 权限。
执行脚本:
init.sh 无法保证正确处理以下所有检查。您仍需继续执行下面的操作步骤。
节点检查
以下列出了节点上必须完成的所有检查。所需的检查因节点角色而异。例如,某些检查仅适用于控制平面节点。
检查分为两类:
- ✅ 表示检查必须通过。
- ⚠️ 表示检查必须在特定场景下满足。请根据说明确定相应条件是否满足。如果满足,则必须解决相关问题。
以下是检查列表:
-
操作系统和内核
- ✅ 机器的 grub 启动配置必须包含
transparent_hugepage=never参数。 - ✅ 检查内核模块
ip_vs、ip_vs_rr、ip_vs_wrr和ip_vs_sh是否已启用。 - ⚠️ 如果
global集群计划使用Kube-OVNCNI,则必须启用内核模块geneve和openvswitch。 - ✅ 必须禁用 SELinux 和 AppArmor。在运行非 Alauda OS 的节点上,不能保持启用状态;请参阅为何必须禁用 SELinux 和 AppArmor。
- ✅ 必须禁用主机防火墙,除非您的安全策略要求保持启用。在这种情况下,必须按照强化节点安全配置中的说明配置节点,然后再安装平台。
init.sh会禁用主机防火墙。若要保持其启用状态,请向init.sh传递匹配的--skip-参数,而不是在之后重新启用防火墙。- 保持主机防火墙启用属于非默认配置。平台不会管理非 Alauda OS,因此启用的主机防火墙可能导致节点或集群中出现意外故障。您需要负责在此配置下运维和排查节点问题。
- 启用主机防火墙后,您需要在每个节点上配置和维护端口规则。平台所需的端口请参阅通信矩阵。
- ✅ 禁用
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;限制过低可能导致繁忙的容器创建线程失败。如果不是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文件不应配置搜索域(如必须配置,请参阅配置搜索域)。 - ✅ 机器的 IP 地址不能是环回地址、多播地址、链路本地地址、全 0 地址或广播地址。
- ✅ 执行
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集群中节点之间的网络通信不得受到限制:- 在未启用主机防火墙的默认配置中,节点之间不得存在网络防火墙限制。
- 在节点上启用主机防火墙时,通信矩阵中的每个端口都必须允许节点之间进行通信,并且集群内部的 Pod 和 Service 流量不得按端口进行过滤。
- ✅ 集群中每个节点的
hostname必须唯一。 - ✅ 所有节点的时区必须统一,时间同步误差必须 ≤ 10 秒。
- ✅
附录
为什么必须禁用 SELinux 和 AppArmor
在运行非 Alauda OS 的节点上,必须禁用 SELinux 和 AppArmor。这是此版本的平台要求,而不是加固建议。init.sh 会禁用这两项功能,并且节点加入集群时,节点加入操作步骤会再次禁用它们。
SELinux。 平台组件会将主机路径挂载到容器中。镜像仓库安装程序会将主机上的 /proc/mounts 文件绑定挂载到其容器中,而镜像仓库和对象存储组件会将数据存储在主机上的 /cpaas、/etc/kubernetes 等目录下,这些目录带有操作系统的默认文件标签。在非 Alauda OS 上,容器运行时配置为不使用 SELinux 标签,因此这些挂载会根据主机策略进行评估;当 SELinux 以 enforcing 模式运行时,这些挂载会被拒绝。随后,容器运行时会在容器进程启动前创建容器失败,镜像仓库组件也无法完成安装,导致平台安装或升级停止。
permissive 模式并不是替代方案:它只会改变记录的日志内容,并不会改变这一要求。安装完成后再切换回 enforcing 的节点不属于受支持的配置。
AppArmor。 节点预处理会禁用 AppArmor,并且平台未经验证,不支持在强制执行 AppArmor 配置文件的集群节点上运行。在启用 AppArmor 的节点上运行不属于此版本支持的配置。
加固的操作系统配置文件(例如 Ubuntu Security Guide 提供的 STIG 配置文件)会启用这些机制。由于相同原因,将此类配置文件应用到集群节点不属于受支持的配置。
如果安全策略要求保持启用这些机制:请使用 Alauda OS,这是平台提供的不可变操作系统。在 Alauda OS 上,SELinux 和主机防火墙默认处于启用状态,平台会为你维护策略和端口规则。请参阅Alauda OS 上的安装和在 Alauda OS 上创建。
计划在未来版本中支持以 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 相关的软件)。
以下命令可供参考。
检查:
卸载:
配置搜索域
在 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(两个空格)。
- 如果
search文件中的/etc/resolv.conf行不符合上述限制,可能会导致 DNS 查询失败或性能下降。 - 修改
/etc/resolv.conf文件前,建议先备份该文件。