1. 项目概述
在国产化信创的大背景下,ARM架构服务器在企业级应用中的占比越来越高。作为一名长期从事云原生技术落地的工程师,我最近在鲲鹏920处理器上完成了Kubernetes 1.34.5集群的部署实践,操作系统分别采用了openEuler和Ubuntu。与传统的x86架构相比,ARM架构的部署过程存在一些特有的挑战和注意事项,特别是在容器镜像兼容性和系统依赖方面。
这次部署使用了专为国产化环境优化的kt工具(基于kk二次开发),它显著简化了ARM架构下的Kubernetes部署流程。整个过程涉及系统初始化、Harbor私有仓库搭建、Kubernetes集群部署以及KubeSphere可视化管理平台的安装。下面我将详细分享每个环节的具体操作和踩坑经验。
2. 环境准备与规划
2.1 硬件与操作系统选型
本次实验环境采用了两台ARM服务器:
- 控制节点:鲲鹏920芯片,4核8G内存,openEuler操作系统
- Harbor节点:鲲鹏920芯片,2核4G内存,Ubuntu 20.04 LTS
选择openEuler作为控制节点操作系统是因为它对ARM架构有更好的优化,而Ubuntu则因其在容器生态中的广泛兼容性被选作Harbor节点。这种混合部署方式既能发挥各自优势,也符合生产环境中常见的多OS共存场景。
注意:虽然kt工具支持多种国产操作系统,但建议首次部署选择经过充分验证的发行版,如openEuler或Ubuntu,可以避免很多兼容性问题。
2.2 网络规划建议
在生产环境中,建议采用以下网络规划原则:
- 管理网络与业务网络分离
- 为Kubernetes服务预留足够的IP空间(如配置中的10.233.64.0/18)
- 提前规划好NodePort范围(默认30000-32767)
我们的测试环境采用了简化的单网络平面设计,各节点信息如下:
| 主机名 | 架构 | 操作系统 | 配置 | IP地址 |
|---|---|---|---|---|
| master | arm64 | openEuler | 4核8G | 192.168.0.18 |
| harbor | arm64 | Ubuntu | 2核4G | 192.168.0.203 |
2.3 离线部署包准备
由于国产化环境通常需要离线部署,我们提前准备了以下资源包:
- kt工具包(v3.1.14)
- 操作系统依赖包(kt-centos.tar.gz)
- Kubernetes ARM镜像包(artifact-arm-k8s1345.tar.gz)
- KubeSphere附加组件包(artifact-arm-k8s1345-ks3.4.1.tar.gz)
这些资源包需要提前下载并上传到master节点的同一目录下。建议使用md5sum校验文件完整性,避免因文件损坏导致部署失败。
3. 系统初始化与配置
3.1 一键初始化系统依赖
kt工具提供了便捷的系统初始化命令,能自动识别操作系统类型并安装所需依赖:
bash复制./kt init-os -f config-sample.yaml
这个命令会完成以下工作:
- 禁用swap分区
- 关闭SELinux(如为RHEL系系统)
- 安装containerd、conntrack、socat等基础依赖
- 配置内核参数(net.ipv4.ip_forward=1等)
- 设置系统时区和时间同步
实测发现:在openEuler上执行初始化时,需要确保已配置好软件源。某些特定版本可能需要手动安装libseccomp-devel等额外依赖。
3.2 配置文件详解
config-sample.yaml是部署的核心配置文件,有几个关键配置需要特别注意:
yaml复制kubernetes:
version: v1.34.5
containerManager: containerd # 使用containerd而非docker
network:
plugin: calico # 网络插件选择
kubePodsCIDR: 10.233.64.0/18 # Pod IP范围
kubeServiceCIDR: 10.233.0.0/18 # Service IP范围
registry:
type: harbor
privateRegistry: "dockerhub.kubekey.local" # 私有仓库地址
auths:
"dockerhub.kubekey.local":
username: "admin"
password: "Harbor@123" # 需与Harbor部署时一致
对于ARM架构,必须确保containerManager设置为containerd,因为Docker对ARM的支持不如containerd完善。另外,IP地址段需要根据实际网络环境调整,避免与现有网络冲突。
4. Harbor私有仓库部署
4.1 自动化部署Harbor
在harbor节点上执行以下命令:
bash复制./kt init registry -f config-sample.yaml -a artifact-arm-k8s1345.tar.gz
这个流程会自动完成:
- Docker CE的安装与配置
- Docker-compose的安装
- Harbor的部署与初始化
- 镜像仓库证书配置
部署完成后,可以通过https://192.168.0.203访问Harbor UI,默认管理员账号为admin/Harbor@123。
4.2 常见问题排查
在ARM架构上部署Harbor可能会遇到以下问题:
-
镜像兼容性问题:
- 现象:某些组件Pod启动失败
- 解决方案:确保所有镜像都有ARM64版本,或已通过docker buildx构建多架构镜像
-
证书信任问题:
- 现象:节点无法拉取私有仓库镜像
- 解决方案:在所有节点执行:
bash复制mkdir -p /etc/containerd/certs.d/dockerhub.kubekey.local cp harbor.crt /etc/containerd/certs.d/dockerhub.kubekey.local/ca.crt systemctl restart containerd
-
存储空间不足:
- Harbor默认数据目录为/opt/harbor,对于生产环境建议挂载单独的数据盘
5. Kubernetes集群部署
5.1 集群创建命令
在master节点执行核心部署命令:
bash复制./kt create cluster -f config-sample.yaml -a artifact-arm-k8s1345-ks3.4.1.tar.gz --with-local-storage
这个命令会依次执行:
- 各节点基础环境检查
- Kubernetes组件镜像推送至Harbor
- 控制平面组件部署(etcd、kube-apiserver等)
- 工作节点加入集群
- 网络插件(Calico)安装
- 本地存储卷配置(--with-local-storage参数)
5.2 部署过程监控
可以通过以下命令实时查看部署日志:
bash复制kubectl logs -n kubesphere-system \
$(kubectl get pod -n kubesphere-system -l 'app in (ks-install, ks-installer)' -o jsonpath='{.items[0].metadata.name}') -f
在ARM架构上部署时,需要特别关注:
- 镜像下载是否成功(所有镜像必须为arm64版本)
- 各组件Pod的资源请求是否合理(ARM节点资源通常更宝贵)
- 网络插件是否正常初始化
5.3 部署后验证
成功部署后,可以通过以下命令验证集群状态:
bash复制kubectl get nodes # 查看节点状态
kubectl get pods -A # 查看所有命名空间Pod状态
kubectl logs -n kube-system calico-node-xxxxx # 检查网络插件日志
常见的ARM特有问题包括:
- 某些DaemonSet Pod无法调度(需检查nodeAffinity)
- 节点NotReady(通常是kubelet与container运行时通信问题)
- 镜像拉取失败(私有仓库认证或镜像架构不匹配)
6. KubeSphere平台集成
6.1 最小化安装配置
默认配置只安装了监控组件,如需启用其他功能,可以编辑ks-installer配置:
bash复制kubectl edit cc ks-installer -n kubesphere-system
修改后保存,ks-installer会自动应用变更。常用可启用组件包括:
- DevOps(CI/CD流水线)
- Service Mesh(Istio)
- Logging(EFK日志系统)
注意:在ARM环境下,部分KubeSphere组件可能需要额外验证。建议先完成核心平台部署,再逐步启用其他功能。
6.2 访问控制台
部署完成后,可以通过NodePort访问KubeSphere控制台:
- URL: http://<任意节点IP>:30880
- 默认管理员账号:admin/P@88w0rd
首次登录后应立即修改密码,并根据需要配置用户权限和项目空间。
7. 运维与优化建议
7.1 ARM架构特有优化
-
内核参数调优:
bash复制# 增加容器可用端口范围 echo "net.ipv4.ip_local_port_range = 1024 65535" >> /etc/sysctl.conf # 优化容器内存管理 echo "vm.overcommit_memory = 1" >> /etc/sysctl.conf sysctl -p -
containerd配置优化:
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
7.2 监控与告警配置
KubeSphere内置了Prometheus监控,针对ARM架构建议:
- 调整监控数据保留时间(默认7天可能不足)
- 为ARM节点设置特定的资源告警阈值(通常与x86不同)
- 定期检查监控组件资源使用情况
7.3 备份策略
对于生产环境,必须配置以下备份:
-
etcd定期快照:
bash复制etcdctl snapshot save /backup/etcd-snapshot-$(date +%Y%m%d).db \ --endpoints=https://127.0.0.1:2379 \ --cacert=/etc/ssl/etcd/ssl/ca.pem \ --cert=/etc/ssl/etcd/ssl/node-master.pem \ --key=/etc/ssl/etcd/ssl/node-master-key.pem -
Harbor数据备份:
bash复制# 在Harbor节点执行 cd /opt/harbor docker-compose down tar czvf /backup/harbor-$(date +%Y%m%d).tar.gz /data /opt/harbor docker-compose up -d
8. 常见问题解决方案
8.1 镜像拉取失败
现象:Pod状态为ImagePullBackOff,日志显示"no matching manifest for linux/arm64"
解决方案:
- 检查镜像是否支持ARM架构:
bash复制
docker manifest inspect <镜像名> - 对于不支持ARM的镜像,可以:
- 寻找替代镜像
- 自行构建ARM版本
- 使用docker buildx构建多架构镜像
8.2 节点NotReady
可能原因:
- 网络插件未正常运行
- kubelet与containerd通信失败
- 节点资源不足
排查步骤:
bash复制journalctl -u kubelet -n 100 --no-pager # 查看kubelet日志
crictl ps -a # 检查容器运行时状态
kubectl describe node <节点名> # 查看节点详情
8.3 性能调优建议
-
为kubelet配置预留资源:
bash复制# 在/var/lib/kubelet/config.yaml中添加 kubeReserved: cpu: "500m" memory: "1Gi" ephemeral-storage: "5Gi" systemReserved: cpu: "500m" memory: "1Gi" ephemeral-storage: "5Gi" -
调整Pod密度:
- ARM节点通常建议运行较少的Pod(相比x86减少20-30%)
- 为关键Pod配置合适的resource requests/limits
经过这次在ARM架构上的Kubernetes部署实践,我发现国产化环境的成熟度已经显著提升,但仍有不少细节需要特别注意。建议在正式生产环境部署前,先进行充分的兼容性测试和性能基准测试。对于关键业务系统,可以考虑采用混合架构(ARM+x86)的部署方案来提高容错能力。