一、环境信息

组件版本
OS银河麒麟 V10 (ky10), kernel 4.19.90-89.32.v2401
K8sv1.32.13
Docker26.0.0
cri-dockerdv0.3.16
CNIv1.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 参数

更多推荐