Вопрос или проблема
У меня есть кластер k8, который я настроил на обычной машине. У меня возникают проблемы с мастером ноды. Во-первых, в каталоге /etc/systemd/system не было kubelet.service и kubelet.service.d – я создал ссылки из /lib/systemd/system, и стало немного лучше. По крайней мере, kubelet работает на порту 6443 без сбоев, но это небезопасно, потому что сертификат, который создает kubeadm init, не является публичным:
curl –insecure https://10.0.23.87:6443
{
“kind”: “Status”,
“apiVersion”: “v1”,
“metadata”: {},
“status”: “Failure”,
“message”: “forbidden: User “system:anonymous” cannot get path “/””,
“reason”: “Forbidden”,
“details”: {},
“code”: 403
}
Но затем kubectl возвращает сбои с возвратом:
Nov 15 17:50:00 ip-10-0-23-87 kubelet[1032]: I1115 17:50:00.918250 1032 scope.go:117] “RemoveContainer” containerID=”48022387cb1c2e671733ef12decc0e581fd6654b38e80c726dc2c914d9d23390″
Nov 15 17:50:00 ip-10-0-23-87 kubelet[1032]: E1115 17:50:00.918451 1032 pod_workers.go:1301] “Ошибка синхронизации пода, пропуск” err=”не удалось “StartContainer” для “kube-flannel” с CrashLoopBackOff: “back-off 5m0s перезапуск неудавшегося контейнера=>
Nov 15 17:50:05 ip-10-0-23-87 kubelet[1032]: E1115 17:50:05.028937 1032 log.go:32] “Запуск PodSandbox из службы выполнения завершился неудачей” err=”rpc ошибка: код = Неизвестно описание = не удалось настроить сеть для песочницы “f7475b86099fccfacd614fcb781dde9caf4ac04cb9>
Nov 15 17:50:05 ip-10-0-23-87 kubelet[1032]: E1115 17:50:05.029017 1032 kuberuntime_sandbox.go:72] “Не удалось создать песочницу для пода” err=”rpc ошибка: код = Неизвестно описание = не удалось настроить сеть для песочницы “f7475b86099fccfacd614fcb781dde9caf4>
Nov 15 17:50:05 ip-10-0-23-87 kubelet[1032]: E1115 17:50:05.029049 1032 kuberuntime_manager.go:1170] “CreatePodSandbox для пода завершился неудачей” err=”rpc ошибка: код = Неизвестно описание = не удалось настроить сеть для песочницы “f7475b86099fccfacd614fcb781dde9caf>
Nov 15 17:50:05 ip-10-0-23-87 kubelet[1032]: E1115 17:50:05.029109 1032 pod_workers.go:1301] “Ошибка синхронизации пода, пропуск” err=”не удалось “CreatePodSandbox” для “coredns-7c65d6cfc9-5l67k_kube-system(c73362ad-a2f3-4e46-bfa9-a742a3d94f24)” wit>
Nov 15 17:50:06 ip-10-0-23-87 kubelet[1032]: I1115 17:50:06.917942 1032 scope.go:117] “RemoveContainer” containerID=”f6d7b4388986d0bc5895b158bb4ee976baf0c8d80b3a7ea7521d9c5288769f22″
Nov 15 17:50:06 ip-10-0-23-87 kubelet[1032]: E1115 17:50:06.918140 1032 pod_workers.go:1301] “Ошибка синхронизации пода, пропуск” err=”не удалось “StartContainer” для “kube-controller-manager” с CrashLoopBackOff: “back-off 5m0s перезапуск неудавшегося>
Nov 15 17:50:11 ip-10-0-23-87 kubelet[1032]: I1115 17:50:11.918298 1032 scope.go:117] “RemoveContainer” containerID=”48022387cb1c2e671733ef12decc0e581fd6654b38e80c726dc2c914d9d23390″
Nov 15 17:50:11 ip-10-0-23-87 kubelet[1032]: E1115 17:50:11.918516 1032 pod_workers.go:1301] “Ошибка синхронизации пода, пропуск” err=”не удалось “StartContainer” для “kube-flannel” с CrashLoopBackOff: “back-off 5m0s перезапуск неудавшегося контейнера=>
строки 1-23/23 (КОНЕЦ)
Что я заметил, так это то, что в Docker нет контейнеров:
ubuntu@ip-10-0-23-87:~$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
Кто-нибудь имеет идею, где копнуть?
Спасибо заранее!
Ответ или решение
Ситуация, описанная вами, указывает на несколько потенциальных проблем в вашем кластере Kubernetes, особенно на мастер-узле. Давайте разберем каждую из них и возможные пути их решения.
1. Ошибка доступа по сертификатам
Вы упомянули, что используете curl
для подключения к серверу API на порту 6443 с флагом --insecure
, и получаете ошибку 403 Forbidden. Это связано с тем, что вы использовали анонимный доступ, и Kubernetes запрещает его. Чтобы устранить эту проблему:
- Убедитесь, что у вас есть необходимые сертификаты и конфигурации kubeconfig для доступа к API-серверу от имени пользователя.
- Попробуйте использовать команду
kubectl
с правильным контекстом и учетными данными:kubectl get nodes --kubeconfig=/path/to/your/kubeconfig
2. Процесс kubelet
Проблемы с kubelet могут быть вызваны его неправильной настройкой:
- Убедитесь, что файлы
kubelet.service
иkubelet.service.d
созданы корректно. Ключевая точка здесь – наличие всех необходимых параметров в конфигурации. - Проверьте журналы kubelet на наличие дополнительных ошибок, которые могут указывать на неверные настройки или проблемы с сетью. Ваша команда
journalctl -u kubelet -f
может помочь обнаружить более конкретные ошибки.
3. Проблемы с сетью
Ошибка failed to setup network for sandbox
указывает на проблемы с сетевыми настройками контейнеров. Это может быть связано с сетевым плагином (например, flannel):
- Убедитесь, что сетевой плагин правильно установлен и настроен. Если вы используете flannel, выполните следующие действия:
- Убедитесь, что flannel установлен, и его Pods запускаются без ошибок.
- Проверьте конфигурацию flannel. В частности, обратите внимание на IP-адреса и CIDR. Если сеть конфликтует с существующими сетевыми настройками, это приведет к сбоям.
4. Проверка состояния контейнеров
Согласно вашей команде docker ps -a
, на вашем узле нет запущенных контейнеров. Это может быть связано с тем, что kubelet не может запускать Pods, как вы и описали:
- Убедитесь, что Docker правильно работает на вашем хосте. Попробуйте перезагрузить сервис Docker с помощью:
sudo systemctl restart docker
- Проверьте, что все зависимости установлены и правильно сконфигурированы. Для Kubernetes часто необходимы cgroup и другие системные настройки, которые могут влиять на производительность kubelet.
5. Обновление и совместимость
Программное обеспечение Kubernetes и Docker должно быть совместимым по версиям:
- Убедитесь, что используемые версии Kubernetes и Docker совместимы. Иногда новые версии могут вносить изменения, которые приводят к несовместимости.
Заключение
Исходя из представленного, необходимо проверить настройки доступа через API, исправить конфигурацию kubelet, убедиться в работоспособности сетевого плагина и корректности работы Docker. Если все вышеперечисленные шаги не решают проблему, стоит рассмотреть возможность переустановки компонентов кластера, чтобы устранить потенциальные ошибки установки.