当前位置:首页>Linux>ARM 平台 Rocky Linux 8.10 部署 Kubernetes 集群详细指南

ARM 平台 Rocky Linux 8.10 部署 Kubernetes 集群详细指南

  • 2026-10-11 06:46:46
ARM 平台 Rocky Linux 8.10 部署 Kubernetes 集群详细指南
适用架构:aarch64 (ARM64)操作系统:Rocky Linux 8.10 (Green Obsidian)部署方式:kubeadm + containerdCNI:Calico(支持 ARM64,功能更全)

一、环境规划与前置条件

1.1 节点规划(示例)

生产环境建议控制平面 3 节点高可用(配合 keepalived/kube-vip)。

1.2 前置条件

  • 每台机器:≥2 CPU、≥2G 内存(推荐 4G)、独立主机名 / MAC / product_uuid
  • 节点间网络互通,且可访问外网(拉取镜像与仓库)
  • Rocky Linux 8.10 aarch64 已安装(ISO 下载:https://mirrors.aliyun.com/rockylinux/8/isos/aarch64/)
  • 所有操作以 root 或具备 sudo 权限的用户执行
  • 确认架构:uname -m 应输出 aarch64

⚠️ ARM 关键点:所有容器镜像必须是 arm64/v8 架构。官方 registry.k8s.io、Calico、Flannel 镜像均为多架构(multi-arch),会自动拉取 arm64 版本,无需手动指定。


二、系统初始化配置(所有节点执行)

以下步骤在master 与所有 worker上都要做。

2.1 配置主机名与 hosts 解析

# 在各节点分别执行(按角色修改主机名)hostnamectl set-hostname k8s-master1#另外节点修改成 k8s-master2 / k8s-master3#worker 节点改为 k8s-worker1 / k8s-worker2

在所有节点追加 hosts:

cat >> /etc/hosts <<'EOF'172.19.69.21 k8s-master1172.19.69.22 k8s-master2172.19.69.23 k8s-master3172.19.69.24 k8s-worker1172.19.69.25 k8s-worker2EOF

2.2 关闭 SELinux

setenforce 0sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config# 验证sestatus

2.3 关闭 Swap

Kubernetes 要求关闭 swap,否则 kubelet 无法正常工作。

swapoff -ased -i '/swap/s/^/#/' /etc/fstab# 验证(应无输出)free -m | grep -i swap

2.4 配置时间同步(chrony)

dnf install -y chrony# 使用国内 NTP 源(可选)sed -i 's/^pool.*/pool ntp.aliyun.com iburst/' /etc/chrony.confsystemctl enable --now chronydchronyc sources -v

2.5 加载内核模块

cat <<'EOF' | tee /etc/modules-load.d/k8s.confoverlaybr_netfilterEOFmodprobe overlaymodprobe br_netfilter# 验证lsmod | grep -E 'overlay|br_netfilter'

2.6 内核网络参数

cat <<'EOF' | tee /etc/sysctl.d/k8s.confnet.ipv4.ip_forward = 1net.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1EOFsysctl --system

2.7 (可选)配置 IPVS 模式

大规模集群建议 kube-proxy 使用 IPVS。预装 IPVS 模块:

dnf install -y ipset ipvsadmcat <<'EOF' | tee /etc/modules-load.d/ipvs.confip_vsip_vs_rrip_vs_wrrip_vs_shnf_conntrackEOFmodprobe ip_vs

2.8 防火墙端口配置

控制平面节点(master):

firewall-cmd --permanent --add-port=6443/tcp# kube-apiserverfirewall-cmd --permanent --add-port=2379-2380/tcp# etcdfirewall-cmd --permanent --add-port=10250/tcp# kubeletfirewall-cmd --permanent --add-port=10251/tcp# kube-schedulerfirewall-cmd --permanent --add-port=10252/tcp# kube-controller-managerfirewall-cmd --permanent --add-port=10259/tcp# kube-scheduler (新版本)firewall-cmd --permanent --add-port=10257/tcp# kube-controller-manager (新版本)firewall-cmd --permanent --add-port=179/tcp# Calico BGPfirewall-cmd --reload

工作节点(worker):

firewall-cmd --permanent --add-port=10250/tcp# kubeletfirewall-cmd --permanent --add-port=30000-32767/tcp# NodePortfirewall-cmd --permanent --add-port=179/tcp# Calico BGPfirewall-cmd --reload

若为内网测试环境,也可直接关闭防火墙:

systemctl disable --now firewalld(生产环境不建议)。    

#--本次实验环境直接禁用防火墙


三、安装容器运行时 containerd(所有节点)

3.1 安装 containerd.io

Docker 官方仓库提供 aarch64 包(CentOS 8 仓库与 Rocky 8 兼容):

dnf install -y dnf-plugins-corednf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repodnf makecachednf install -y containerd.io

若国内访问 Docker 官方源较慢,可使用阿里云镜像(同样支持 aarch64):dnf config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.reposed -i 's|download.docker.com|mirrors.aliyun.com/docker-ce|g' /etc/yum.repos.d/docker-ce.repo

3.2 生成并修改 containerd 配置

mkdir -p /etc/containerdcontainerd config default > /etc/containerd/config.toml

修改两处关键配置:

① 启用 systemd cgroup 驱动(与 kubelet 保持一致):

sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml

② 配置镜像加速器(国内环境推荐,可选):

在 /etc/containerd/config.toml 的 [plugins."io.containerd.grpc.v1.cri".registry.mirrors] 段下添加:

mkdir -p /etc/containerd/certs.d/docker.iocat <<'EOF' | tee /etc/containerd/certs.d/docker.io/hosts.tomlserver = ”https://registry-1.docker.io”[host.”https://docker.m.daocloud.io”] capabilities = [”pull”, ”resolve”]EOF

并在 config.toml 中启用 config_path(containerd 1.7+ 推荐方式):

sed -i 's|config_path = ””|config_path = ”/etc/containerd/certs.d”|' /etc/containerd/config.toml

3.3 启动 containerd

systemctl enable --now containerdsystemctl status containerd --no-pager

3.4 配置 crictl

cat <<'EOF' | tee /etc/crictl.yamlruntime-endpoint: unix:///run/containerd/containerd.sockimage-endpoint: unix:///run/containerd/containerd.socktimeout: 10debug: falseEOF

四、安装 kubeadm / kubelet / kubectl(所有节点)

4.1 添加 Kubernetes 仓库

官方仓库使用 $basearch,在 aarch64 上会自动解析为 aarch64,已提供 ARM64 包:

cat <<'EOF' | tee /etc/yum.repos.d/kubernetes.repo[kubernetes]name=Kubernetesbaseurl=https://pkgs.k8s.io/core:/stable:/v1.33/rpm/enabled=1gpgcheck=1gpgkey=https://pkgs.k8s.io/core:/stable:/v1.33/rpm/repodata/repomd.xml.keyexclude=kubelet kubeadm kubectl cri-tools kubernetes-cniEOF

说明:Kubernetes 新版仓库迁移至 pkgs.k8s.io,按次版本(如 v1.33)分通道,同时提供 x86_64 与 aarch64 架构包。如需其他版本,将 v1.33 改为对应次版本(如 v1.31)即可。

国内若访问 pkgs.k8s.io 较慢,可临时使用阿里云镜像(需确认其 aarch64 可用性):

备选(阿里云,请先验证 aarch64 目录是否存在)

baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.33/rpm/

4.2 安装组件并固定版本

# 查看可用版本dnf list --showduplicates kubeadm --disableexcludes=kubernetes# 安装(示例固定 1.30.x;根据上面列出的最新补丁版本调整)dnf install -y kubelet-1.33.1-150500.1.1 kubeadm-1.33.1-150500.1.1 kubectl-1.33.1-150500.1.1 --disableexcludes=kubernetes

dnf remove -y kubelet kubeadm kubectl

4.3 启动 kubelet

systemctl enable --now kubelet# 此时 kubelet 会反复重启是正常的(尚未 kubeadm init),可忽略

4.4 预拉取控制平面镜像(可选,加速初始化)

# 查看所需镜像kubeadm config images list --kubernetes-version=v1.33.1[root@master21 /]# kubeadm config images list --kubernetes-version=v1.33.1registry.k8s.io/kube-apiserver:v1.33.1registry.k8s.io/kube-controller-manager:v1.33.1registry.k8s.io/kube-scheduler:v1.33.1registry.k8s.io/kube-proxy:v1.33.1registry.k8s.io/coredns/coredns:v1.12.0registry.k8s.io/pause:3.10registry.k8s.io/etcd:3.5.21-0# 预拉取(registry.k8s.io 为多架构,会自动拉取 arm64 版本)kubeadm config images pull --kubernetes-version=v1.33.1

查看镜像架构的版本(是X86,还是ARM)

语法:crictl inspecti | grep architecture

crictl inspecti afb61768ce381 | grep architecture

--- 批量查看crictl images --quiet | xargs -I {} sh -c 'echo -n "{}: " && crictl inspecti {} | grep -o ""architecture": "[^"]*"" | head -n 1'

五、初始化控制平面(仅在 master 执行)

5.1 编写初始化配置

cat <<'EOF' | tee kubeadm-init.yamlapiVersion: kubeadm.k8s.io/v1beta3kind: InitConfigurationlocalAPIEndpoint: advertiseAddress: 172.19.69.21# 改为 master 实际 IP bindPort: 6443nodeRegistration: criSocket: unix:///run/containerd/containerd.sock imagePullPolicy: IfNotPresent name: master21---apiVersion: kubeadm.k8s.io/v1beta3kind: ClusterConfigurationkubernetesVersion: v1.33.1# 与安装版本一致controlPlaneEndpoint: 172.19.69.21:6443networking: podSubnet: 192.168.0.0/16# Calico 默认 CIDR,必须与 CNI 一致 serviceSubnet: 10.96.0.0/12---apiVersion: kubelet.config.k8s.io/v1beta1kind: KubeletConfigurationcgroupDriver: systemdEOF

1、替换以下内容:

cat <<'EOF' > kubeadm-init.yamlapiVersion: kubeadm.k8s.io/v1beta4kind: InitConfigurationlocalAPIEndpoint: advertiseAddress: 172.19.69.21 bindPort: 6443nodeRegistration: criSocket: unix:///run/containerd/containerd.sock imagePullPolicy: IfNotPresent name: master21

apiVersion: kubeadm.k8s.io/v1beta4kind: ClusterConfigurationkubernetesVersion: v1.33.1controlPlaneEndpoint: 172.19.69.21:6443imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containersnetworking: podSubnet: 192.168.0.0/16 serviceSubnet: 10.96.0.0/12

apiVersion: kubelet.config.k8s.io/v1beta1kind: KubeletConfigurationcgroupDriver: systemdEOF

2、修改 /etc/containerd/config.toml 文件vi /etc/containerd/config.toml

--##sandbox_image = "registry.k8s.io/pause:3.8"

++ sandbox_image = "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.10"

⚠️ podSubnet 必须与后面 Calico 的默认网段一致(Calico 默认 192.168.0.0/16)。若用 Flannel 则改为 10.244.0.0/16。

5.2 执行初始化

kubeadm init --config=kubeadm-init.yaml --upload-certs | tee kubeadm-init.log

主节点master21

[root@master21 ~]

kubeadm init phase upload-certs --upload-certsI0724 16:37:00.757996 226129 version.go:261] remote version is much newer: v1.36.3; falling back to: stable-1.33[upload-certs] Storing the certificates in Secret "kubeadm-certs" in the "kube-system" Namespace[upload-certs] Using certificate key:db88a0fb4ad604bd50c900c7d9dccf6cf21a8cc624fdc4f56e499172520292f9

