无法运行 Kubelet:验证服务连接:端点未实现 CRI v1 运行时 API

bes*_*man 19 configuration systemd systemctl kubernetes kubeadm

我已经kubelet 1.26.0使用命令安装在 Ubuntu 22.04 上apt install kubelet,但是当我尝试时journalctl -xeu kubelet得到以下结果:

\n
\xe2\x96\x91\xe2\x96\x91 \n\xe2\x96\x91\xe2\x96\x91 The unit kubelet.service has entered the 'failed' state with result 'exit-code'.\nDec 14 15:41:16 a systemd[1]: kubelet.service: Scheduled restart job, restart counter is at 86.\n\xe2\x96\x91\xe2\x96\x91 Subject: Automatic restarting of a unit has been scheduled\n\xe2\x96\x91\xe2\x96\x91 Defined-By: systemd\n\xe2\x96\x91\xe2\x96\x91 Support: http://www.ubuntu.com/support\n\xe2\x96\x91\xe2\x96\x91 \n\xe2\x96\x91\xe2\x96\x91 Automatic restarting of the unit kubelet.service has been scheduled, as the result for\n\xe2\x96\x91\xe2\x96\x91 the configured Restart= setting for the unit.\nDec 14 15:41:16 a systemd[1]: Stopped kubelet: The Kubernetes Node Agent.\n\xe2\x96\x91\xe2\x96\x91 Subject: A stop job for unit kubelet.service has finished\n\xe2\x96\x91\xe2\x96\x91 Defined-By: systemd\n\xe2\x96\x91\xe2\x96\x91 Support: http://www.ubuntu.com/support\n\xe2\x96\x91\xe2\x96\x91 \n\xe2\x96\x91\xe2\x96\x91 A stop job for unit kubelet.service has finished.\n\xe2\x96\x91\xe2\x96\x91 \n\xe2\x96\x91\xe2\x96\x91 The job identifier is 26301 and the job result is done.\nDec 14 15:41:16 a systemd[1]: Started kubelet: The Kubernetes Node Agent.\n\xe2\x96\x91\xe2\x96\x91 Subject: A start job for unit kubelet.service has finished successfully\n\xe2\x96\x91\xe2\x96\x91 Defined-By: systemd\n\xe2\x96\x91\xe2\x96\x91 Support: http://www.ubuntu.com/support\n\xe2\x96\x91\xe2\x96\x91 \n\xe2\x96\x91\xe2\x96\x91 A start job for unit kubelet.service has finished successfully.\n\xe2\x96\x91\xe2\x96\x91 \n\xe2\x96\x91\xe2\x96\x91 The job identifier is 26301.\nDec 14 15:41:16 a kubelet[18015]: Flag --pod-infra-container-image has been deprecated, will be removed in 1.27. Image garbage collector will get sandbox image information from CRI.\nDec 14 15:41:16 a kubelet[18015]: I1214 15:41:16.367525   18015 server.go:198] "--pod-infra-container-image will not be pruned by the image garbage collector in kubelet and should also be set in the rem>\nDec 14 15:41:16 a kubelet[18015]: Flag --pod-infra-container-image has been deprecated, will be removed in 1.27. Image garbage collector will get sandbox image information from CRI.\nDec 14 15:41:16 a kubelet[18015]: I1214 15:41:16.371255   18015 server.go:412] "Kubelet version" kubeletVersion="v1.26.0"\nDec 14 15:41:16 a kubelet[18015]: I1214 15:41:16.371272   18015 server.go:414] "Golang settings" GOGC="" GOMAXPROCS="" GOTRACEBACK=""\nDec 14 15:41:16 a kubelet[18015]: I1214 15:41:16.371499   18015 server.go:836] "Client rotation is on, will bootstrap in background"\nDec 14 15:41:16 a kubelet[18015]: I1214 15:41:16.372757   18015 certificate_store.go:130] Loading cert/key pair from "/var/lib/kubelet/pki/kubelet-client-current.pem".\nDec 14 15:41:16 a kubelet[18015]: I1214 15:41:16.373608   18015 dynamic_cafile_content.go:157] "Starting controller" name="client-ca-bundle::/etc/kubernetes/pki/ca.crt"\nDec 14 15:41:16 a kubelet[18015]: I1214 15:41:16.399357   18015 server.go:659] "--cgroups-per-qos enabled, but --cgroup-root was not specified.  defaulting to /"\nDec 14 15:41:16 a kubelet[18015]: I1214 15:41:16.399717   18015 container_manager_linux.go:267] "Container manager verified user specified cgroup-root exists" cgroupRoot=[]\nDec 14 15:41:16 a kubelet[18015]: I1214 15:41:16.399832   18015 container_manager_linux.go:272] "Creating Container Manager object based on Node Config" nodeConfig={RuntimeCgroupsName: SystemCgroupsName>\nDec 14 15:41:16 a kubelet[18015]: I1214 15:41:16.399866   18015 topology_manager.go:134] "Creating topology manager with policy per scope" topologyPolicyName="none" topologyScopeName="container"\nDec 14 15:41:16 a kubelet[18015]: I1214 15:41:16.399883   18015 container_manager_linux.go:308] "Creating device plugin manager"\nDec 14 15:41:16 a kubelet[18015]: I1214 15:41:16.399940   18015 state_mem.go:36] "Initialized new in-memory state store"\nDec 14 15:41:16 a kubelet[18015]: E1214 15:41:16.402173   18015 run.go:74] "command failed" err="failed to run Kubelet: validate service connection: CRI v1 runtime API is not implemented for endpoint \\">\nDec 14 15:41:16 a systemd[1]: kubelet.service: Main process exited, code=exited, status=1/FAILURE\n\xe2\x96\x91\xe2\x96\x91 Subject: Unit process exited\n\xe2\x96\x91\xe2\x96\x91 Defined-By: systemd\n\xe2\x96\x91\xe2\x96\x91 Support: http://www.ubuntu.com/support\n\xe2\x96\x91\xe2\x96\x91 \n\xe2\x96\x91\xe2\x96\x91 An ExecStart= process belonging to unit kubelet.service has exited.\n\xe2\x96\x91\xe2\x96\x91 \n\xe2\x96\x91\xe2\x96\x91 The process' exit code is 'exited' and its exit status is 1.\nDec 14 15:41:16 a systemd[1]: kubelet.service: Failed with result 'exit-code'.\n\xe2\x96\x91\xe2\x96\x91 Subject: Unit failed\n\xe2\x96\x91\xe2\x96\x91 Defined-By: systemd\n\xe2\x96\x91\xe2\x96\x91 Support: http://www.ubuntu.com/support\n\xe2\x96\x91\xe2\x96\x91 \n\xe2\x96\x91\xe2\x96\x91 The unit kubelet.service has entered the 'failed' state with result 'exit-code'.\nlines 2547-2600/2600 (END)\n
Run Code Online (Sandbox Code Playgroud)\n

