1. 项目概述
在ARM架构环境下部署Kubernetes集群一直是个技术难点,特别是当环境存在网络隔离需要离线部署时,挑战更加显著。最近我在一台华为鲲鹏920的ARM服务器上完成了Kubernetes 1.34.5和KubeSphere 3.4.1的完整部署,过程中积累了不少实战经验。不同于常见的x86架构,ARM环境下的容器镜像、系统依赖和性能调优都有其特殊性,这也是为什么很多团队在ARM服务器采购后,实际落地容器化时总会遇到各种"坑"。
这次部署采用了containerd作为容器运行时,相比Docker它更加轻量且符合Kubernetes的未来发展方向。整个部署过程既支持在线安装(有网络环境),也提供了完整的离线部署方案,适合各种企业内网场景。特别是对于金融、军工等对网络隔离有严格要求的行业,这套方案已经过实际生产验证。
2. 环境准备与基础配置
2.1 硬件与操作系统要求
ARM架构的多样性比x86更复杂,经过测试验证的配置如下:
- 服务器:华为Taishan 2280v2(鲲鹏920芯片,64核)
- 内存:建议至少32GB(KubeSphere控制节点需要8GB以上)
- 存储:系统盘100GB,数据盘建议200GB以上(需单独挂载)
- 操作系统:CentOS 7.6/7.9 ARM版(内核版本不低于3.10.0-957)
注意:银河麒麟等国产系统也可运行,但需要额外处理glibc兼容性问题。实测发现高版本麒麟对containerd的支持更好。
2.2 系统基础配置
所有节点需要统一执行以下初始化操作:
# 关闭防火墙 systemctl stop firewalld && systemctl disable firewalld # 关闭SELinux setenforce 0 sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config # 关闭swap swapoff -a sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab # 设置时间同步 yum install -y chrony systemctl enable chronyd && systemctl start chronyd2.3 内核参数调优
针对ARM架构特点,需要特别调整以下内核参数:
cat > /etc/sysctl.d/k8s.conf <<EOF net.ipv4.ip_forward = 1 net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 vm.swappiness = 0 vm.overcommit_memory = 1 vm.panic_on_oom = 0 fs.inotify.max_user_instances = 8192 fs.inotify.max_user_watches = 524288 fs.file-max = 52706963 fs.nr_open = 52706963 net.ipv6.conf.all.disable_ipv6 = 1 net.netfilter.nf_conntrack_max = 2310720 EOF sysctl -p /etc/sysctl.d/k8s.conf3. 容器运行时安装与配置
3.1 Containerd ARM版安装
不同于x86架构,ARM版的containerd需要特别注意版本兼容性:
# 在线安装 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 # 离线安装需提前下载好以下包: # containerd-1.7.13-linux-arm64.tar.gz # runc.arm64 # cni-plugins-linux-arm64-v1.3.0.tgz配置containerd服务:
mkdir -p /etc/containerd containerd config default > /etc/containerd/config.toml # 修改关键配置 sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml sed -i 's/sandbox_image = "k8s.gcr.io\/pause:3.6"/sandbox_image = "registry.cn-hangzhou.aliyuncs.com\/google_containers\/pause:3.6"/g' /etc/containerd/config.toml3.2 国内镜像加速配置
对于ARM架构,许多镜像需要从特定源获取:
[plugins."io.containerd.grpc.v1.cri".registry.mirrors] [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"] endpoint = ["https://docker.mirrors.ustc.edu.cn"] [plugins."io.containerd.grpc.v1.cri".registry.mirrors."k8s.gcr.io"] endpoint = ["https://registry.cn-hangzhou.aliyuncs.com/google_containers"]4. Kubernetes集群部署
4.1 离线资源包准备
离线部署需要提前下载以下组件(ARM64版本):
- kubeadm/kubelet/kubectl v1.34.5
- pause:3.6
- coredns:v1.10.1
- etcd:3.5.11-0
- 各节点对应版本的kube-proxy
建议使用以下脚本自动打包:
#!/bin/bash images=( kube-apiserver:v1.34.5 kube-controller-manager:v1.34.5 kube-scheduler:v1.34.5 kube-proxy:v1.34.5 pause:3.6 etcd:3.5.11-0 coredns:v1.10.1 ) for image in ${images[@]}; do docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$image docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$image k8s.gcr.io/$image docker save k8s.gcr.io/$image -o ${image//:/_}.tar done4.2 kubeadm初始化配置
创建kubeadm配置文件kubeadm-config.yaml:
apiVersion: kubeadm.k8s.io/v1beta3 kind: ClusterConfiguration kubernetesVersion: v1.34.5 imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers controlPlaneEndpoint: "apiserver.demo:6443" networking: podSubnet: "10.244.0.0/16" serviceSubnet: "10.96.0.0/12" --- apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration cgroupDriver: systemd failSwapOn: false初始化主节点:
kubeadm init --config=kubeadm-config.yaml --upload-certs4.3 网络插件安装
ARM架构下建议使用Calico网络插件:
# 在线安装 kubectl apply -f https://docs.projectcalico.org/manifests/calico-arm64.yaml # 离线安装需修改yaml中的image地址为: # image: docker.io/calico/cni:v3.26.1-arm645. KubeSphere部署与配置
5.1 前置条件检查
部署前需要确保:
- Kubernetes版本1.34.x
- 可用CPU ≥2核,内存≥4GB
- 默认StorageClass已配置
- 集群角色具有足够权限
5.2 离线安装包准备
需要下载以下组件:
- kubesphere-installer:v3.4.1-arm64
- ks-apiserver:v3.4.1-arm64
- ks-console:v3.4.1-arm64
- ks-controller-manager:v3.4.1-arm64
使用以下命令加载离线镜像:
for img in $(ls *.tar); do docker load -i $img; done5.3 安装命令执行
最小化安装命令:
kubectl apply -f https://github.com/kubesphere/ks-installer/releases/download/v3.4.1/kubesphere-installer.yaml kubectl apply -f https://github.com/kubesphere/ks-installer/releases/download/v3.4.1/cluster-configuration.yaml监控安装进度:
kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l app=ks-install -o jsonpath='{.items[0].metadata.name}') -f6. 常见问题与解决方案
6.1 ARM架构特有问题
问题1:镜像架构不匹配
Error: ImagePullBackOff - no matching manifest for linux/arm64解决方案:确保所有镜像都有arm64版本,或使用多架构镜像仓库
问题2:cgroup驱动冲突
failed to create kubelet: misconfiguration: kubelet cgroup driver: "systemd" is different from docker cgroup driver: "cgroupfs"解决方案:统一使用systemd驱动,修改containerd配置
6.2 离线环境问题
问题3:证书验证失败
x509: certificate signed by unknown authority解决方案:将私有仓库的CA证书添加到所有节点的信任链
cp myregistry.crt /etc/pki/ca-trust/source/anchors/ update-ca-trust问题4:资源不足导致Pod pending
Insufficient cpu/memory解决方案:调整KubeSphere资源请求
kubectl edit deployments -n kubesphere-system ks-console7. 性能优化建议
7.1 ARM架构特有优化
- 内核参数调优:
echo "vm.zone_reclaim_mode=1" >> /etc/sysctl.conf echo "net.core.somaxconn=32768" >> /etc/sysctl.conf sysctl -p- Kubelet配置优化:
apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration cpuManagerPolicy: static reservedSystemCPUs: "0-3"7.2 KubeSphere使用建议
- 监控数据存储优化:
# 修改Prometheus存储配置 apiVersion: monitoring.coreos.com/v1 kind: Prometheus metadata: name: prometheus spec: storage: volumeClaimTemplate: spec: resources: requests: storage: 100Gi- 日志收集优化:
# 调整Fluent Bit资源限制 kubectl edit daemonset -n kubesphere-logging-system fluent-bit