kubeadm join 172.19.69.21:6443 --token 9kbhpo.g78s8yw1nwseoeir --discovery-token-ca-cert-hash sha256:9f91de41964611bbfeb4fed7a2ef28f6ff6645cf90245349555bf6f39be3db33 --control-plane --certificate-key db88a0fb4ad604bd50c900c7d9dccf6cf21a8cc624fdc4f56e499172520292f9

初始化成功后,务必保存输出中的kubeadm join命令(worker 加入要用)。

5.3 配置 kubectl(master 上普通用户)

mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/config

若用 root 用户:

export KUBECONFIG=/etc/kubernetes/admin.conf# 写入 /etc/profile 持久化echo 'export KUBECONFIG=/etc/kubernetes/admin.conf' >> ~/.bashrc

此时查看节点,master 状态为 NotReady(尚未安装 CNI,属正常):

kubectl get nodes

kubeadm init phase upload-certs --upload-certs

删除多作的MASTER控制节点[root@master21 ~]

kubectl get nodes

NAME STATUS ROLES AGE VERSION 

master21 NotReady control-plane 12m v1.33.1

master22 NotReady control-plane 3m10s v1.33.1

master23 NotReady control-plane 3m35s v1.33.1

node24 NotReady control-plane 3m12s v1.33.1

