Развертывания Kubernetes (K8s) часто создают проблемы с различных точек зрения, включая модули, сервисы, вход, не отвечающие кластеры, плоскости управления и настройку высокой доступности. Модуль Kubernetes — это наименьшая развертываемая единица в экосистеме Kubernetes, инкапсулирующая один или несколько контейнеров, которые совместно используют ресурсы и сети. Модули предназначены для запуска одного экземпляра приложения или процесса, создаются и удаляются по мере необходимости. Модули необходимы для масштабирования, обновления и поддержки приложений в среде K8s.
Перевод с книги Master Kubernetes Pods: Advanced Troubleshooting Strategies , автор Нет.
В этой статье рассматриваются проблемы, с которыми сталкиваются модули Kubernetes, и шаги по устранению неполадок, которые необходимо предпринять. Некоторые сообщения об ошибках, возникающие при запуске модулей Kubernetes, включают:
- ИзображениеPullBackoff
- ErrImagePull
- Неверное имя изображения
- CrashLoopBackOff
Иногда вы даже не столкнетесь с перечисленными ошибками, но все равно обнаружите, что ваш модуль выходит из строя. Во-первых, важно отметить, что при отладке любого ресурса Kubernetes вы должны понимать справочник API . В нем объясняется, как определяются различные API Kubernetes и как работают несколько объектов в модуле/развертывании. Документация четко определена в справочнике по API на сайте Kubernetes . В этом случае при отладке модуля выберите объект модуля из справочника API, чтобы узнать больше о том, как работает модуль. Он определяет поля, которые входят в модуль, а именно версию, тип, метаданные, спецификацию и статус. Kubernetes также предоставляет шпаргалку с руководством по необходимым командам.
предпосылки
В этой статье предполагается, что у читателей есть следующие условия:
- Вид установлен для демонстрации сценария
- Среднее понимание архитектуры Kubernetes.
- Инструмент командной строки Kubectl
Ошибка модуля Kubernetes — ImagePullBackoff
Эта ошибка появляется по трем разным причинам:
- Неверное изображение
- Неверный тег
- Неверные разрешения
Такие ситуации возникают, когда у вас нет правильной информации об изображении. У вас также может не быть разрешения на получение изображения из его репозитория (частного репозитория). Чтобы продемонстрировать это в примере ниже, мы создаем развертывание nginx:
➜ ~ kubectl create deploy nginx --image=nginxdeployment.apps/nginx created
После запуска пода получите его имя:
➜ ~ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-8f458dc5b-hcrsh 1/1 Running 0 100s
Скопируйте имя работающего модуля и получите о нем дополнительную информацию:
➜ ~ kubectl describe pod nginx-8f458dc5b-hcrsh
Name: nginx-8f458dc5b-hcrsh
hable:NoExecute op=Exists for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 2m43s default-scheduler Successfully assigned default/nginx-8f458dc5b-hcrsh to k8s-troubleshooting-control-plane
Normal Pulling 2m43s kubelet Pulling image "nginx"
Normal Pulled 100s kubelet Successfully pulled image "nginx" in 1m2.220189835s
Normal Created 100s kubelet Created container nginx
Normal Started 100s kubelet Started container nginx
Изображение успешно извлечено. Ваш модуль Kubernetes работает без ошибок.
Чтобы продемонстрировать ImagePullBackoff, отредактируйте YAML-файл развертывания и укажите несуществующее изображение:
➜ kubectl edit deploy nginx
containers:
-image: nginxdoestexist
imagePullPolicy: Always
name: nginx
Новый модуль не был успешно развернут.
➜ ~ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-5b847fdb95-mx4pq 0/1 ErrImagePull 0 3m40s
nginx-8f458dc5b-hcrsh 1/1 Running 0 38m
Отображается ошибка ImagePullBackoff
➜ ~ kubectl describe pod nginx-6f46cbfbcb-c92bl
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 88s default-scheduler Successfully assigned default/nginx-6f46cbfbcb-c92bl to k8s-troubleshooting-control-plane
Normal Pulling 40s (x3 over 88s) kubelet Pulling image "nginxdoesntexist"
Warning Failed 37s (x3 over 85s) kubelet Failed to pull image "nginxdoesntexist": rpc error: code = Unknown desc = failed to pull and unpack image "docker.io/library/nginxdoesntexist:latest": failed to resolve reference "docker.io/library/nginxdoesntexist:latest": pull access denied, repository does not exist or may require authorization: server message: insufficient_scope: authorization failed
Warning Failed 37s (x3 over 85s) kubelet Error: ErrImagePull
Normal BackOff 11s (x4 over 85s) kubelet Back-off pulling image "nginxdoesntexist"
Warning Failed 11s (x4 over 85s) kubelet Error: ImagePullBackOff
Ошибка модуля Kubernetes — образ был получен, но модуль находится в состоянии ожидания.
Каждый раз, когда вы запускаете K8s в производственной среде, администратор K8s выделяет квоты ресурсов для каждого пространства имен на основе требований пространств имен, работающих в кластере. Пространства имен используются для логического разделения внутри кластера.
Ошибка «Изображение получено, но модуль все еще находится в режиме ожидания» выдается, когда спецификации в квоте ресурсов не соответствуют минимальным требованиям приложения в модуле. В следующем примере создайте пространство имен под названием «Платежи»:
➜ ~ kubectl create ns payments
namespace/payments created
Создавайте квоты ресурсов, используя соответствующие спецификации.
➜ ~ cat resourcequota.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
name: compute-resources
spec:
hard:
requests.cpu: "1"
requests.memory: 1Gi
limits.cpu: "2"
limits.memory: 4Gi
Назначать квоты ресурсов для платежей за пространство имен.
➜ ~ kubectl apply -f resourcequota.yaml -n paymentsresourcequota/compute-resources created
Создана квота ресурсов/вычислительные ресурсы
Создайте новое развертывание в пространстве имен с ограничениями квоты ресурсов:
kubectl create deploy nginx --image=nginx -n paymentsdeployment.apps/nginx created
Хотя развертывание было создано успешно, подов не существует:
➜ ~ kubectl get pods -n payments
No resources found in payments namespace
Развертывание создано, но нет готовых модулей, нет модулей для обновления и нет доступных модулей:
➜ ~ kubectl get deploy -n payments
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 0/1 0 0 7m4s
Для дальнейшей отладки опишите развертывание nginx. Не удалось создать модуль:
➜ ~ kubectl describe deploy nginx -n payments
Name: nginx
Namespace: payments
CreationTimestamp: Wed, 24 May 2023 21:37:55 +0300
Labels: app=nginx
Annotations: deployment.kubernetes.io/revision: 1
Selector: app=nginx
Replicas: 1 desired | 0 updated | 0 total | 0 available | 1 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=nginx
Containers:
nginx:
Image: nginx
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available False MinimumReplicasUnavailable
ReplicaFailure True FailedCreate
Progressing False ProgressDeadlineExceeded
OldReplicaSets: <none>
NewReplicaSet: nginx-8f458dc5b (0/1 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 10m deployment-controller Scaled up replica set nginx-8f458dc5b to 1
Дальнейший анализ событий Kubernetes выявил недостаток памяти, необходимой для создания Pod.
➜ ~ kubectl get events --sort-by=/metadata.creationTimestamp
Эта ошибка возникает, когда ваш образ успешно получен и контейнер создан, но ваша конфигурация среды выполнения не удалась. Например, если у вас есть работающее приложение Python, которое пытается выполнить запись в несуществующую папку или не имеет разрешения на запись в эту папку. Первоначально приложение выполняется, а затем обнаруживает ошибку. Если в логике вашего приложения произойдет паника, контейнер остановится. Контейнер перейдет в CrashLoopBackOff. В конце концов вы замечаете, что в развертывании нет подов, т. е. под есть, но он не запущен и выдает ошибку CrashLoopbackoff.
Проверка работоспособности и готовности не удалась
Обнаружение жизнеспособности определяет, вошел ли под в поврежденное состояние и больше не может предоставлять трафик. Kubernetes перезапустит под для вас. Тесты готовности проверяют, готово ли ваше приложение обрабатывать трафик. Проверка готовности гарантирует, что ваше приложение извлекает всю необходимую конфигурацию из карты конфигурации и запускает свои потоки. Только после завершения этого процесса ваше приложение будет готово к приему трафика. Если ваше приложение обнаружит ошибку во время этого процесса, оно также войдет в CrashLoopBackoff.
Начните устранять неполадки!
В этой статье представлен обзор методов устранения неполадок для модулей Kubernetes Pod. В нем рассматриваются распространенные ошибки, возникающие при развертывании модулей Pod, и предлагаются практические решения для их устранения. Он также предоставляет информацию о справочных страницах и шпаргалках, которые имеют решающее значение для понимания того, как работает Kubernetes, а также для эффективного выявления и решения проблем. Следуя рекомендациям, представленным в этой статье, читатели смогут улучшить свои навыки устранения неполадок и упростить развертывание и управление своими модулями Kubernetes.
Я решил отказаться от открытого исходного кода Hongmeng Ван Чэнлу, отец Hongmeng с открытым исходным кодом: Hongmeng с открытым исходным кодом — единственное мероприятие в области промышленного программного обеспечения, посвященное архитектурным инновациям в области базового программного обеспечения в Китае: выпущен OGG 1.0, Huawei предоставляет весь исходный код. Google Reader уничтожен «горой кодового дерьма» Официально выпущена Ubuntu 24.04 LTS Перед официальным выпуском Fedora Linux 40 разработчики Microsoft: производительность Windows 11 «смехотворно плоха», Ма Хуатэн и Чжоу Хунъи пожимают друг другу руки, «устраняя обиды» Известные игровые компании издали новые правила: свадебные подарки сотрудникам не должны превышать 100 000 юаней. Pinduoduo был осужден за недобросовестную конкуренцию. Компенсация в размере 5 миллионов юаней.Эта статья была впервые опубликована на Yunyunzhongsheng ( https://yylives.cc/ ), приглашаем всех посетить ее.