Как получить собственный путь проверки работоспособности в балансире GCE L7, обслуживающем вход Kubernetes?
Я пытаюсь развернуть экземпляр grafana внутри Kubernetes (сервер 1.6.4) в GCE. Я использую следующие манифесты:
Развертывание ( полная версия):
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: grafana
spec:
replicas: 1
template:
metadata:
labels:
name: grafana
spec:
initContainers:
…
containers:
- name: grafana
image: grafana/grafana
readinessProbe:
httpGet:
path: /login
port: 3000
…
Сервис:
apiVersion: v1
kind: Service
metadata:
name: grafana
spec:
selector:
name: grafana
ports:
- protocol: TCP
port: 3000
type: NodePort
Вход:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: grafana
spec:
tls:
- secretName: grafana.example.com
backend:
serviceName: grafana
servicePort: 3000
Оказывается, графана служит 302 на /
но по умолчанию проверка здоровья входа GCE ожидает 200 на /
( источник). Как вы можете видеть, в Deployment есть пользовательский индикатор готовности (строка 22).
Как только я размещаю эти ресурсы на kube-apiserver, все создается без ошибок. Конкретно, Ingress получает публичный IP4-адрес, но healtcheck настроен по умолчанию /
путь вместо пользовательского, настроенного в readinessProbe
, Из-за этого я получаю 502, если я curl
публичный IP4-адрес Ingress.
Проблема устраняется путем ручного изменения пути зонда на /login
в консоли GCE.
4 ответа
Цитирую отсюда:
GLBC требует, чтобы вы определили порт (в вашем случае 3000) в спецификации Pod.
Решение состоит в том, чтобы объявить порт, используемый для проверки работоспособности, в ports
помимо добавления кастома readinessProbe
:
containers:
- name: grafana
readinessProbe:
httpGet:
path: /login
port: 3000
ports:
- name: grafana
containerPort: 3000
…
Настройка проверки здоровья
С аддоном GLBC
Это не совсем понятно из вашего вопроса, но если вы используете GCE Load-Balancer Controller (GLBC) Cluster Addon
, вы можете настроить путь проверки работоспособности.
В настоящее время все служебные серверы должны удовлетворять одному из следующих требований для прохождения проверок работоспособности HTTP(S), отправленных ему из loadbalancer GCE:
- Ответить с
200
на'/'
, Содержание не имеет значения.- Выставьте произвольный URL-адрес в качестве проверки готовности на бобах, поддерживающих Сервис.
Контроллер Ingress сначала ищет совместимый тест готовности, если он его находит, он принимает его в качестве проверки работоспособности HTTP(S) нагрузочного балансировщика GCE. Если тест готовности отсутствует или для теста готовности требуются специальные заголовки HTTP, контроллер Ingress указывает проверку работоспособности HTTP балансировщика нагрузки GCE на "/". Это пример Ingress, который использует проверку готовности от конечных точек в качестве проверки работоспособности.
Страница аддона GLBC упоминает об этом в разделе " Ограничения":
Все услуги Kubernetes должны обслуживать
200
страница на'/'
или любое другое пользовательское значение, указанное вами в GLBC--health-check-path
аргумент.
Без аддона GLBC
Если вы не используете аддон, в настоящее время Kubernetes требует от вас служить 200
за GET
запросы на /
путь для успешных проверок работоспособности, в противном случае серверная часть не будет получать трафик.
В этой ошибке есть немного предыстории.
Google Container Engine (GKE)
Если вы работаете с Google Container Engine (GKE), там применяются те же требования Kubernetes по умолчанию для проверки работоспособности.
Услуги, предоставляемые через Ingress, должны служить ответом
HTTP 200
статус наGET
запросы на/
дорожка. Это используется для проверки здоровья. Если ваше приложение не обслуживаетсяHTTP 200
на/
, серверная часть будет помечена как нездоровая и не будет получать трафик.
Ответьте на свой реальный вопрос
Сказав все это, как вы (@mmoya) указали в своем ответе, добавление того же порта, который используется для проверки готовности, в качестве одного из портов в модуле, устраняет проблему для вашего случая, поскольку сам порт не отображается снаружи стручок в противном случае. Это заставило Kubernetes полагаться на проверку здоровья от /
вместо.
условия предполагаемых проверок работоспособности при создании Ingress:
Ingress backend.servicePort ссылается на порт службы, соответствующий Pods spec.containers[].readinessProbe.httpGet.port, а targetPort службы ссылается на контейнеры обслуживающего Pod[].spec.ports.containerPort.
В середине 2020 года GKE представил аннотацию и настраиваемое определение ресурса.
BackendConfig
чтобы явно настроить проверки работоспособности, см. концепты / ingress#health_checks.
Предупреждение: если вы снова измените readinessProbe, при предполагаемых проверках работоспособности GKE не синхронизирует зонд готовности и проверку работоспособности . Он будет снова выведен только при (повторном) создании Ingress.
Чтобы напрямую редактировать проверки работоспособности внешних балансировщиков нагрузки (для настраиваемого пути http), используйте
gcloud compute backend-services list
gcloud compute backend-services get-health BACKEND_SERVICE_NAME --global
gcloud compute health-checks describe
gcloud compute health-checks update http BACKEND_SERVICE_NAME --request-path=/api/health
Это работает на 1.9. Установка
httpHeaders
также устраняет необходимость добавления дополнительного имени хоста в
ALLOWED_HOSTS
параметр.
readinessProbe:
httpGet:
path: /login
port: 3000 # Must be same as containerPort
httpHeaders:
- name: Host
value: yourdomain.com