k8s1.29.15+containerd搭建集群
*前言*
这里写一个用kubeadm搭建k8s的1.29.x版本,依此来把当前文章变成后续 版本的通用部署k8s文章
,容器运行时有好几个 containerd、CRI-O、Docker Engine(使用 cri-dockerd),这里选containerd
⭐
containerd 调用链更短,组件更少,更稳定,支持OCI标准,占用节点资源更少。 建议选择 containerd。
以下情况,请选择 docker 作为运行时组件:
如需使用 docker in docker
如需在 K8S 节点使用 docker build/push/save/load 等命令
如需调用 docker API
如需 docker compose 或 docker swarm
系统环境准备
主机准备好各自在hosts文件中添加对应的主机名
| *IP* | *规格* | *操作系统* | *主机名* |
|---|---|---|---|
| 192.168.31.7 | 2c4g | CentOS7.9 | k8s-master01 |
| 192.168.31.8 | 2c4g | CentOS7.9 | k8s-node01 |
| 192.168.31.9 | 2c4g | CentOS7.9 | k8s-node02 |
2.1 Kubernetes 使用主机名来区分集群内的节点,所以每台主机的 hostname 不可重名。修改 /etc/hostname 这个文件来重命名 hostname:
Master 节点命名为 k8s-master01,Worker 节点命名为 k8s-node01,k8s-node02
hostnamectl set-hostname k8s-master01
hostnamectl set-hostname k8s-node01
hostnamectl set-hostname k8s-node02
2.2 将 SELinux 设置为 permissive 模式(相当于将其禁用)
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
2.3 关闭防火墙
systemctl stop firewalld.service
systemctl disable firewalld.service
2.4 关闭swap(避免内存交换至磁盘导致性能下降)
sudo swapoff -a
sudo sed -ri '/\sswap\s/s/^#?/#/' /etc/fstab
2.5 配置主机名解析
cat >>/etc/hosts<< EOF
192.168.31.7 k8s-master01
192.168.31.8 k8s-node01
192.168.31.9 k8s-node02
EOF
2.6 开启转发 IPv4 并让 iptables 看到桥接流量
⭐
创建名为/etc/modules-load.d/k8s.conf 的文件,并且将 overlay和br_netfilter写入。这两个模块 overlay 和 br_netfilter 是 containerd 运行所需的内核模块。
(overlay模块:overlay模块是用于支持Overlay网络文件系统的模块。Overlay文件系统是一种在现有文件系统的顶部创建叠加层的方法,以实现联合挂载(Union Mount)。它允许将多个文件系统合并为一个单一的逻辑文件系统,具有层次结构和优先级。这样可以方便地将多个文件系统中的文件或目录合并在一起,而不需要实际复制或移动文件。
br_netfilter模块:br_netfilter模块是用于支持Linux桥接网络的模块,并提供了与防火墙(netfilter)子系统的集成。桥接网络是一种将不同的网络接口连接在一起以实现局域网通信的方法,它可以通过Linux内核的桥接功能来实现。br_netfilter模块与netfilter集成,可用于在Linux桥接设备上执行网络过滤和NAT(网络地址转换)操作。)
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
# 设置所需的 sysctl 参数,参数在重新启动后保持不变
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
# 应用 sysctl 参数而不重新启动
sudo sysctl --system
# 运行以下命令确认模块是否正常被加载
lsmod | grep br_netfilter
lsmod | grep overlay
# 通过运行以下指令确认 net.bridge.bridge-nf-call-iptables、net.bridge.bridge-nf-call-ip6tables 和 net.ipv4.ip_forward 系统变量在你的 sysctl 配置中被设置为 1:
sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.ip_forward
*安装containerd*
阿里云yum源安装containerd,containernetwork-plugins
# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils
# Step 2: 添加软件源信息
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3: 安装Docker
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# Step 4: 开启Docker服务
sudo service docker start
# 注意:
# 官方软件源默认启用了最新的软件,您可以通过编辑软件源的方式获取各个版本的软件包。例如官方并没有将测试版本的软件源置为可用,您可以通过以下方式开启。同理可以开启各种测试版本等。
# vim /etc/yum.repos.d/docker-ce.repo
# 将[docker-ce-test]下方的enabled=0修改为enabled=1
#
# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# yum list docker-ce.x86_64 --showduplicates | sort -r
# Loading mirror speeds from cached hostfile
# Loaded plugins: branch, fastestmirror, langpacks
# docker-ce.x86_64 17.03.1.ce-1.el7.centos docker-ce-stable
# docker-ce.x86_64 17.03.1.ce-1.el7.centos @docker-ce-stable
# docker-ce.x86_64 17.03.0.ce-1.el7.centos docker-ce-stable
# Available Packages
# Step2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.0.ce.1-1.el7.centos)
# sudo yum -y install docker-ce-[VERSION]
- 生成配置文件
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml
- 修改默认配置文件
1.# 开启运行时使用systemd的cgroup
sed -i '/SystemdCgroup/s/false/true/' /etc/containerd/config.toml
2.#重启containerd
systemctl restart containerd
再修改/etc/containerd/config.toml中的
[plugins."io.containerd.grpc.v1.cri"]
...
# sandbox_image = "k8s.gcr.io/pause:3.6"
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"
#这里一定要注意,要根据下载
- 测试runc
yum方式安装默认自带
用于根据OCI规范生成和运行容器的CLI工具
wget https://github.com/opencontainers/runc/releases/download/v1.1.12/runc.amd64
install -m 755 runc.amd64 /usr/local/sbin/runc
- 配置 kubeadm 及 kubectl 自动补全功能:
yum install -y bash-completion
kubeadm completion bash > /etc/bash_completion.d/kubeadm
kubectl completion bash > /etc/bash_completion.d/kubectl
source /etc/bash_completion.d/kubeadm /etc/bash_completion.d/kubectl
https://www.cnblogs.com/hukey/p/17428157.html
https://blog.csdn.net/qq_57414752/article/details/138441017
安装kubeadm kubelet kubectl
kubernetes镜像源
cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/rpm/repodata/repomd.xml.key
EOF
setenforce 0
yum install -y kubelet kubeadm kubectl
systemctl enable kubelet && systemctl start kubelet
初始化操作
生成配置文件
kubeadm config print init-defaults > kubeadm-init.yml
vim kubeadm-init.yml
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 0s #修改token过期时间为无限制
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.168.199.101 #修改为k8s-master节点IP
bindPort: 6443
nodeRegistration:
criSocket: unix:///var/run/containerd/containerd.sock
imagePullPolicy: IfNotPresent
taints:
- effect: PreferNoSchedule
key: node-role.kubernetes.io/master
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers #替换为国内的镜像仓库
kind: ClusterConfiguration
kubernetesVersion: 1.26.0
networking:
dnsDomain: cluster.local
serviceSubnet: 10.96.0.0/12
podSubnet: 10.244.0.0/16 #为pod网络指定网络段
---
#申明cgroup用 systemd
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd
failSwapOn: false
---
#启用ipvs
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
服务器基础配置
1,禁用交换分区
临时关闭:swapoff -a && sysctl -w vm.swappiness=0
基于配置文件关闭sed -ri '/^#*swap/s@^@#@' /etc/fstab
2,确保每个节点上 MAC 地址和 product_uuid 的唯一性
ifconfig eth0 | grep ether | awk '{print $2}'
cat /sys/class/dmi/id/product_uuid
3,检查网络节点是否互通
简而言之,就是检查你的k8s集群各节点是否互通,可以使用ping命令来测试。
允许iptable检查桥接流量
cat <<EOF | tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
cat <<EOF | tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
2. 如何检查 CentOS 是否已配置?
(1) 检查 br_netfilter 是否加载
lsmod | grep br_netfilter # 若无输出,说明未加载
(2) 检查 sysctl 参数
sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables
• 如果返回 0 或报错 sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-iptables,则说明未正确配置。
---
3. 如果未配置,会有什么问题?
• Service 网络异常:ClusterIP 无法访问,kubectl get svc 显示服务但无法连通。
• Pod 跨节点通信失败:ping 或 curl 其他节点的 Pod IP 无响应。
• NetworkPolicy 失效:流量绕过 iptables 规则,导致策略不生效。
---
4. 如何手动配置?
1. 加载 br_netfilter 模块
echo "br_netfilter" | sudo tee /etc/modules-load.d/k8s.conf
sudo modprobe br_netfilter # 立即生效 #
2. 启用桥接流量经过 iptables
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
3. 应用配置(无需重启)sudo sysctl --system
---
5. 验证配置
<检查模块lsmod | grep br_netfilter # 应返回 "br_netfilter" # 检查 sysctlsysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables# 应返回:# net.bridge.bridge-nf-call-iptables = 1# net.bridge.bridge-nf-call-ip6tables = 1
检查端口是否被占用
nc 127.0.0.1 6443 -v
查看镜像
kubeadm config images list --config=kubeadm-init.yml
registry.aliyuncs.com/google_containers/kube-apiserver:v1.26.0
registry.aliyuncs.com/google_containers/kube-controller-manager:v1.26.0
registry.aliyuncs.com/google_containers/kube-scheduler:v1.26.0
registry.aliyuncs.com/google_containers/kube-proxy:v1.26.0
registry.aliyuncs.com/google_containers/pause:3.9
registry.aliyuncs.com/google_containers/etcd:3.5.6-0
registry.aliyuncs.com/google_containers/coredns:v1.9.3
注意:再次确认 registry.aliyuncs.com/google_containers/pause:3.9 就是上面
/etc/containerd/config.toml 中所需要填写正确的 pause镜像及版本号。
修改完成后记得重启 containerd,所有节点都需要操作:
systemctl restart containerd
下载镜像
kubeadm config images pull --config=kubeadm-init.yml
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-apiserver:v1.26.0
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-controller-manager:v1.26.0
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-scheduler:v1.26.0
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-proxy:v1.26.0
[config/images] Pulled registry.aliyuncs.com/google_containers/pause:3.9
[config/images] Pulled registry.aliyuncs.com/google_containers/etcd:3.5.6-0
[config/images] Pulled registry.aliyuncs.com/google_containers/coredns:v1.9.3
初始化集群
#执行初始化并将日志记录到 kubeadm-init.log 日志文件中
kubeadm init --config=kubeadm-init.yml | tee kubeadm-init.log
使用下面的命令是配置常规用户如何使用kubectl访问集群(root也可这样执行):
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
日志中也给出了加入集群的命令:
kubeadm join 192.168.199.101:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:fff9cb2c367c904d31994abb5a460b2e16305a4b687744ad1f31af06c02d37d7
*安装网络插件Flanel*
# 可以直接下载这个yaml,然后进行修改
wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
因为咱们刚刚定义了podSubnet的网段为10.244.0.0/16 和flannel是同一个网段 所以就不需要修改yaml的网段了
然后我们安装 Flannel:
$ kubectl apply -f kube-flannel.yml
namespace/kube-flannel created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created
再查看就正常啦, 如果还没有ready 可以看下flannel pod是否起来
kubectl get pod -n kube-flannel
如果是需要扩展master节点,需要执行以下步骤
# 新master节点
mkdir -p /etc/kubernetes/pki/etcd &&mkdir -p ~/.kube/
# 最开始的master节点上执行192.168.31.6为新的master节点
scp /etc/kubernetes/admin.conf root@192.168.31.6:/etc/kubernetes/
scp /etc/kubernetes/pki/ca.* root@192.168.31.6:/etc/kubernetes/pki/
scp /etc/kubernetes/pki/sa.* root@192.168.31.6:/etc/kubernetes/pki/
scp /etc/kubernetes/pki/front-proxy-ca.* root@192.168.31.6:/etc/kubernetes/pki/
scp /etc/kubernetes/pki/etcd/ca.* root@192.168.31.6:/etc/kubernetes/pki/etcd/
# 拿到上面kubeadm 生成的 join 命令在新的master上执行和工作节点的区别在于多了一个--control-plane 参数
kubeadm join 192.168.31.7:6443 \
--token 2ofltv.hzljc5fvenqbbcxe \
--discovery-token-ca-cert-hash sha256:d149574aa882ea03ed53075b3849818dd1200732ad4d98630c12bd9d7cfd5f96 \
--control-plane
# 注意更换为你的信息
安装完后查看信息
[root@k8s-master01 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master01 Ready control-plane 23m v1.29.4
k8s-master02 Ready control-plane 13m v1.29.4
k8s-node01 Ready <none> 14m v1.29.4
k8s-node02 Ready <none> 14m v1.29.4
安装container的yum源
# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils
# Step 2: 添加软件源信息
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3: 安装Docker
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# Step 4: 开启Docker服务
sudo service docker start
# 注意:
# 官方软件源默认启用了最新的软件,您可以通过编辑软件源的方式获取各个版本的软件包。例如官方并没有将测试版本的软件源置为可用,您可以通过以下方式开启。同理可以开启各种测试版本等。
# vim /etc/yum.repos.d/docker-ce.repo
# 将[docker-ce-test]下方的enabled=0修改为enabled=1
#
# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# yum list docker-ce.x86_64 --showduplicates | sort -r
# Loading mirror speeds from cached hostfile
# Loaded plugins: branch, fastestmirror, langpacks
# docker-ce.x86_64 17.03.1.ce-1.el7.centos docker-ce-stable
# docker-ce.x86_64 17.03.1.ce-1.el7.centos @docker-ce-stable
# docker-ce.x86_64 17.03.0.ce-1.el7.centos docker-ce-stable
# Available Packages
# Step2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.0.ce.1-1.el7.centos)
# sudo yum -y install docker-ce-[VERSION]
- 安装kubeadm,kubelet,kubectl软件包
(比如需要安装 1.29 版本,则需要将如下配置中的 v1.28 替换成 v1.29)
CentOS / RHEL / Fedora
cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.29/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.29/rpm/repodata/repomd.xml.key
EOF
setenforce 0
yum install -y kubelet kubeadm kubectl
systemctl enable kubelet && systemctl start kubelet
(2)查看kubeadm的版本(将来你要安装的K8S时请所有组件版本均保持一致!)
yum -y list kubeadm --showduplicates | sort -r
(4)启动kubelet服务(若服务启动失败时正常现象,其会自动重启,因为缺失配置文件,初始化集群后恢复!此步骤可跳过!)
systemctl enable --now kubelet
systemctl status kubelet
初始化master节点
1,主机名需要解析
2,containerd配置文件需要修改
3,启动ip转发功能
根据您提供的 `kubeadm init` 命令和错误信息,以下是问题的分析和解决建议:
* * *
🛠️ 一、错误信息解析
------------
### 1\. **`[ERROR CRI]: container runtime is not running`**
* **描述**:Kubernetes 的容器运行时(如 containerd)未正常运行。
* **原因**:
* containerd 服务未启动。
* containerd 配置不正确或版本不兼容。
* 容器运行时与 Kubernetes 的 API 不兼容。
### 2\. **`[ERROR FileContent--proc-sys-net-ipv4-ip_forward]: /proc/sys/net/ipv4/ip_forward contents are not set to 1`**
* **描述**:IP 转发功能未启用。
* **原因**:
* 系统中未开启 IP 转发功能,这在 Kubernetes 中是必需的。
### 3\. **`[WARNING Hostname]`**
* **描述**:主机名无法解析。
* **原因**:
* DNS 配置不正确。
* 主机名未在 `/etc/hosts` 中配置。
* * *
🧰 二、解决方案
---------
### ✅ 1. 启用 IP 转发
# 临时启用 IP 转发
echo "1" > /proc/sys/net/ipv4/ip_forward
# 永久启用 IP 转发
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p
Bash
复制
### ✅ 2. 启动 containerd 服务
# 检查 containerd 是否正在运行
systemctl status containerd
# 如果未运行,启动 containerd
systemctl start containerd
# 设置开机自启
systemctl enable containerd
Bash
复制
### ✅ 3. 配置主机名解析
确保 `/etc/hosts` 文件中包含当前主机的 IP 和主机名:
# 示例:假设主机名为 vm10-0-1-144,IP 为 192.168.1.100
echo "192.168.1.100 vm10-0-1-144" >> /etc/hosts
Bash
复制
### ✅ 4. 检查 DNS 配置
确保 `/etc/resolv.conf` 中有有效的 DNS 服务器:
nameserver 8.8.8.8
nameserver 8.8.4.4
Bash
复制
### ✅ 5. 检查 containerd 的 CRI 接口
确保 containerd 支持 Kubernetes 所需的 CRI 接口。可以检查 containerd 的配置文件 `/etc/containerd/config.toml`,确保以下内容存在:
[plugins."io.containerd.grpc.v1.cri"]
disable = false
TOML
复制
如果需要,可以重新生成 containerd 的配置文件:
containerd config default > /etc/containerd/config.toml
Bash
复制
然后重启 containerd:
systemctl restart containerd
Bash
复制
* * *
⚠️ 三、可选参数(忽略警告)
---------------
如果您确定某些警告不影响集群初始化,可以在命令中添加 `--ignore-preflight-errors` 参数来跳过这些检查:
kubeadm init --kubernetes-version=v1.29.15 \
--image-repository=registry.aliyuncs.com/google_containers \
--pod-network-cidr=10.100.0.0/16 \
--service-cidr=10.200.0.0/16 \
--service-dns-domain=526767.top \
--ignore-preflight-errors=Hostname,FileContent--proc-sys-net-ipv4-ip_forward
Bash
复制
* * *
📌 四、后续步骤
---------
完成上述修复后,再次尝试运行 `kubeadm init` 命令。如果成功,您将看到类似以下输出:
Your Kubernetes control-plane has been initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>i</mi><mi>d</mi><mo>−</mo><mi>u</mi><mo stretchy="false">)</mo><mo>:</mo></mrow><annotation encoding="application/x-tex">(id -u):</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">i</span><span class="mord mathnormal">d</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">u</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">:</span></span></span></span>(id -g) $HOME/.kube/config
You should now deploy a pod network to the cluster.
Run 'kubectl apply -f [podnetwork].yaml' with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
* * *
📘 五、参考文档
---------
* [Kubernetes 官方文档](https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/)
* [containerd 官方文档](https://docs.containerd.io/)
* * *
如果您还有其他问题或需要进一步帮助,请随时告诉我!
==================================================================================
根据您提供的信息,`disabled_plugins = ["cri"]` 是 `containerd` 配置文件中的一项设置,这可能是导致 `kubeadm init` 失败的关键原因。
* * *
🔍 一、问题分析
---------
### ✅ `disabled_plugins = ["cri"]` 的含义
* `cri` 是 **Container Runtime Interface**(容器运行时接口)的缩写。
* 它是 Kubernetes 与容器运行时(如 containerd)之间通信的标准接口。
* 如果 `cri` 被禁用(即 `disabled_plugins = ["cri"]`),Kubernetes 将无法与 containerd 正常交互,从而导致以下错误:
error: output: time="2025-07-23T18:37:12+08:00" level=fatal msg="validate service connection: validate CRI v1 runtime API for endpoint \"unix:///var/run/containerd/containerd.sock\": rpc error: code = Unimplemented desc = unknown service runtime.v1.RuntimeService"
* * *
🛠️ 二、解决方案:启用 `cri` 插件
----------------------
### ✅ 步骤 1:编辑 containerd 配置文件
sudo vi /etc/containerd/config.toml
Bash
复制
### ✅ 步骤 2:查找并修改 `disabled_plugins` 行
将:
disabled_plugins = ["cri"]
TOML
复制
改为:
# disabled_plugins = ["cri"]
TOML
复制
或者直接删除该行。
> ⚠️ 注意:确保没有其他插件被误禁用,例如 `ttrpc` 或 `grpc` 等,这些是 containerd 的核心组件,不应被禁用。
### ✅ 步骤 3:保存并退出编辑器
* * *
🔄 三、重启 containerd 服务
---------------------
sudo systemctl restart containerd
Bash
复制
* * *
🧪 四、验证 containerd 是否正常运行
-------------------------
systemctl status containerd
Bash
复制
输出应为:
● containerd.service - containerd container runtime
Loaded: loaded (/lib/systemd/system/containerd.service; enabled; vendor preset: enabled)
Active: active (running) since ...
* * *
📌 五、重新运行 `kubeadm init`
------------------------
在完成上述操作后,再次尝试运行:
kubeadm init --kubernetes-version=v1.29.15 \
--image-repository=registry.aliyuncs.com/google_containers \
--pod-network-cidr=10.100.0.0/16 \
--service-cidr=10.200.0.0/16 \
--service-dns-domain=526767.top
Bash
复制
如果一切正常,应该可以成功初始化 Kubernetes 控制平面。
* * *
📘 六、参考文档
---------
* [containerd 官方配置文档](https://docs.containerd.io/config/)
* [Kubernetes 容器运行时支持说明](https://kubernetes.io/docs/setup/production-environment/container-runtimes/)
* * *
如果您还有其他关于 containerd 或 Kubernetes 的问题,欢迎继续提问!
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://docker.m.daocloud.io","https://docker.xuanyuan.me"]
[plugins."io.containerd.grpc.v1.cri".registry]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["http://dockerhub.cn-guangzhou-1.mirrors.ksyunkcr.com"]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."k8s.gcr.io"]
endpoint = ["http://k8sgcr.cn-guangzhou-1.mirrors.ksyunkcr.com"]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."gcr.io"]
endpoint = ["http://gcr.cn-guangzhou-1.mirrors.ksyunkcr.com"]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."ghcr.io"]
endpoint = ["http://ghcr.cn-guangzhou-1.mirrors.ksyunkcr.com"]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."registry.k8s.io"]
endpoint = ["http://registryk8s.cn-guangzhou-1.mirrors.ksyunkcr.com"]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."quay.io"]
endpoint = ["http://quay.cn-guangzhou-1.mirrors.ksyunkcr.com"]

浙公网安备 33010602011771号