При установке кластера командой kubeadm init процесс останавливается с ошибкой:
[kubelet-check] The HTTP call equal to 'curl -sSL http://localhost:10248/healthz' failed with error: Get "http://localhost:10248/healthz": dial tcp [::1]:10248: connect: connection refused
Это значит, что служба kubelet не запустилась. Встречал на CentOS 8 с Docker.
Причины
- Docker и kubelet используют разные драйверы cgroup: Docker по умолчанию cgroupfs, а kubelet ожидает systemd.
- Включён swap: kubelet по умолчанию отказывается работать со swap.
Точную причину покажет журнал kubelet: journalctl -u kubelet -n 50.
Решение
Сбросить неудачную установку, переключить Docker на драйвер systemd, отключить swap и запустить kubelet:
kubeadm reset -f
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
systemctl daemon-reload
systemctl restart docker
swapoff -a
systemctl start kubelet
После этого повторите kubeadm init. swapoff -a действует до перезагрузки: чтобы swap не включился снова, закомментируйте строку swap в /etc/fstab.
Начиная с Kubernetes 1.24 Docker как среда запуска напрямую не поддерживается, обычно используют containerd. Там то же самое делается параметром SystemdCgroup = true в /etc/containerd/config.toml.