No se pudo ejecutar Kubelet: validar la conexión del servicio: la API de tiempo de ejecución CRI v1 no está implementada para el punto final

No se pudo ejecutar Kubelet: validar la conexión del servicio: la API de tiempo de ejecución CRI v1 no está implementada para el punto final

Lo instalé kubelet 1.26.0en Ubuntu 22.04 usando apt install kubeletel comando, pero cuando lo intento journalctl -xeu kubeletobtengo el siguiente resultado:

░░ 
░░ 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)

No sé cuál es el problema. ¿Cómo puedo deshacerme de él?

Respuesta1

Acabo de encontrar el mismo problema hoy; parece estar relacionado coneste cambioen K8 1.26.

La solución sería instalar Containerd 1.6, pero... no parece haber un paquete APT para eso todavía :(. Solo pude encontrar paquetes 1.6+ para Ubuntu 22.10 y superior.

Posibles soluciones:

  1. El que aparece en el enlace anterior: ejecuta una versión anterior de kubelet (1.25)
apt remove --purge kubelet
apt install -y kubeadm kubelet=1.25.5-00
  1. Actualización manual de Containerd a 1.6 o superior, descargando y reemplazando los binarios
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

Actualmente estoy probando ambas opciones y parecen funcionar. Con suerte, en un futuro (muy cercano), obtendremos un containerdpaquete apt 1.6+ para facilitarnos las cosas :)

Editando para agregar una tercera opción (que parece ser la más fácil hasta ahora):

  1. En los repositorios de Docker, hay paquetes para contenedores 1.6 y superiores. Entonces también puedes agregar los repositorios de Docker e instalar containerd.io desde allí:
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

Respuesta2

He luchado un poco con esto y la respuesta de @Bogd me llevó por el camino correcto. Demasiado largo para comentar, así que aquí están los pasos a seguir para configurar un maestro Kubernetes 1.26 estable en un nuevo nodo Ubuntu 22.04 usando franela.

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

Instalar en contenedor (referencia: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

Crear configuración en contenedor

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

Editar /etc/containerd/config.toml

  1. sudo nano /etc/containerd/config.toml establecer SystemdCgroup = verdadero
  2. sudo systemctl restart containerd

Instalar 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

Desactivar intercambio

  1. sudo swapoff -a

Verifique y elimine cualquier entrada de intercambio si existe

  1. sudo nano /etc/fstab

Evite el error "/proc/sys/net/bridge/bridge-nf-call-iptables no existe" en kubeinit (referenciahttps://github.com/kubernetes/kubeadm/issues/1062). Esto no es necesario si Docker también está instalado en el paso 6.

  1. sudo modprobe br_netfilter
  2. sudo nano /proc/sys/net/ipv4/ip_forward Edite la entrada en el archivo ip_forward y cámbiela a 1. (O use sysctl -w net.ipv4.ip_forward=1- gracias a @dpjanes, vea los comentarios)

kubeinit para usar con franela

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

Copie a la configuración como dice el comando 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

Aplicar franela (referenciahttps://github.com/flannel-io/flannel)

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

Todo debería estar funcionando ahora:

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

Respuesta3

Verifique el archivo de configuración /etc/containerd/config.toml para ver si la interfaz cri está deshabilitada, como por ejemplo:disabled_plugins = ["cri"]. Después de verlo, se encuentra que la configuracióndisabled_plugins = ["cri"] se cambia adisabled_plugins = [""]. Luego reinicie y reinicie el servicio contenedord: systemctl restart containerd.

Respuesta4

Kubernetes está desaprobando Docker como tiempo de ejecución de contenedor después de v1.20 y, por lo tanto, las últimas versiones de Kubernetes no han escrito API CRI compatibles para Docker. Podemos hacerlo siguiendo el paso a continuación usando CRI desarrollado por Mirantis para Docker:

Instale cri-dockerd desde la siguiente URL:

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

Nota: Instale cada comando por separado. En la ejecución masiva, a veces tengo errores, ya que algunos comandos pueden necesitar -y o sí para escribir

Ahora inicie el clúster de administración de Kube usando lo siguiente:

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

información relacionada