我不知道出了什么问题。我怎样才能摆脱它?

\n

J.R*_*.R. 17

我在这个问题上遇到了一些困难,@Bogd 的回答让我走上了正确的道路。时间太长,无法评论,因此以下是使用 Flannel 在新的 Ubuntu 22.04 节点上配置稳定的 Kubernetes 1.26 master 所采取的步骤。

  1. sudo apt-get update
  2. sudo apt install apt-transport-https curl

安装containerd(参考: https: //docs.docker.com/engine/install/ubuntu/

  1. sudo mkdir -p /etc/apt/keyrings
  2. curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
  3. echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  4. sudo apt-get update
  5. sudo apt-get install containerd.io

创建容器配置

  1. sudo mkdir -p /etc/containerd
  2. sudo containerd config default | sudo tee /etc/containerd/config.toml

编辑/etc/containerd/config.toml

  1. sudo nano /etc/containerd/config.toml 设置 SystemdCgroup = true
  2. sudo systemctl restart containerd

安装 Kubernetes

  1. curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add
  2. sudo apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"
  3. sudo apt install kubeadm kubelet kubectl kubernetes-cni

禁用交换

  1. sudo swapoff -a

检查并删除任何交换条目(如果存在)

  1. sudo nano /etc/fstab

避免 kubeinit 上出现错误“/proc/sys/net/bridge/bridge-nf-call-iptables does not exit”(参考https://github.com/kubernetes/kubeadm/issues/1062)。如果在步骤 6 中也安装了 docker,则无需执行此操作。

  1. sudo modprobe br_netfilter
  2. sudo nano /proc/sys/net/ipv4/ip_forward 编辑 ip_forward 文件中的条目并更改为 1。(或使用sysctl -w net.ipv4.ip_forward=1- 感谢 @dpjanes,请参阅评论)

kubeinit 与 Flannel 一起使用

  1. sudo kubeadm init --pod-network-cidr=10.244.0.0/16

按照 kubadm 命令所述复制到配置

  1. mkdir -p $HOME/.kube
  2. sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  3. sudo chown $(id -u):$(id -g) $HOME/.kube/config

应用Flannel(参考https://github.com/flannel-io/flannel

  1. kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/v0.20.2/Documentation/kube-flannel.yml

现在一切都应该正在运行:

kubectl get pods --all-namespaces

NAMESPACE      NAME                                  READY   STATUS    RESTARTS   AGE
kube-flannel   kube-flannel-ds-mcjmm                 1/1     Running   0          76s
kube-system    coredns-787d4945fb-fb59g              1/1     Running   0          8m8s
kube-system    coredns-787d4945fb-t25tj              1/1     Running   0          8m8s
kube-system    etcd-kube-master                      1/1     Running   0          8m19s
kube-system    kube-apiserver-kube-master            1/1     Running   0          8m19s
kube-system    kube-controller-manager-kube-master   1/1     Running   0          8m19s
kube-system    kube-proxy-2hz29                      1/1     Running   0          8m8s
kube-system    kube-scheduler-kube-master            1/1     Running   0          8m19s
Run Code Online (Sandbox Code Playgroud)


Bog*_*ogd 13

今天刚刚遇到同样的问题 - 似乎与K8s 1.26 中的这一更改有关。

解决方案是安装containerd 1.6,但是......似乎还没有APT软件包:(。我只能找到适用于Ubuntu 22.10及更高版本的1.6+软件包。

可能的解决方法:

  1. 上面链接中列出的 - 运行旧版本的 kubelet (1.25)
apt remove --purge kubelet
apt install -y kubeadm kubelet=1.25.5-00
Run Code Online (Sandbox Code Playgroud)
  1. 通过下载并替换二进制文件,手动将 Containerd 升级到 1.6 或更高版本
wget https://github.com/containerd/containerd/releases/download/v1.6.12/containerd-1.6.12-linux-amd64.tar.gz
tar xvf containerd-1.6.12-linux-amd64.tar.gz
systemctl stop containerd
cd bin
cp * /usr/bin/
systemctl start containerd
Run Code Online (Sandbox Code Playgroud)

我目前正在测试这两个选项,它们似乎确实有效。希望在不久的将来,我们将获得containerd1.6+ apt 软件包,让事情变得更轻松:)

编辑以添加第三个选项(这似乎是迄今为止最简单的):

  1. 在 Docker 存储库中,有适用于 Containerd 1.6 及更高版本的软件包。因此,您还可以添加 Docker 存储库,并从那里安装 containerd.io:
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo   "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install containerd.io
Run Code Online (Sandbox Code Playgroud)