#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. Гарантируется, что все версии обновлены и готовы к приему трафика.