Kubelet の実行に失敗しました: サービス接続を検証: エンドポイントに CRI v1 ランタイム API が実装されていません

Kubelet の実行に失敗しました: サービス接続を検証: エンドポイントに CRI v1 ランタイム API が実装されていません

kubelet 1.26.0コマンドを使用して Ubuntu 22.04 にインストールしましたがapt install kubelet、試してみるとjournalctl -xeu kubelet次の結果が表示されます。

░░ 
░░ The unit kubelet.service has entered the 'failed' state with result 'exit-code'.
Dec 14 15:41:16 a systemd[1]: kubelet.service: Scheduled restart job, restart counter is at 86.
░░ Subject: Automatic restarting of a unit has been scheduled
░░ Defined-By: systemd
░░ Support: http://www.ubuntu.com/support
░░ 
░░ Automatic restarting of the unit kubelet.service has been scheduled, as the result for
░░ the configured Restart= setting for the unit.
Dec 14 15:41:16 a systemd[1]: Stopped kubelet: The Kubernetes Node Agent.
░░ Subject: A stop job for unit kubelet.service has finished
░░ Defined-By: systemd
░░ Support: http://www.ubuntu.com/support
░░ 
░░ A stop job for unit kubelet.service has finished.
░░ 
░░ The job identifier is 26301 and the job result is done.
Dec 14 15:41:16 a systemd[1]: Started kubelet: The Kubernetes Node Agent.
░░ Subject: A start job for unit kubelet.service has finished successfully
░░ Defined-By: systemd
░░ Support: http://www.ubuntu.com/support
░░ 
░░ A start job for unit kubelet.service has finished successfully.
░░ 
░░ The job identifier is 26301.
Dec 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.
Dec 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>
Dec 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.
Dec 14 15:41:16 a kubelet[18015]: I1214 15:41:16.371255   18015 server.go:412] "Kubelet version" kubeletVersion="v1.26.0"
Dec 14 15:41:16 a kubelet[18015]: I1214 15:41:16.371272   18015 server.go:414] "Golang settings" GOGC="" GOMAXPROCS="" GOTRACEBACK=""
Dec 14 15:41:16 a kubelet[18015]: I1214 15:41:16.371499   18015 server.go:836] "Client rotation is on, will bootstrap in background"
Dec 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".
Dec 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"
Dec 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 /"
Dec 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=[]
Dec 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>
Dec 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"
Dec 14 15:41:16 a kubelet[18015]: I1214 15:41:16.399883   18015 container_manager_linux.go:308] "Creating device plugin manager"
Dec 14 15:41:16 a kubelet[18015]: I1214 15:41:16.399940   18015 state_mem.go:36] "Initialized new in-memory state store"
Dec 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 \">
Dec 14 15:41:16 a systemd[1]: kubelet.service: Main process exited, code=exited, status=1/FAILURE
░░ Subject: Unit process exited
░░ Defined-By: systemd
░░ Support: http://www.ubuntu.com/support
░░ 
░░ An ExecStart= process belonging to unit kubelet.service has exited.
░░ 
░░ The process' exit code is 'exited' and its exit status is 1.
Dec 14 15:41:16 a systemd[1]: kubelet.service: Failed with result 'exit-code'.
░░ Subject: Unit failed
░░ Defined-By: systemd
░░ Support: http://www.ubuntu.com/support
░░ 
░░ The unit kubelet.service has entered the 'failed' state with result 'exit-code'.
lines 2547-2600/2600 (END)

何が問題なのか分かりません。どうすれば解決できるでしょうか?

答え1

今日も同じ問題に遭遇しました。どうやら関係があるようですこの変化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
  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

現在、両方のオプションをテストしていますが、どちらも機能しているようです。近い将来、containerd1.6 以降の apt パッケージがリリースされ、作業が楽になることを期待しています :)

3 番目のオプションを追加するための編集 (これまでのところ最も簡単なようです):

  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

答え2

私はこれに少し苦労しましたが、@Bogd の回答のおかげで正しい方向に進みました。コメントするには長すぎるので、Flannel を使用して新しい Ubuntu 22.04 ノードで安定した Kubernetes 1.26 マスターを構成する手順を次に示します。

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

containerd をインストールします (参照:Ubuntu 16.04 をインストールします。

  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

containerd 構成を作成する

  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 が存在しません」というエラーを回避する (参照参考:)。ステップ 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 に感謝します。コメントを参照してください)

Flannel で使用する kubeinit

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

kubadmコマンドに従ってconfigにコピーします

  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

フランネルを塗る(参照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

答え3

/etc/containerd/config.toml 構成ファイルをチェックして、cri インターフェースが無効になっているかどうかを確認します (例: disabled_plugins = ["cri"])。確認すると、構成 disabled_plugins = ["cri"] が disabled_plugins = [""] に変更されていることがわかります。次に、再起動して、containerd サービスを再起動します (systemctl restart containerd)。

答え4

Kubernetes はバージョン 1.20 以降、コンテナ ランタイムとしての Docker を非推奨にしており、Kubernetes の最新バージョンでは Docker 用にサポートされている CRI API が記述されていません。Mirantis が Docker 用に開発した CRI を使用して、以下の手順でこれを実行できます。

以下の URL から cri-dockerd をインストールします。

https://github.com/Mirantis/cri-dockerd

git clone https://github.com/Mirantis/cri-dockerd.git

# Run these commands as root
###Install GO###
wget https://storage.googleapis.com/golang/getgo/installer_linux
chmod +x ./installer_linux
./installer_linux
source ~/.bash_profile

cd cri-dockerd
mkdir bin
go build -o bin/cri-dockerd
mkdir -p /usr/local/bin
install -o root -g root -m 0755 bin/cri-dockerd /usr/local/bin/cri-dockerd
cp -a packaging/systemd/* /etc/systemd/system
sed -i -e 's,/usr/bin/cri-dockerd,/usr/local/bin/cri-dockerd,' /etc/systemd/system/cri-docker.service
systemctl daemon-reload
systemctl enable cri-docker.service
systemctl enable --now cri-docker.socket

注: 各コマンドを個別にインストールしてください。一括実行では、いくつかのコマンドで-yまたはyesを入力する必要があるため、エラーが発生することがあります。

次に、以下を使用して kube 管理クラスターを起動します。

kubeadm init --pod-network-cidr=192.168.0.0/16 --cri-socket=unix:///var/run/cri-dockerd.sock 

関連情報