Мастер устранения неполадок KUBERNETES POD: расширенные стратегии и сценарии

Развертывания 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.

Эта статья была впервые опубликована на Yunyunzhongsheng ( https://yylives.cc/ ), приглашаем всех посетить ее.

Я решил отказаться от открытого исходного кода Hongmeng Ван Чэнлу, отец Hongmeng с открытым исходным кодом: Hongmeng с открытым исходным кодом — единственное мероприятие в области промышленного программного обеспечения, посвященное архитектурным инновациям в области базового программного обеспечения в Китае: выпущен OGG 1.0, Huawei предоставляет весь исходный код. Google Reader уничтожен «горой кодового дерьма» Официально выпущена Ubuntu 24.04 LTS Перед официальным выпуском Fedora Linux 40 разработчики Microsoft: производительность Windows 11 «смехотворно плоха», Ма Хуатэн и Чжоу Хунъи пожимают друг другу руки, «устраняя обиды» Известные игровые компании издали новые правила: свадебные подарки сотрудникам не должны превышать 100 000 юаней. Pinduoduo был осужден за недобросовестную конкуренцию. Компенсация в размере 5 миллионов юаней.
{{o.name}}
{{м.имя}}

рекомендация

отmy.oschina.net/u/6919515/blog/11054466