麒麟V10离线部署Kubernetes 1.32.11全攻略

1. 项目背景与核心挑战

在国产化替代的大背景下,越来越多的企业开始将业务系统迁移到国产操作系统平台。麒麟V10作为国产操作系统的代表之一,其安全性和稳定性已得到广泛验证。而Kubernetes(k8s)作为容器编排领域的事实标准,在国产系统上的部署需求也日益增长。

这次我们要解决的问题是在麒麟V10系统上离线部署k8s 1.32.11版本。离线环境意味着我们无法直接使用包管理器的在线安装方式,所有依赖都需要预先下载并传输到目标环境。这种部署方式常见于金融、军工等对网络安全要求严格的场景。

提示:离线安装的核心难点在于依赖包的完整性和版本匹配,一个缺失的依赖可能导致整个安装过程失败。

2. 环境准备与依赖检查

2.1 系统基础环境配置

麒麟V10基于openEuler开发,采用Linux 5.10内核。在开始安装前,需要确认以下系统配置:

  1. 关闭防火墙和SELinux:
systemctl stop firewalld systemctl disable firewalld setenforce 0 sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
  1. 关闭swap分区:
swapoff -a sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
  1. 设置主机名解析:
echo "192.168.1.100 master" >> /etc/hosts echo "192.168.1.101 node1" >> /etc/hosts

2.2 离线资源包准备

需要提前下载以下组件包:

  • kubeadm、kubelet、kubectl 1.32.11版本
  • containerd或Docker运行时
  • CNI插件(推荐使用flannel或calico)
  • 相关依赖库(libseccomp、conntrack等)

建议在联网环境使用以下命令下载所需rpm包:

yum install --downloadonly --downloaddir=/path/to/save kubelet-1.32.11 kubeadm-1.32.11 kubectl-1.32.11

3. 容器运行时安装与配置

3.1 containerd安装

containerd是Kubernetes推荐的容器运行时,相比Docker更加轻量:

  1. 安装containerd:
rpm -ivh containerd-*.rpm
  1. 配置containerd:
mkdir -p /etc/containerd containerd config default > /etc/containerd/config.toml
  1. 修改配置文件启用systemd cgroup:
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc] ... [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options] SystemdCgroup = true

3.2 镜像仓库配置

离线环境需要配置私有镜像仓库:

  1. 在可联网机器上拉取所需镜像:
kubeadm config images pull --image-repository=registry.aliyuncs.com/google_containers --kubernetes-version=v1.32.11
  1. 将镜像打包并导入离线环境:
docker save -o k8s-images.tar $(docker images -q)

4. Kubernetes集群部署

4.1 主节点初始化

  1. 安装kubeadm、kubelet和kubectl:
rpm -ivh kubelet-1.32.11*.rpm kubeadm-1.32.11*.rpm kubectl-1.32.11*.rpm
  1. 初始化控制平面:
kubeadm init \ --image-repository=local-registry:5000/google_containers \ --kubernetes-version=v1.32.11 \ --pod-network-cidr=10.244.0.0/16
  1. 配置kubectl:
mkdir -p $HOME/.kube cp /etc/kubernetes/admin.conf $HOME/.kube/config chown $(id -u):$(id -g) $HOME/.kube/config

4.2 网络插件安装

以flannel为例:

  1. 下载flannel镜像和manifest:
wget https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
  1. 修改配置文件中的网络CIDR:
net-conf.json: | { "Network": "10.244.0.0/16", "Backend": { "Type": "vxlan" } }
  1. 应用配置:
kubectl apply -f kube-flannel.yml

5. 节点加入与验证

5.1 工作节点加入

  1. 在工作节点上执行:
kubeadm join 192.168.1.100:6443 \ --token <token> \ --discovery-token-ca-cert-hash sha256:<hash>
  1. 在主节点验证节点状态:
kubectl get nodes

5.2 集群功能验证

  1. 部署测试应用:
kubectl create deployment nginx --image=nginx kubectl expose deployment nginx --port=80 --type=NodePort
  1. 检查服务状态:
kubectl get pods,svc

6. 常见问题排查

6.1 镜像拉取失败

现象:Pod处于ImagePullBackOff状态

解决方案:

  1. 检查镜像仓库配置是否正确
  2. 确认镜像已导入本地仓库
  3. 查看kubelet日志:
journalctl -u kubelet -f

6.2 网络不通

现象:Pod间无法通信

排查步骤:

  1. 检查flannel Pod是否正常运行
  2. 验证节点路由表:
ip route show
  1. 检查防火墙规则

6.3 kubelet启动失败

可能原因:

  1. cgroup驱动不匹配
  2. 证书过期
  3. 端口冲突

解决方法:

systemctl daemon-reload systemctl restart kubelet journalctl -xeu kubelet

7. 性能优化建议

  1. 内核参数调优:
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf echo "net.bridge.bridge-nf-call-iptables = 1" >> /etc/sysctl.conf sysctl -p
  1. kubelet资源配置:
--max-pods=100 \ --kube-reserved=cpu=500m,memory=1Gi \ --system-reserved=cpu=500m,memory=1Gi
  1. 容器日志轮转:
{ "log-driver": "json-file", "log-opts": { "max-size": "100m", "max-file": "3" } }

在实际部署过程中,我发现麒麟V10的某些内核模块需要手动加载才能支持Kubernetes的某些功能。建议在部署前先检查内核模块是否完整,特别是overlay和br_netfilter模块。另外,由于是离线环境,建议提前准备好所有可能的依赖包,避免安装过程中因缺少依赖而中断。