node25 NotReady control-plane 3m28s v1.33.1

kubectl drain node24 --ignore-daemonsets --delete-emptydir-data --force

kubectl delete node node24

获取当前运行的 etcd pod 名称

ETCD_POD=$(kubectl get pods -n kube-system -l component=etcd -o jsonpath='{.items[0].metadata.name}')

查看 etcd 成员列表

kubectl exec -it -n kube-system $ETCD_POD -- etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/healthcheck-client.crt --key=/etc/kubernetes/pki/etcd/healthcheck-client.key --endpoints=https://127.0.0.1:2379member list

3d5b62c253307d43, started, node24,https://172.19.69.24:2380,https://172.19.69.24:2379, falsec15a6b2290b25976, started, master21,https://172.19.69.21:2380,https://172.19.69.21:2379, falsed2ae4cab79113a34, started, master22,https://172.19.69.22:2380,https://172.19.69.22:2379, falsef60d7c7443c12032, started, node25,https://172.19.69.25:2380,https://172.19.69.25:2379, falsef94beacdc4f2ad9d, started, master23,https://172.19.69.23:2380,https://172.19.69.23:2379, false

请将 替换为你上一步查到的实际 ID

kubectl exec -it -n kube-system $ETCD_POD -- etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/healthcheck-client.crt --key=/etc/kubernetes/pki/etcd/healthcheck-client.key --endpoints=https://127.0.0.1:2379member remove 3d5b62c253307d43

