银河麒麟 V10 部署K8s 1.32 + cri-dockerd
·
一、环境信息
| 组件 | 版本 |
|---|---|
| OS | 银河麒麟 V10 (ky10), kernel 4.19.90-89.32.v2401 |
| K8s | v1.32.13 |
| Docker | 26.0.0 |
| cri-dockerd | v0.3.16 |
| CNI | v1.6.0 |
二、前置准备(所有节点)
# 关闭防火墙和 SELinux
systemctl stop firewalld && systemctl disable firewalld
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
# 关闭 swap
swapoff -a
sed -i 's/.*swap.*/#&/' /etc/fstab
# 配置 hosts
cat >> /etc/hosts << 'EOF'
192.168.25.10 master1
192.168.25.11 worker1
192.168.25.12 worker2
EOF
# 配置内核参数
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
EOF
sysctl --system
# 加载模块
modprobe br_netfilter
echo "br_netfilter" > /etc/modules-load.d/br_netfilter.conf
三、安装 Docker(所有节点)
yum install -y docker-ce docker-ce-cli containerd.io
systemctl enable --now docker
四、安装 cri-dockerd(所有节点)
cd /usr/local/bin
# 下载
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.16/cri-dockerd-0.3.16.amd64.tgz
tar -xzf cri-dockerd-0.3.16.amd64.tgz
mv cri-dockerd/cri-dockerd /usr/local/bin/cri-dockerd
chmod +x /usr/local/bin/cri-dockerd
# 创建 systemd 服务
cat > /etc/systemd/system/cri-docker.service << 'EOF'
[Unit]
Description=CRI Interface for Docker Application Container Engine
After=network.target docker.service
Requires=docker.service
[Service]
Type=simple
ExecStart=/usr/local/bin/cri-dockerd --container-runtime-endpoint unix:///run/cri-dockerd.sock --network-plugin=cni --cni-bin-dir=/opt/cni/bin --cni-conf-dir=/etc/cni/net.d --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.10
ExecReload=/bin/kill -s HUP $MAINPID
Restart=always
RestartSec=2
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now cri-docker.service
五、安装 K8s 二进制(所有节点)
cd /usr/local/bin
# 下载
wget https://dl.k8s.io/v1.32.13/bin/linux/amd64/kubelet
wget https://dl.k8s.io/v1.32.13/bin/linux/amd64/kubeadm
wget https://dl.k8s.io/v1.32.13/bin/linux/amd64/kubectl
chmod +x kubelet kubeadm kubectl
# CNI 插件
mkdir -p /opt/cni/bin
cd /opt/cni/bin
wget https://github.com/containernetworking/plugins/releases/download/v1.6.0/cni-plugins-linux-amd64-v1.6.0.tgz
tar -xzf cni-plugins-linux-amd64-v1.6.0.tgz
rm -f cni-plugins-linux-amd64-v1.6.0.tgz
六、配置 kubelet(所有节点)
# 创建 kubelet 服务
cat > /etc/systemd/system/kubelet.service << 'EOF'
[Unit]
Description=Kubernetes Kubelet
Documentation=https://kubernetes.io/docs
After=docker.service cri-docker.service
Requires=docker.service cri-docker.service
[Service]
EnvironmentFile=/var/lib/kubelet/kubeadm-flags.env
ExecStart=/usr/local/bin/kubelet --config=/var/lib/kubelet/config.yaml $KUBELET_KUBEADM_ARGS
Restart=always
StartLimitInterval=0
RestartSec=10
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
七、Master 节点初始化
kubeadm init \
--apiserver-advertise-address=192.168.25.10 \
--apiserver-bind-port=6443 \
--kubernetes-version=v1.32.13 \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 \
--image-repository=registry.aliyuncs.com/google_containers \
--cri-socket=unix:///run/cri-dockerd.sock
初始化后修复 kubelet 配置
# 修复 containerRuntimeEndpoint
sed -i 's|containerRuntimeEndpoint: ""|containerRuntimeEndpoint: unix:///run/cri-dockerd.sock|' /var/lib/kubelet/config.yaml
# 确保 kubeadm-flags.env 包含 kubeconfig
echo 'KUBELET_KUBEADM_ARGS="--kubeconfig=/etc/kubernetes/kubelet.conf --container-runtime-endpoint=unix:///run/cri-dockerd.sock --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.10"' > /var/lib/kubelet/kubeadm-flags.env
systemctl restart kubelet
配置 kubectl
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
安装网络插件(Calico)
# 下载 Calico
wget https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/calico.yaml
# 修改镜像为国内可访问的源
sed -i 's|docker.io/calico/|docker.m.daocloud.io/calico/|g' calico.yaml
# 在所有节点手动拉取镜像
docker pull docker.m.daocloud.io/calico/cni:v3.27.0
docker pull docker.m.daocloud.io/calico/node:v3.27.0
docker pull docker.m.daocloud.io/calico/kube-controllers:v3.27.0
# 打标签
docker tag docker.m.daocloud.io/calico/cni:v3.27.0 docker.io/calico-cni:v3.27.0
docker tag docker.m.daocloud.io/calico/node:v3.27.0 docker.io/calico-node:v3.27.0
docker tag docker.m.daocloud.io/calico/kube-controllers:v3.27.0 docker.io/calico-kube-controllers:v3.27.0
# 应用
kubectl apply -f calico.yaml
八、Worker 节点加入
生成 join 命令(在 master1 上)
kubeadm token create --print-join-command
Worker 节点执行
kubeadm join 192.168.25.10:6443 --token <token> \
--discovery-token-ca-cert-hash sha256:<hash> \
--cri-socket=unix:///run/cri-dockerd.sock
Worker 节点修复 kubelet 配置
# 修复 containerRuntimeEndpoint
sed -i 's|containerRuntimeEndpoint: ""|containerRuntimeEndpoint: unix:///run/cri-dockerd.sock|' /var/lib/kubelet/config.yaml
# 添加 bootstrap 配置到 kubeadm-flags.env
cat > /var/lib/kubelet/kubeadm-flags.env << 'EOF'
KUBELET_KUBEADM_ARGS="--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --container-runtime-endpoint=unix:///run/cri-dockerd.sock --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.10"
EOF
systemctl restart kubelet
九、验证命令
# 查看节点
kubectl get nodes
# 查看系统 Pod
kubectl get pods -n kube-system
# 查看服务状态
systemctl status docker
systemctl status cri-docker.service
systemctl status kubelet
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get svc nginx
docker pull docker.m.daocloud.io/library/nginx:latest
docker tag docker.m.daocloud.io/library/nginx:latest nginx
kubectl get svc nginx
kubectl get pods -o wide
curl http://192.168.25.10:<node-port>
十、遇到的问题及解决方案
问题1:cri-dockerd RPM 包依赖失败
现象:
错误:依赖检测失败:
container-selinux >= 2:2.74
containerd.io >= 1.2.2-3
libc.so.6(GLIBC_2.32)(64bit)
libc.so.6(GLIBC_2.34)(64bit)
原因:
Fedora 35 的 RPM 包与银河麒麟 V10 的 glibc 版本不兼容。
解决:
使用通用二进制安装 cri-dockerd,不用 RPM 包。
问题2:kubelet 连接 containerd 而不是 cri-dockerd
现象:
dial unix /run/containerd/containerd.sock: connect: no such file or directory
原因:
kubeadm init/join 生成的 kubelet 配置中 containerRuntimeEndpoint 为空,kubelet 默认连接 containerd。
解决:
每次 kubeadm init/join 后修复 config.yaml:
sed -i 's|containerRuntimeEndpoint: ""|containerRuntimeEndpoint: unix:///run/cri-dockerd.sock|' /var/lib/kubelet/config.yaml
问题3:kubelet 启动失败 - webhook authentication
现象:
failed to run Kubelet: no client provided, cannot use webhook authentication
原因:
kubeadm 生成的 config.yaml 缺少 kubeconfig 配置,kubelet 无法连接 API server。
解决:
在 kubeadm-flags.env 中指定 kubeconfig:
echo 'KUBELET_KUBEADM_ARGS="--kubeconfig=/etc/kubernetes/kubelet.conf --container-runtime-endpoint=unix:///run/cri-dockerd.sock"' > /var/lib/kubelet/kubeadm-flags.env
问题4:worker 节点 join 时端口被占用
现象:
[ERROR Port-10250]: Port 10250 is in use
原因:
之前失败的 kubelet 进程还在运行。
解决:
pkill -9 kubelet
# 或者
systemctl stop kubelet
问题5:cgroup driver 不匹配(核心问题)
现象:
Error response from daemon: cgroup-parent for systemd cgroup should be a valid slice named as "xxx.slice"
原因:
- kubelet config 中
cgroupDriver: systemd - 但 cri-dockerd 0.3.16 与 Docker 的 systemd cgroup 驱动有兼容性问题
- cri-dockerd 传递给 Docker 的 cgroup-parent 格式不正确
解决:
改用 cgroupfs 驱动:
# 1. 删除 Docker 的 systemd 配置
rm -f /etc/docker/daemon.json
# 2. 重启 Docker
systemctl restart docker
# 3. 确认是 cgroupfs
docker info | grep -i "Cgroup Driver"
# 应显示:Cgroup Driver: cgroupfs
# 4. 修改 kubelet config
sed -i 's|cgroupDriver: systemd|cgroupDriver: cgroupfs|' /var/lib/kubelet/config.yaml
# 5. 重启服务
systemctl restart cri-docker.service
systemctl restart kubelet
问题6:cri-dockerd 不支持 --cgroup-parent 参数
现象:
unknown flag: --cgroup-parent
原因:
cri-dockerd 0.3.16 版本不支持 --cgroup-parent 启动参数。
解决:
从 service 文件中删除该参数:
cat > /etc/systemd/system/cri-docker.service << 'EOF'
[Unit]
Description=CRI Interface for Docker Application Container Engine
After=network.target docker.service
Requires=docker.service
[Service]
Type=simple
ExecStart=/usr/local/bin/cri-dockerd --container-runtime-endpoint unix:///run/cri-dockerd.sock --network-plugin=cni --cni-bin-dir=/opt/cni/bin --cni-conf-dir=/etc/cni/net.d --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.10
ExecReload=/bin/kill -s HUP $MAINPID
Restart=always
RestartSec=2
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl restart cri-docker.service
问题7:Calico 镜像拉取失败
现象:
Failed to pull image "docker.io/calico-cni:v3.27.0": ... request canceled while waiting for connection
原因:
国内网络访问 docker.io 超时或被墙。
解决:
使用国内镜像代理(如 daoCloud):
# 修改 calico.yaml
sed -i 's|docker.io/calico/|docker.m.daocloud.io/calico/|g' calico.yaml
# 或手动拉取并打标签
docker pull docker.m.daocloud.io/calico/cni:v3.27.0
docker tag docker.m.daocloud.io/calico/cni:v3.27.0 docker.io/calico-cni:v3.27.0
问题8:Calico 和 Flannel 冲突
现象:
Calico Pod 反复重启,网络不通。
原因:
之前安装了 Flannel,又安装 Calico,两个 CNI 插件冲突。
解决:
删除 Flannel,只保留 Calico:
kubectl delete -f kube-flannel.yml
kubectl apply -f calico.yaml
十一、关键总结
| 关键点 | 说明 |
|---|---|
| 二进制安装 | 银河麒麟 V10 建议用二进制安装 K8s 组件,避免 RPM 依赖问题 |
| kubeadm 会覆盖配置 | 每次 init/join 后必须修复 containerRuntimeEndpoint |
| cgroup 驱动 | cri-dockerd 0.3.16 + 麒麟 V10 建议用 cgroupfs,不要用 systemd |
| 镜像源 | 国内环境提前准备镜像或使用代理(daoCloud、阿里云等) |
| service 文件 | cri-dockerd 0.3.16 不支持 --cgroup-parent 参数 |
更多推荐
所有评论(0)