在ARM架构环境下部署Kubernetes集群一直是个技术难点,特别是在离线环境中。这次我要分享的是在ARMv8架构服务器上,从零开始部署Kubernetes 1.34.5和KubeSphere 3.4.1的完整过程,包含在线和离线两种部署方案。这个方案已经在华为鲲鹏920、飞腾2000+等多款国产ARM服务器上验证通过。
ARM架构与x86架构在容器运行时、内核参数等方面有不少差异,很多在x86上直接可用的配置在ARM上需要特别调整。我会详细说明这些差异点,以及如何解决部署过程中遇到的各种兼容性问题。
对于生产环境,建议至少准备:
测试环境可以用树莓派4B/CM4等设备,但需要注意:
推荐使用以下操作系统:
关键系统配置:
bash复制# 关闭swap
swapoff -a
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
# 关闭SELinux
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
# 设置内核参数
cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
EOF
sysctl --system
注意:ARM架构下需要特别注意内核版本,建议使用4.18以上内核。某些国产ARM芯片需要定制内核,比如飞腾2000+需要打特定的内核补丁。
离线部署需要提前准备好所有依赖包和镜像。这里提供一个完整的离线资源包制作方法:
bash复制yum install -y yum-utils createrepo docker
systemctl enable docker && systemctl start docker
bash复制repotrack -a aarch64 kubelet-1.34.5 kubeadm-1.34.5 kubectl-1.34.5 cri-tools kubernetes-cni
bash复制# K8s基础镜像
kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.34.5
# KubeSphere镜像
docker pull kubesphere/ks-installer:v3.4.1
docker pull kubesphere/ks-apiserver:v3.4.1
# ...其他KubeSphere组件镜像
bash复制tar czvf k8s-offline-arm64-v1.34.5.tar.gz /var/cache/yum/x86_64/7/kubernetes/packages/*.rpm
docker save $(docker images -q) -o k8s-images-arm64-v1.34.5.tar
bash复制tar xzvf k8s-offline-arm64-v1.34.5.tar.gz -C /tmp
createrepo /tmp/packages
cat > /etc/yum.repos.d/local.repo <<EOF
[local]
name=Local Repository
baseurl=file:///tmp/packages
enabled=1
gpgcheck=0
EOF
yum install -y kubelet-1.34.5 kubeadm-1.34.5 kubectl-1.34.5 cri-tools kubernetes-cni
systemctl enable kubelet
bash复制docker load -i k8s-images-arm64-v1.34.5.tar
bash复制kubeadm init \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.34.5 \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 \
--apiserver-advertise-address=<MASTER_IP> \
--ignore-preflight-errors=Swap
bash复制kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel-arm64.yml
KubeSphere 3.4.1对ARM架构有官方支持,但需要特别注意镜像版本:
bash复制wget https://github.com/kubesphere/ks-installer/releases/download/v3.4.1/kubesphere-installer-arm64.yaml
wget https://github.com/kubesphere/ks-installer/releases/download/v3.4.1/cluster-configuration-arm64.yaml
yaml复制spec:
persistence:
storageClass: ""
common:
redis:
enabled: false
openldap:
enabled: false
minioVolumeSize: 20Gi
monitoring:
endpoint: http://prometheus-operated.kubesphere-monitoring-system.svc:9090
es:
elasticsearchDataVolumeSize: 20Gi
elasticsearchMasterVolumeSize: 4Gi
elkPrefix: logstash
logMaxAge: 7
containerruntime:
docker:
registryMirrors:
- https://registry.cn-hangzhou.aliyuncs.com
bash复制kubectl apply -f kubesphere-installer-arm64.yaml
kubectl apply -f cluster-configuration-arm64.yaml
# 查看安装日志
kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l app=ks-install -o jsonpath='{.items[0].metadata.name}') -f
bash复制# 手动拉取ARM版镜像并重新tag
docker pull kubesphere/ks-apiserver-arm64:v3.4.1
docker tag kubesphere/ks-apiserver-arm64:v3.4.1 kubesphere/ks-apiserver:v3.4.1
bash复制# 修改KubeSphere组件资源请求
kubectl edit deployments -n kubesphere-system ks-console
# 将requests.cpu从500m改为200m
bash复制# 如果没有默认StorageClass,可以部署本地存储
kubectl apply -f https://raw.githubusercontent.com/kubesphere/ks-installer/master/roles/ks-core/prepare/files/local-volume-arm64.yaml
ARM架构下需要特别关注以下内核参数:
bash复制# 增加连接跟踪表大小
echo 524288 > /proc/sys/net/netfilter/nf_conntrack_max
echo "net.netfilter.nf_conntrack_max=524288" >> /etc/sysctl.conf
# 调整内存分配
echo "vm.overcommit_memory=1" >> /etc/sysctl.conf
echo "vm.overcommit_ratio=50" >> /etc/sysctl.conf
# 特别针对ARM的调优
echo "kernel.pid_max=4194303" >> /etc/sysctl.conf
echo "fs.file-max=2097152" >> /etc/sysctl.conf
推荐使用containerd而非Docker:
bash复制# 安装containerd
yum install -y containerd.io
# 配置containerd使用systemd作为cgroup driver
cat > /etc/containerd/config.toml <<EOF
version = 2
[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
EOF
systemctl restart containerd
ARM架构下的监控方案:
bash复制# 安装ARM兼容的Prometheus Operator
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm install prometheus prometheus-community/kube-prometheus-stack \
--set prometheus.prometheusSpec.image.repository=quay.io/prometheus/prometheus \
--set prometheus.prometheusSpec.image.tag=v2.42.0-arm64 \
--namespace monitoring
在实际部署过程中,ARM架构下有几个特别需要注意的点:
bash复制docker inspect --format='{{.Architecture}}' <image-name>
bash复制cpupower frequency-set -g performance
这套方案已经在多个国产化项目中落地,最大的体会是:ARM架构下的K8s部署虽然挑战更多,但只要注意架构差异、准备好离线资源包,完全可以实现与x86架构相当的稳定性和性能。特别是在国产化替代场景下,这套方案已经帮助多个客户顺利完成了信创环境建设。