NODE24上操作:

systemctl stop kubelet

kubeadm reset --force

清理 containerd 中残留的 kube 容器

crictl rm -f $(crictl ps -aq) 2>/dev/null || true

清理残留的 iptables 规则(防止网络冲突)

iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -Xipvsadm --clear 2>/dev/null || true

删除残留的 kubeconfig

rm -rf ~/.kube/

kubectl get nodes

ETCD_POD=$(kubectl get pods -n kube-system -l component=etcd -o jsonpath='{.items[0].metadata.name}')kubectl exec -it -n kube-system $ETCD_POD -- etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/healthcheck-client.crt --key=/etc/kubernetes/pki/etcd/healthcheck-client.key --endpoints=https://127.0.0.1:2379member list

kubectl drain node25 --ignore-daemonsets --delete-emptydir-data --forcekubectl delete node node25

获取当前运行的 etcd pod 名称

ETCD_POD=$(kubectl get pods -n kube-system -l component=etcd -o jsonpath='{.items[0].metadata.name}')

查看 etcd 成员列表

kubectl exec -it -n kube-system $ETCD_POD -- etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/healthcheck-client.crt --key=/etc/kubernetes/pki/etcd/healthcheck-client.key --endpoints=https://127.0.0.1:2379member list

六、安装 CNI 网络插件(仅在 master 执行)

方案 A:Calico(推荐,支持 ARM64)

Calico 官方 manifest 为多架构,可直接在 ARM 上使用:

kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.27.3/manifests/tigera-operator.yamlkubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.27.3/manifests/custom-resources.yaml

下载 Calico v3.28.2 的官方 yaml 文件(任意master节点)

curl -Ohttps://raw.githubusercontent.com/projectcalico/calico/v3.28.2/manifests/calico.yaml

kubectl apply -f calico.yaml

[如果原文件的部署网络问题,则可以改用国内镜像部署calico插件]

cp calico.yaml calico.yaml.baksed -i 's#docker.io/calico/#docker.m.daocloud.io/docker.io/calico/#g' calico.yaml

kubectl get pods -n kube-system -l k8s-app=calico-node -o widekubectl get pods -n kube-system -l k8s-app=calico-node -o wide

