falha ao executar Kubelet: validar conexão de serviço: API de tempo de execução CRI v1 não está implementada para endpoint

falha ao executar Kubelet: validar conexão de serviço: API de tempo de execução CRI v1 não está implementada para endpoint

Instalei kubelet 1.26.0no Ubuntu 22.04 usando apt install kubeleto comando, mas quando tento journalctl -xeu kubeletobtenho o seguinte 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)

Não sei qual é o problema. Como posso me livrar disso?

Responder1

Acabei de encontrar o mesmo problema hoje - parece estar relacionado aesta mudançaem K8s 1,26.

A solução seria instalar o containerd 1.6, mas... parece não haver um pacote APT para isso ainda :(. Só consegui encontrar pacotes 1.6+ para Ubuntu 22.10 e superior.

Possíveis soluções alternativas:

  1. Aquele listado no link acima – executando uma versão mais antiga do kubelet (1.25)
apt remove --purge kubelet
apt install -y kubeadm kubelet=1.25.5-00
  1. Atualizando manualmente o containerd para 1.6 ou superior, baixando e substituindo os binários
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

Atualmente estou testando as duas opções e elas parecem funcionar. Esperançosamente, em um futuro (muito próximo), obteremos um containerdpacote 1.6+ apt para tornar as coisas mais fáceis para nós :)

Editando para adicionar uma terceira opção (que parece ser a mais fácil até agora):

  1. Nos repositórios do Docker, existem pacotes para containerd 1.6 e superior. Portanto, você também pode adicionar os repositórios do Docker e instalar o containerd.io a partir daí:
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

Responder2

Lutei um pouco com isso e a resposta de @Bogd me colocou no caminho certo. Muito tempo para comentar, então aqui estão as etapas executadas para configurar um mestre Kubernetes 1.26 estável em um novo nó Ubuntu 22.04 usando Flannel.

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

Instale o containerd (referência: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

Criar configuração de contêiner

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

Edite /etc/containerd/config.toml

  1. sudo nano /etc/containerd/config.toml definir SystemdCgroup = verdadeiro
  2. sudo systemctl restart containerd

Instale o 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

Desativar troca

  1. sudo swapoff -a

Verifique e remova qualquer entrada de troca, se existir

  1. sudo nano /etc/fstab

Evite o erro "/proc/sys/net/bridge/bridge-nf-call-iptables não existe" no kubeinit (referênciahttps://github.com/kubernetes/kubeadm/issues/1062). Isso não é necessário se o docker também estiver instalado na etapa 6.

  1. sudo modprobe br_netfilter
  2. sudo nano /proc/sys/net/ipv4/ip_forward Edite a entrada no arquivo ip_forward e mude para 1. (Ou use sysctl -w net.ipv4.ip_forward=1- graças a @dpjanes, veja os comentários)

kubeinit para uso com flanela

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

Copie para configuração como diz o 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 Flanela (referênciahttps://github.com/flannel-io/flannel)

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

Tudo deve estar funcionando agora:

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

Responder3

Verifique o arquivo de configuração /etc/containerd/config.toml para ver se a interface cri está desabilitada, como: disabled_plugins = ["cri"]. Após a visualização, verifica-se que a configuração disabled_plugins = ["cri"] foi alterada para disabled_plugins = [""]. Em seguida, reinicie e reinicie o serviço containerd: systemctl restart containerd.

Responder4

O Kubernetes está descontinuando o Docker como um tempo de execução de contêiner após a v1.20 e, portanto, as versões mais recentes do Kubernetes não escreveram APIs CRI suportadas para o docker. Podemos fazer isso usando a etapa abaixo usando o CRI desenvolvido pela Mirantis para o docker:

Instale o cri-dockerd a partir do URL abaixo:

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 separadamente. Na execução em massa, às vezes recebo erros, pois alguns comandos podem precisar de -y ou sim para digitar

Agora inicie o cluster de administração kube usando abaixo:

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

informação relacionada