
Я установил 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 :(. Мне удалось найти только пакеты 1.6+ для Ubuntu 22.10 и выше.
Возможные обходные пути:
- Тот, что указан в ссылке выше - работает на более старой версии kubelet (1.25)
apt remove --purge kubelet
apt install -y kubeadm kubelet=1.25.5-00
- Ручное обновление 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
Я сейчас тестирую оба варианта, и они, кажется, работают. Надеюсь, в (очень близком) будущем мы получим пакет containerd
apt 1.6+, который облегчит нам жизнь :)
Редактирую, чтобы добавить третий вариант (который, кажется, самый простой на данный момент):
- В репозиториях 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 направил меня на правильный путь. Слишком долго, чтобы комментировать, поэтому вот шаги, предпринятые для настройки стабильного мастера Kubernetes 1.26 на новом узле Ubuntu 22.04 с использованием Flannel.
sudo apt-get update
sudo apt install apt-transport-https curl
Установите containerd (ссылка:https://docs.docker.com/engine/install/ubuntu/)
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-get update
sudo apt-get install containerd.io
Создать конфигурацию containerd
sudo mkdir -p /etc/containerd
sudo containerd config default | sudo tee /etc/containerd/config.toml
Редактировать /etc/containerd/config.toml
sudo nano /etc/containerd/config.toml
установить SystemdCgroup = truesudo systemctl restart containerd
Установить Kubernetes
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add
sudo apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"
sudo apt install kubeadm kubelet kubectl kubernetes-cni
Отключить подкачку
sudo swapoff -a
Проверьте и удалите все записи о свопах, если таковые имеются.
sudo nano /etc/fstab
Избегайте ошибки «/proc/sys/net/bridge/bridge-nf-call-iptables не существует» в kubeinit (ссылкаhttps://github.com/kubernetes/kubeadm/issues/1062). Это не обязательно, если на шаге 6 также установлен Docker.
sudo modprobe br_netfilter
sudo nano /proc/sys/net/ipv4/ip_forward
Отредактируйте запись в файле ip_forward и измените ее на 1. (Или используйтеsysctl -w net.ipv4.ip_forward=1
- спасибо @dpjanes, см. комментарии)
kubeinit для использования с Flannel
sudo kubeadm init --pod-network-cidr=10.244.0.0/16
Скопируйте в конфигурацию, как указано в команде kubadm
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Нанесите фланель (ссылка)https://github.com/flannel-io/flannel)
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 прекращает поддержку Docker как среды выполнения контейнера после версии 1.20, поэтому в последних версиях Kubernetes не реализованы поддерживаемые API CRI для Docker. Это можно сделать, выполнив следующий шаг с использованием CRI, разработанного Mirantis для Docker:
Установите 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 Admin, используя следующую команду:
kubeadm init --pod-network-cidr=192.168.0.0/16 --cri-socket=unix:///var/run/cri-dockerd.sock