custom-resources.yaml 默认 CIDR 为 192.168.0.0/16,与上面的 podSubnet 一致。若使用不同网段,需修改该文件中的 cidr 字段。

观察 Calico Pod 是否就绪:

watch kubectl get pods -n calico-system

七、工作节点加入集群(在所有 worker 执行)

使用第 5.2 步保存的 join 命令:

kubeadm join 172.19.69.21:6443 \--token 9kbhpo.g78s8yw1nwseoeir \--discovery-token-ca-cert-hash sha256:9f91de41964611bbfeb4fed7a2ef28f6ff6645cf90245349555bf6f39be3db33

若 token 过期,在 master 重新生成:

kubeadm token create --print-join-command

八、验证集群

# 节点状态kubectl get nodes -o wide# 所有 Pod 状态(应全部 Running)kubectl get pods -A# 组件健康kubectl get cs# 集群信息kubectl cluster-info

预期输出:所有节点 Ready,kube-system 下 CoreDNS、kube-proxy 均 Running。


九、(可选)部署测试应用验证多架构

部署一个 ARM 镜像应用确认调度正常:

部署 3 个 nginx 副本kubectl create deployment nginx --image=nginx --replicas=3kubectl expose deployment nginx --port=80 --type=NodePortkubectl get pods,svckubectl create deployment nginx --image=nginx:stable --replicas=2kubectl expose deployment nginx --port=80 --type=NodePortkubectl get pods,svc

nginx:stable 官方镜像为多架构,在 ARM 节点上会自动拉取 arm64 版本。


十、ARM 平台注意事项与排错

10.1 镜像架构问题

  • 报错 exec format error 或 no matching manifest:说明拉取了非 ARM 镜像。
  • 排查命令:crictl images

查看已拉取镜像

crictl inspect | grep architecture

  • 解决:使用多架构镜像,或显式指定:crictl pull --arch arm64 。

10.2 Kubernetes 仓库架构确认

确认 aarch64 包可用:

dnf list available kubelet kubeadm kubectl --disableexcludes=kubernetes# 若能列出即说明 aarch64 包已就绪

10.3 内核模块缺失

ARM 部分 SoC 内核可能未编译 br_netfilter / overlay。若 modprobe 报错 not found:

# 检查模块是否存在find /lib/modules/$(uname -r) -name 'br_netfilter*'# 若缺失,需安装/更新对应内核模块包,或更换 Rocky 官方 aarch64 内核dnf update kernelreboot

10.4 kubelet 一直 CrashLoopBackOff

最常见原因:cgroup 驱动不一致。

# 确认 containerd 配置grep SystemdCgroup /etc/containerd/config.toml# 应为 true# 确认 kubelet 配置(kubeadm init 时已设为 systemd)grep cgroupDriver /var/lib/kubelet/config.yaml# 重启systemctl restart containerd kubelet

10.5 CoreDNS 一直 Pending

通常是 CNI 未安装或 podSubnet 网段不匹配。检查:

kubectl get pods -n kube-systemkubectl describe pod -n kube-system

确保 CNI 已部署且 podSubnet 与 CNI 配置一致。

10.6 节点 NotReady

kubectl describe node k8s-worker1# 查看 Events 与 Conditions,常见为 CNI 未就绪 / 防火墙拦截

10.7 重置节点(如需重来)

kubeadm reset -frm -rf /etc/cni/net.d /var/lib/cni /var/lib/etcd /var/lib/kubelet/*iptables -F && ipvsadm -Csystemctl restart containerd

附录:版本固定建议

生产环境务必固定版本,防止 dnf update 意外升级导致集群异常:

# 安装 versionlock 插件dnf install -y dnf-plugins-corednf versionlock add kubelet kubeadm kubectl containerd.io

升级时手动解除锁定、按计划逐节点升级,升级前务必备份 etcd:

ETCDCTL_API=3 etcdctl snapshot save /backup/etcd-snapshot.db \ --endpoints=https://127.0.0.1:2379 \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --cert=/etc/kubernetes/pki/etcd/server.crt \ --key=/etc/kubernetes/pki/etcd/server.key

完成上述步骤后,一个运行于 ARM (aarch64) 平台、基于 Rocky Linux 8.10 的 Kubernetes 集群即可投入使用。

最新文章

随机文章