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. 바이너리를 다운로드하고 교체하여 컨테이너를 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

현재 두 가지 옵션을 모두 테스트하고 있는데 제대로 작동하는 것 같습니다. 바라건대, (아주 가까운) 미래에 우리는 containerd일을 더 쉽게 할 수 있는 1.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

답변2

나는 이것으로 약간 어려움을 겪었고 @Bogd의 답변이 나를 올바른 길로 인도했습니다. 설명하기에는 너무 길기 때문에 Flannel을 사용하여 새로운 Ubuntu 22.04 노드에서 안정적인 Kubernetes 1.26 마스터를 구성하는 단계는 다음과 같습니다.

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

컨테이너 설치(참조: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

쿠버네티스 설치

  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가 존재하지 않습니다" 오류를 방지하세요(참조https://github.com/kubernetes/kubeadm/issues/1062). docker가 6단계에서도 설치된 경우에는 필요하지 않습니다.

  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 명령에 따라 구성에 복사

  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

cri 인터페이스가 비활성화되어 있는지 확인하려면 /etc/containerd/config.toml 구성 파일을 확인하세요. 예: 비활성화_플러그인 = ["cri"]. 확인한 결과, 비활성화_플러그인 = ["cri"] 구성이 비활성화_플러그인 = [""]로 변경된 것으로 나타났습니다. 그런 다음 컨테이너 서비스를 다시 시작하고 다시 시작합니다. systemctl restart Containerd.

답변4

Kubernetes는 v1.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 

관련 정보