Почему kubeadm/kubelet не запускает плоскость управления kubernetes в моем кластере?
Я пытаюсь создать новый кластер kubernetes, следуя стандартным руководствам "kubeadm init", которые можно найти на веб-сайте k8s.
Кажется, что Kubeadm успешно завершает все предполетные проверки и извлекает изображения плоскости управления из Интернета, но затем истекает время ожидания, пока демон kubelet станет здоровым.
Главный узел, на котором я пытаюсь запустить kubeadm, - это машина CentOS 7.8 с установленным Kubernetes 1.18.6 вместе с podman 1.6.4-18 и cri-o 1.14.9-1 в качестве среды выполнения контейнера. Kubeadm извлекает изображения плоскости управления 1.18.8, etcd 3.4.3-0, coredns 1.6.7 и паузу 3.2.
Я запускаю kubeadm с помощью следующей команды:
sudo kubeadm init --apiserver-advertise-address=10.125.231.100 --pod-network-cidr=10.244.0.0/16 --v=5
И ошибка, которую я получаю:
[wait-control-plane] Waiting for the kubelet to boot up the control plane as static Pods from directory "/etc/kubernetes/manifests". This can take up to 4m0s
[kubelet-check] Initial timeout of 40s passed.
[kubelet-check] It seems like the kubelet isn't running or healthy.
[kubelet-check] The HTTP call equal to 'curl -sSL http://localhost:10248/healthz' failed with error: Get http://localhost:10248/healthz: dial tcp 127.0.0.1:10248: connect: connection refused.
[kubelet-check] It seems like the kubelet isn't running or healthy.
[kubelet-check] The HTTP call equal to 'curl -sSL http://localhost:10248/healthz' failed with error: Get http://localhost:10248/healthz: dial tcp 127.0.0.1:10248: connect: connection refused.
[kubelet-check] It seems like the kubelet isn't running or healthy.
[kubelet-check] The HTTP call equal to 'curl -sSL http://localhost:10248/healthz' failed with error: Get http://localhost:10248/healthz: dial tcp 127.0.0.1:10248: connect: connection refused.
[kubelet-check] It seems like the kubelet isn't running or healthy.
[kubelet-check] The HTTP call equal to 'curl -sSL http://localhost:10248/healthz' failed with error: Get http://localhost:10248/healthz: dial tcp 127.0.0.1:10248: connect: connection refused.
[kubelet-check] It seems like the kubelet isn't running or healthy.
[kubelet-check] The HTTP call equal to 'curl -sSL http://localhost:10248/healthz' failed with error: Get http://localhost:10248/healthz: dial tcp 127.0.0.1:10248: connect: connection refused.
Unfortunately, an error has occurred:
timed out waiting for the condition
Проверка того, с какими контейнерами работают crictl ps -a
показывает, что контейнеры не запущены, но crictl images
показывает изображения, которые kubeadm извлек из интернета.
Проверка логов кубелет с помощью sudo journalctl -xeu kubelet
, Я вижу следующие ошибки:
Sep 03 18:52:09 k8s-master kubelet[32635]: E0903 18:52:09.186939 32635 reflector.go:178] k8s.io/kubernetes/pkg/kubelet/config/apiserver.go:46: Failed to list *v1.Pod: Get https://10.125.231.100:6443/api/v1/pods?fieldSelector=spec.nodeName%3Dk8s-master&limit=500&resourceVersion=0: dial tcp 10.125.231.100:6443: connect: connection refused
Sep 03 18:52:09 k8s-master kubelet[32635]: E0903 18:52:09.434226 32635 reflector.go:178] k8s.io/kubernetes/pkg/kubelet/kubelet.go:526: Failed to list *v1.Node: Get https://10.125.231.100:6443/api/v1/nodes?fieldSelector=metadata.name%3Dk8s-master&limit=500&resourceVersion=0: dial tcp 10.125.231.100:6443: connect: connection refused
Sep 03 18:52:13 k8s-master kubelet[32635]: E0903 18:52:13.557632 32635 reflector.go:178] k8s.io/kubernetes/pkg/kubelet/kubelet.go:517: Failed to list *v1.Service: Get https://10.125.231.100:6443/api/v1/services?limit=500&resourceVersion=0: dial tcp 10.125.231.100:6443: connect: connection refused
Sep 03 18:52:14 k8s-master kubelet[32635]: W0903 18:52:14.891351 32635 clientconn.go:1208] grpc: addrConn.createTransport failed to connect to {/var/run/crio/crio.sock <nil> 0 <nil>}: didn't receive server preface in time. Reconnecting...
Sep 03 18:52:14 k8s-master kubelet[32635]: W0903 18:52:14.891422 32635 clientconn.go:1208] grpc: addrConn.createTransport failed to connect to {/var/run/crio/crio.sock <nil> 0 <nil>}: didn't receive server preface in time. Reconnecting...
Sep 03 18:52:14 k8s-master kubelet[32635]: E0903 18:52:14.891470 32635 remote_runtime.go:81] Version from runtime service failed: rpc error: code = Unavailable desc = timed out waiting for server handshake
Sep 03 18:52:14 k8s-master kubelet[32635]: E0903 18:52:14.891541 32635 kuberuntime_manager.go:197] Get runtime version failed: get remote runtime typed version failed: rpc error: code = Unavailable desc = timed out waiting for server handshake
Sep 03 18:52:14 k8s-master kubelet[32635]: F0903 18:52:14.891571 32635 server.go:274] failed to run Kubelet: failed to create kubelet: get remote runtime typed version failed: rpc error: code = Unavailable desc = timed out waiting for server handshake
Sep 03 18:52:14 k8s-master systemd[1]: kubelet.service: main process exited, code=exited, status=255/n/a
Sep 03 18:52:14 k8s-master systemd[1]: Unit kubelet.service entered failed state.
Sep 03 18:52:14 k8s-master systemd[1]: kubelet.service failed.
cri-o, похоже, находится в состоянии готовности, о чем свидетельствуют результаты crictl info
:
{
"status": {
"conditions": [
{
"type": "RuntimeReady",
"status": true,
"reason": "",
"message": ""
},
{
"type": "NetworkReady",
"status": true,
"reason": "",
"message": ""
}
]
}
}
На данный момент я могу только предположить, что изображения плоскости управления не запускаются. Я не понимаю, что проверять дальше, чтобы определить, почему.
Кстати, пытается ли kubeadm или kubelet запустить плоскость управления? Если последнее, меня беспокоит строка с ошибкой:
Sep 03 18:52:14 k8s-master kubelet[32635]: W0903 18:52:14.891422 32635 clientconn.go:1208] grpc: addrConn.createTransport failed to connect to {/var/run/crio/crio.sock <nil> 0 <nil>}: didn't receive server preface in time. Reconnecting...
Исходя из бревен кубелет. Я протестировал podman, запустив образ контейнера, и, похоже, он работает нормально, но, насколько я понимаю, podman и cri-o не совсем одно и то же.
Мое исследование показало, что проблема может быть вызвана такими вещами, как включение файлов подкачки, но я подтвердил, что файлы подкачки отключены и предварительная проверка подкачки проходит.
Что мне следует проверить для дальнейшей отладки проблемы с не запуском образов плоскости управления, и отвечает ли kubeadm или kubelet за запуск этих контейнеров? В частности, есть ли какие-либо настройки SELinux/Firewall/ другие, которые мне нужно проверить?
1 ответ
Мы смогли определить, как решить проблему (у которой было несколько причин).
Проблемы:
- CRI-O был версии 1.16; нам нужна была 1.18. После исправления этой проблемы путем обновления до cri-o 1.18, kubelet смог связаться с /var/run/crio/crio.sock.
- Однако это не удалось с "cgroup не удалось получить срез". Чтобы исправить это, нам просто нужно было обновить аргументы kubelet, чтобы включить
--cgroup-driver=systemd