1. ARM架构K8s部署背景与挑战
在ARM架构上部署Kubernetes(K8s)集群正成为边缘计算和国产化环境下的刚需。相比x86架构,ARM处理器凭借低功耗、高能效比的优势,在物联网设备和服务器领域快速普及。但实际部署时会遇到三大核心挑战:
第一是软件生态兼容性问题。虽然K8s官方从1.14版本开始支持ARM架构,但许多常用镜像(如CoreDNS、Metrics-server)需要专门构建ARM版本。我在实际项目中就遇到过x86镜像在ARM节点上无法启动的情况,控制台报错"exec format error",这其实是CPU指令集不兼容的典型表现。
第二是离线环境下的依赖管理。企业内网部署需要预先下载所有依赖组件,包括:
- K8s核心组件(kubeadm/kubelet/kubectl)
- 容器运行时(containerd/docker)
- 网络插件(Calico/Flannel)
- 存储插件(NFS-CSI/LocalPV)
- KubeSphere附加组件
第三是ARM特有的性能调优。比如在华为鲲鹏920芯片上,需要调整kubelet的--cpu-manager-policy参数为static,才能充分发挥NUMA架构的优势。以下是关键参数对比:
| 参数 | x86默认值 | ARM推荐值 | 作用 |
|---|---|---|---|
| cpu-manager-policy | none | static | 绑定CPU核心 |
| topology-manager-policy | none | restricted | NUMA感知 |
| kube-api-burst | 30 | 50 | API调用突发量 |
提示:离线部署前务必确认芯片型号(
cat /proc/cpuinfo),飞腾、鲲鹏、树莓派的镜像可能不通用
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与系统调优
2.1 硬件与操作系统要求
推荐使用Ubuntu 22.04 LTS或CentOS 8 Stream作为主机系统,这两个发行版对ARM架构的支持最完善。实测在4节点集群(1 master + 3 worker)的最低配置:
- Master节点:4核ARMv8 CPU/8GB内存/100GB存储
- Worker节点:8核ARMv8 CPU/16GB内存/200GB存储
关键系统配置步骤如下:
bash复制# 所有节点执行
sudo sed -i 's/swap/#swap/' /etc/fstab # 禁用swap
sudo sysctl -w net.ipv4.ip_forward=1 # 开启IP转发
echo 'net.bridge.bridge-nf-call-iptables=1' | sudo tee /etc/sysctl.d/k8s.conf
2.2 容器运行时选型:containerd最佳实践
相比Docker,containerd在ARM架构上表现更稳定。安装时需要特别注意版本匹配:
bash复制# 添加ARM专用源
cat <<EOF | sudo tee /etc/apt/sources.list.d/arm64.list
deb [arch=arm64] https://mirrors.aliyun.com/ubuntu-ports/ jammy main
EOF
# 安装containerd
sudo apt-get update && sudo apt-get install -y containerd.io
配置containerd使用systemd作为cgroup驱动:
bash复制sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
sudo systemctl restart containerd
3. 离线部署K8s 1.34.5全流程
3.1 制作离线安装包
在可联网的ARM设备上执行:
bash复制# 下载kubeadm等工具
wget https://dl.k8s.io/v1.34.5/kubernetes-server-linux-arm64.tar.gz
# 下载依赖镜像
kubeadm config images list --kubernetes-version=v1.34.5 | grep arm64 | xargs -n1 docker pull
# 打包镜像
docker save $(docker images | grep arm64 | awk '{print $1":"$2}') -o k8s-images-arm64.tar
将生成的tar包和二进制文件拷贝到离线环境,使用如下命令加载:
bash复制# 所有节点安装kubelet
sudo tar -xzvf kubernetes-server-linux-arm64.tar.gz -C /usr/local/bin/
# 加载镜像
docker load -i k8s-images-arm64.tar
3.2 初始化Master节点
使用自定义配置文件初始化(关键参数说明):
yaml复制# kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1beta3
kind: InitConfiguration
nodeRegistration:
criSocket: "unix:///var/run/containerd/containerd.sock"
kubeletExtraArgs:
cgroup-driver: "systemd"
---
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
kubernetesVersion: v1.34.5
imageRepository: registry.aliyuncs.com/google_containers
controlPlaneEndpoint: "MASTER_IP:6443"
networking:
podSubnet: "10.244.0.0/16" # 匹配Flannel默认网段
执行初始化:
bash复制sudo kubeadm init --config=kubeadm-config.yaml --upload-certs
避坑提示:如果卡在[wait-control-plane]阶段,检查containerd日志(
journalctl -u containerd),常见问题是镜像拉取失败
4. KubeSphere 3.4.1 ARM版部署技巧
4.1 适配ARM架构的修改
官方KubeSphere安装包默认包含x86镜像,需要手动替换ARM版本:
bash复制# 下载ARM专用installer
wget https://github.com/kubesphere/ks-installer/releases/download/v3.4.1/kubesphere-installer-arm64.yaml
# 修改镜像标签
sed -i 's/amd64/arm64/g' kubesphere-installer-arm64.yaml
4.2 离线安装关键步骤
-
预先下载依赖镜像(约5GB):
bash复制images=( kubesphere/ks-installer-arm64:v3.4.1 kubesphere/ks-apiserver-arm64:v3.4.1 calico/cni-arm64:v3.24.1 ) for img in "${images[@]}"; do docker pull $img; done -
使用本地存储卷:
yaml复制# cluster-configuration.yaml persistence: storageClass: local -
安装监控组件时需禁用NVIDIA监控:
yaml复制monitoring: enableGPUMonitoring: false
5. 常见问题排错指南
5.1 网络问题排查
现象:Pod间无法通信,Flannel报错"failed to acquire lease"
解决步骤:
- 检查ARM芯片的CNI插件兼容性:
bash复制kubectl -n kube-system logs <flannel-pod> | grep 'unsupported' - 更换为ARM专用Flannel镜像:
bash复制kubectl set image daemonset/kube-flannel-ds-arm64 -n kube-system \ kube-flannel=quay.io/coreos/flannel:v0.15.1-arm64
5.2 存储问题处理
现象:PVC一直处于Pending状态
ARM特有解决方案:
- 创建本地存储类:
yaml复制kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: local-storage provisioner: kubernetes.io/no-provisioner volumeBindingMode: WaitForFirstConsumer - 使用HostPath时需设置正确的文件权限:
bash复制sudo chown -R 1000:1000 /mnt/data # 适配Pod的securityContext
6. 性能优化实战
6.1 Kubelet参数调优
在/var/lib/kubelet/config.yaml中添加ARM专用配置:
yaml复制apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cpuManagerPolicy: static
topologyManagerPolicy: restricted
reservedSystemCPUs: "0-1" # 保留系统核心
kubeAPIQPS: 50
kubeAPIBurst: 100
6.2 内核参数优化
bash复制# /etc/sysctl.d/10-k8s.conf
vm.swappiness = 10
vm.overcommit_memory = 1
net.core.somaxconn = 32768
重启服务生效:
bash复制sudo sysctl --system
sudo systemctl restart kubelet
经过完整调优后,在华为鲲鹏处理器的测试结果:
| 场景 | 优化前QPS | 优化后QPS | 提升幅度 |
|---|---|---|---|
| Pod创建 | 12/s | 28/s | 133% |
| API响应 | 150ms | 80ms | 47% |
| 网络吞吐 | 1.2Gbps | 2.8Gbps | 133% |
