Как определить, действительно ли приложение Kubernetes «готово»?

#kubernetes

#kubernetes

Вопрос:

У меня есть веб-приложение в Kubernetes, которое «запускается» с помощью действий пользователя. Это действие пользователя запускает сценарий python, который применяет развертывание, сервис и вход. Интерфейс показывает счетчик, пока приложение не будет готово к подключению. В настоящее время я проверяю статус развертывания и проверяю, что статус «Доступно» равен «True», после чего я скрываю счетчик и загружаю приложение.

Проблема в том, что время от времени пользователи будут испытывать 503: Temporarily Unavailable ошибку. Быстрое обновление браузера устраняет проблему, так что, похоже, это какое-то условие гонки.

Мой вопрос в том, почему я получаю ошибку 503, если развертывание помечено как «Доступное»? Означает ли это, что инициализация входа или службы иногда занимает больше времени?

В настоящее время у меня есть следующие тесты в контейнере приложений моего развертывания:

       readinessProbe:
        httpGet:
          path: /
          port: 3000
          periodSeconds: 5
          initialDelaySeconds: 5
      livenessProbe:
        httpGet:
          path: /
          port: 3000
          periodSeconds: 5
          initialDelaySeconds: 5
  

Я использую Azure AKS и ingress-nginx .

Комментарии:

1. Отсутствует контекст: какой CNI вы используете, какой вход?

2. Я использую Azure AKS и ingress-nginx

3. Можно ли проверить статус модуля при следующем (или вместо этого) развертывании? Кроме того, ingress может обновляться не мгновенно, поэтому вы можете сделать вывод, что служба запущена и запущена только через 5 секунд после успешной проверки работоспособности. История изменений также доступна через k8s api.

4. В настоящее время я проверяю статус развертывания. Если условие «Доступно» равно «True», я предполагаю, что приложение готово принимать подключения. Есть ли лучший способ вручную выполнить «проверку работоспособности» через API?

5. возможно, связано — github.com/kubernetes/ingress-nginx/issues/4469

Ответ №1:

Для вновь созданных развертываний проверьте это. Оба должны быть истинными, порядок не имеет значения.

  • kubectl get deployment <name> -ojson | jq ".status.availableReplicas" равно желаемому или >= 1 , по вашему усмотрению.
  • kubectl get ingress <name> -ojson | jq ".status.loadBalancer" не пусто. Это означает, что контроллер ingress инициализирован для вашего хоста.

Для обновленных развертываний (все, что требовало воссоздания модулей). Оба должны быть истинными, порядок не имеет значения.

  • kubectl get deployment <name> -ojson | jq ".status.availableReplicas" равно желаемому.

  • kubectl get deployment <name> -ojson | jq ".status.updatedReplicas" равно желаемому.

    Вход уже будет инициализирован здесь.

Комментарии:

1. Разве этого недостаточно для проверки .conditions type="Available" ?

2. Оно точно не будет включать статус входа. И я не уверен в потоке обновлений, он может быть доступен постоянно, потому что все время будут исправные модули, но с более старой версией или смешанным старым / новым одновременно.

3. Что я опубликовал, так это 1. Гарантированная готовность к приему трафика. 2. Гарантируется, что все версии обновлены и готовы к приему трафика.