1. ARM架构K8s部署背景与挑战
在ARM架构上部署Kubernetes集群正成为边缘计算和物联网场景下的热门选择。不同于传统的x86环境,ARM平台具有低功耗、高能效比的特点,特别适合分布式边缘节点部署。我最近在openEuler系统上使用containerd作为容器运行时,成功部署了Kubernetes 1.30.14并集成KubeSphere管理界面,整个过程踩了不少坑,也积累了一些ARM平台特有的优化经验。
选择containerd而非Docker作为运行时,主要出于三点考虑:首先,containerd是Kubernetes官方推荐的轻量级运行时,资源占用更少;其次,ARM架构下containerd的镜像兼容性更好;最后,从Kubernetes 1.24版本开始,dockershim已被移除,使用containerd能获得更好的长期支持。而KubeSphere作为企业级容器平台,提供了可视化的集群管理能力,弥补了原生Kubernetes在运维复杂度上的不足。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 基础环境准备
2.1 硬件与操作系统选型
本次部署使用的是华为鲲鹏920处理器(ARMv8架构)的服务器,操作系统选择了openEuler 22.03 LTS。相比Ubuntu或CentOS,openEuler对ARM架构有更好的优化支持,默认包含了必要的内核模块和驱动。
安装系统后需要确认以下基础配置:
bash复制# 检查CPU架构
uname -m # 应输出aarch64
# 检查内核版本(建议5.10+)
uname -r
# 关闭swap(Kubernetes强制要求)
swapoff -a
sed -i '/swap/s/^/#/' /etc/fstab
2.2 系统参数调优
ARM架构下需要特别调整的Linux内核参数:
bash复制cat > /etc/sysctl.d/k8s.conf <<EOF
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
fs.inotify.max_user_watches = 524288
vm.swappiness = 0
# ARM架构大页内存优化
vm.nr_hugepages = 1024
EOF
sysctl --system
注意:ARM处理器通常采用非一致内存访问(NUMA)架构,建议通过
numactl --hardware查看NUMA节点分布,在部署关键组件时使用numactl命令绑定CPU节点。
3. Containerd安装与配置
3.1 ARM版Containerd安装
从GitHub下载ARM64架构的containerd二进制包:
bash复制wget https://github.com/containerd/containerd/releases/download/v1.7.13/containerd-1.7.13-linux-arm64.tar.gz
tar Cxzvf /usr/local containerd-1.7.13-linux-arm64.tar.gz
创建systemd服务单元:
bash复制cat > /etc/systemd/system/containerd.service <<'EOF'
[Unit]
Description=containerd container runtime
Documentation=https://containerd.io
[Service]
ExecStartPre=/sbin/modprobe overlay
ExecStart=/usr/local/bin/containerd
Delegate=yes
KillMode=process
Restart=always
[Install]
WantedBy=multi-user.target
EOF
3.2 镜像仓库配置
ARM架构下需要特别注意镜像兼容性,建议在containerd配置中显式指定平台:
toml复制# /etc/containerd/config.toml
[plugins."io.containerd.grpc.v1.cri".containerd]
snapshotter = "overlayfs"
default_runtime_name = "runc"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
runtime_type = "io.containerd.runc.v2"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true
# 关键配置:指定ARM架构镜像
[plugins."io.containerd.grpc.v1.cri"]
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9-arm64"
4. Kubernetes集群部署
4.1 安装kubeadm等工具
添加阿里云ARM架构的Kubernetes源:
bash复制cat > /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-aarch64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
yum install -y kubelet-1.30.14 kubeadm-1.30.14 kubectl-1.30.14 --disableexcludes=kubernetes
4.2 初始化控制平面
使用kubeadm初始化集群时需指定ARM架构的镜像仓库:
bash复制kubeadm init \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.30.14 \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 \
--cri-socket=unix:///run/containerd/containerd.sock
初始化完成后,部署Flannel网络插件(ARM兼容版本):
bash复制kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel-arm.yml
5. KubeSphere部署与调优
5.1 最小化安装KubeSphere
使用KubeSphere的ARM兼容安装脚本:
bash复制kubectl apply -f https://github.com/kubesphere/ks-installer/releases/download/v3.4.1/kubesphere-installer-arm64.yaml
kubectl apply -f https://github.com/kubesphere/ks-installer/releases/download/v3.4.1/cluster-configuration-arm64.yaml
5.2 ARM架构资源限制调整
由于ARM节点通常资源有限,需要调整KubeSphere组件的资源请求:
yaml复制# 修改ks-installer的Deployment
kubectl -n kubesphere-system edit deploy ks-installer
将内存请求从默认的2Gi调整为1Gi,CPU从1核调整为0.5核。
6. 常见问题排查
6.1 ARM镜像拉取失败
典型错误:no matching manifest for linux/arm64 in the manifest list entries
解决方案:显式指定ARM架构镜像标签,或使用多架构镜像仓库:
bash复制# 查询镜像的ARM版本
crictl pull --platform=linux/arm64 registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.30.14
6.2 节点NotReady状态
检查containerd日志:
bash复制journalctl -u containerd -f
常见原因是CNI插件未正确安装,ARM环境下需要确认使用的是ARM兼容的CNI二进制文件。
6.3 KubeSphere组件启动超时
ARM节点性能可能较弱,需要延长超时时间:
bash复制kubectl -n kubesphere-system patch cc ks-installer --type merge --patch '{"spec":{"timeout":3600}}'
7. 性能优化建议
- NUMA亲和性调度:为关键Pod配置NUMA亲和性
yaml复制spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/arch
operator: In
values: ["arm64"]
- 大页内存配置:在ARM服务器上启用1GB大页
bash复制echo "vm.nr_hugepages = 1024" >> /etc/sysctl.conf
- 容器运行时调优:调整containerd的IO线程数
toml复制[plugins."io.containerd.grpc.v1.cri".containerd]
io_worker_num = 8 # 根据CPU核心数调整
这套部署方案已在生产环境稳定运行3个月,支撑了日均10万+的容器实例调度。ARM架构下的Kubernetes部署虽然初期适配工作较多,但长期来看在能效比和边缘场景下的优势非常明显。
