Я установил балансировщик нагрузки на GCP, используя Ingress в Kubernetes Engine.
Серверная служба по умолчанию регистрирует все экземпляры как неработоспособные. Я обновил проверку работоспособности до протокола HTTPS и URL-адреса / healthz, поскольку это URL-адрес для моей проверки работоспособности.
Я оставляю его в покое на пару минут, и серверная служба сообщает, что теперь все экземпляры исправны, а затем я вижу в журналах, что мой модуль обслуживает 200 ответов в / healthz.
Я перехожу на страницу, и она начинает показывать ошибку 502. Я возвращаюсь на страницу проверки работоспособности в консоли, и проверка работоспособности вернулась к HTTP в /.
Что заставило проверку работоспособности вернуться к HTTP? Вот журналы, показывающие, что в течение 10 минут проверка работоспособности продолжает запрашивать установленный мной https, затем запрос снова меняется на http.
...
[W 180621 20:02:35 iostream:1451] SSL Error on 9 ('10.128.0.14', 48346): [SSL: HTTP_REQUEST] http request (_ssl.c:833)
[W 180621 20:02:35 iostream:1451] SSL Error on 9 ('10.128.0.13', 63030): [SSL: HTTP_REQUEST] http request (_ssl.c:833)
[I 180621 20:02:43 web:2106] 200 GET /healthz (10.128.0.14) 0.75ms
[I 180621 20:02:43 web:2106] 200 GET /healthz (10.128.0.13) 0.80ms
[I 180621 20:02:43 web:2106] 200 GET /healthz (10.128.0.14) 0.74ms
...
[I 180621 20:05:46 web:2106] 200 GET /healthz (10.128.0.13) 1.26ms
[I 180621 20:05:46 web:2106] 200 GET /healthz (10.128.0.14) 0.63ms
[I 180621 20:05:46 web:2106] 200 GET /healthz (10.128.0.15) 0.64ms
[W 180621 20:05:46 iostream:1451] SSL Error on 9 ('10.128.0.14', 49971): [SSL: HTTP_REQUEST] http request (_ssl.c:833)
[W 180621 20:05:46 iostream:1451] SSL Error on 9 ('10.128.0.15', 62893): [SSL: HTTP_REQUEST] http request (_ssl.c:833)
[W 180621 20:05:48 iostream:1451] SSL Error on 9 ('10.128.0.13', 52191): [SSL: HTTP_REQUEST] http request (_ssl.c:833)
[W 180621 20:05:48 iostream:1451] SSL Error on 9 ('10.128.0.13', 60549): [SSL: HTTP_REQUEST] http request (_ssl.c:833)
РЕДАКТИРОВАТЬ: Я добавляю тест готовности для рассматриваемого модуля, к которому подключен вход.
readinessProbe:
httpGet:
port: 8902
scheme: HTTPS
path: /healthz
initialDelaySeconds: 5
periodSeconds: 10
successThreshold: 1
Я проверил, и он показывает предполагаемое поведение.
Kubernetes контролирует проверку работоспособности и настраивает ее на основе данных внутри кластера kubernetes. Kubernetes не видит никаких изменений, внесенных в проверку работоспособности через gcloud.
Поэтому я думаю, что это нормально, что он проверяет это, и любые изменения возвращаются.
Решение использовать готовность вместо.
Пожалуйста, посмотрите также на этот:
Проверки здоровья
В настоящее время все серверные службы служб должны удовлетворять любому из следующих требований для прохождения проверок работоспособности HTTP (S), отправленных им от балансировщика нагрузки GCE:
Ответьте 200 на '/'. Содержание значения не имеет.
Предоставьте произвольный URL-адрес в качестве проверки готовности модулей, поддерживающих Сервис.
Контроллер Ingress сначала ищет совместимый тест готовности, если он его находит, он принимает его в качестве проверки работоспособности HTTP (S) балансировщика нагрузки GCE. Если проверка готовности отсутствует или для проверки готовности требуются специальные заголовки HTTP, контроллер Ingress указывает проверку состояния HTTP балансировщика нагрузки GCE на '/'.
Я была такая же проблема.
Проблема заключалась в том, что мой readinessProbe был настроен только на HTTPS.
readinessProbe:
httpGet:
path: "/health?ready=1"
port: 8080
scheme: HTTPS
Однако бэкенды GCE автоматически предполагают, что ваши службы отвечают на HTTP, и по умолчанию будут сканировать там проверки работоспособности.
Вы можете узнать больше о GKE Ingress и о реакции Heath Checks. ВОТ
Чтобы исправить это, мне нужно было обновить мою службу, чтобы отвечать только HTTPS.
apiVersion: v1
kind: Service
metadata:
annotations:
cloud.google.com/app-protocols: '{"my-port-name":"HTTPS"}'
spec:
ports:
- port: 8080
targetPort: 8080
name: my-port-name
Это приводит к тому, что серверная служба, которую создает входящий поток, проверяет готовность Probes по HTTPS.
ПРИМЕЧАНИЕ. Обязательно отключите Ingress, LoadBalancer и HealthCheck, прежде чем делать это, а затем воссоздайте их, так как они не будут отвечать на обновления, примененные к вашей службе.
Похоже, что ваши серверные ВМ обслуживают только протокол HTTPS, но вы развернули Ingress
ресурс для протокола HTTP. Изменение конфигурации вручную после развертывания не является решением, поскольку мастер отменит изменения в соответствии с манифестом. Согласно этому документу вы можете защитить Ingress, указав секрет, содержащий закрытый ключ TLS и сертификат. В настоящее время Ingress поддерживает только один порт TLS, 443, и предполагает завершение TLS.