Рейтинг:0

Google LB время от времени не удавалось проверить работоспособность модулей ingress-nginx.

флаг cn

Прошли недели с тех пор, как у меня много тайм-аутов, когда gcp lbs проверяет ingress-nginx healthz, в то время как все отвечает правильно.

У меня есть кластер GKE с Container Optimized OS и n1-standard-4 в качестве машины и версии kubernetes. v1.21.10-gke.2000.

Вот мои узлы:

kubectl топ нет
НАЗВАНИЕ CPU(ядер) CPU% MEMORY(bytes) MEMORY%   
gke-xxx-gke-cluster0-xxx-gke-cluster0-0a2ef32c-6lj0 821m 20% 3683Mi 29%       
gke-xxx-gke-cluster0-xxx-gke-cluster0-98567a10-pqk2 2302m 58% 4983Mi 40%       
gke-xxx-gke-cluster0-xxx-gke-cluster0-cd892740-3v6m 83m 2% 852Mi 6%        

Вот мои модули и сервисы ingress-nginx:

ИМЯ ГОТОВ СТАТУС ПЕРЕЗАПУСКА ВОЗРАСТ
pod/nginx-ingress-controller-fnxlc 1/1 Работает 0 65 м
pod/nginx-ingress-controller-m4nq2 1/1 Работает 0 67 м
pod/nginx-ingress-controller-tb4gc 1/1 Работает 0 66 м

НАЗВАНИЕ ТИП КЛАСТЕР-IP ВНЕШНИЙ-IP ПОРТ(Ы) ВОЗРАСТ
service/nginx-ingress-controller NodePort УДАЛЕНО <нет> 80:32080/TCP, 443:32443/TCP 69d
service/nginx-ingress-controller-metrics ClusterIP REDACTED <none> 10254/TCP 69d

Вот мои значения руля для ngress-nginx/вход-nginx версия 4.1.0:

  входной классресурс:
    имя: нгинкс
    включено: правда
    по умолчанию: ложь
    значение контроллера: "k8s.io/ingress-nginx"

  вид: DaemonSet

  живостьзонд:
    httpПолучить:
      путь: "/healthz"
      порт: 10254
      схема: HTTP
    начальные секунды задержки: 10
    периодСекунды: 10
    таймаутСекунды: 1
    Порог успеха: 1
    порог отказа: 5
  готовностьзонд:
    httpПолучить:
      путь: "/healthz"
      порт: 10254
      схема: HTTP
    начальные секунды задержки: 10
    периодСекунды: 10
    таймаутСекунды: 1
    Порог успеха: 1
    порог отказа: 3
  podАннотации:
    prometheus.io/scrape_metrics_app: «правда»
    prometheus.io/scrape_metrics_port_app: "10254"
    prometheus.io/scrape_metrics_port_name_app: метрики
  Ресурсы:
    Запросы:
      процессор: 100 м
      память: 120Ми

  оказание услуг:
    включено: правда

    аннотации:
      cloud.google.com/backend-config: '{"ports": {"80":"security-policy"}}'

    целевые порты:
      http: http
      https: https

    тип: NodePort
    порты узлов:
      http: 32080
      https: 32443
      TCP:
        8080: 32808

  показатели:
    порт: 10254
    # если этот порт изменен, измените healthz-port: в extraArgs: соответственно
    включено: правда
  PriorityClassName: nginx-вход

  допускВебхуки:
    включено: ложь
    пластырь:
      PriorityClassName: nginx-вход

Моя конфигурация бэкенда:

---
apiVersion: планирование.k8s.io/v1
вид: PriorityClass
метаданные:
  имя: nginx-вход
стоимость: 1000000
globalDefault: ложь
---
Версия API: cloud.google.com/v1
вид: BackendConfig
метаданные:
  имя: политика безопасности
спецификация:
  таймаутСек: 60
  соединениеСлив:
    дренированиеTimeoutSec: 10
  политика безопасности:
    название: "УДАЛЕНО"
  проверка состояния здоровья:
    чекинтервалсек: 10
    таймаутСек: 5
    здоровыйПорог: 1
    нездоровый порог: 2
    порт: 32080
    тип: HTTP
    Путь запроса: /healthz
---
Версия API: networking.k8s.io/v1
вид: Вход
метаданные:
  имя: nginx-ingress-controller-gke
  аннотации:
    kubernetes.io/ingress.global-static-ip-name: «УДАЛЕНО»
    kubernetes.io/ingress.class: «gce»
спецификация:
  ingressClassName: nginx
  по умолчаниюБэкэнд:
    оказание услуг:
      имя: nginx-вход-контроллер
      порт:
        номер: 80

Мое правило брандмауэра:

позволил:
- IP-протокол: TCP
  порты:
  - '32080'
  - «80»
временная метка создания: «УДАЛЕНО»
описание: ''
направление: ВХОД
отключено: ложь
идентификатор: 'ОТРЕДАКТИРОВАНО'
вид: вычислить # брандмауэр
логКонфиг:
  включить: ложь
имя: УДАЛЕНО-allow-i-google-gke-health
сеть: https://www.googleapis.com/compute/v1/projects/REDACTED/global/networks/REDACTED
приоритет: 1000
selfLink: https://www.googleapis.com/compute/v1/projects/REDACTED/global/firewalls/REDACTED-allow-i-google-gke-health
исходные диапазоны:
- 130.211.0.0/22
- 35.191.0.0/16
целевые сервисные аккаунты:
- УДАЛЕНО

Моя серверная служба ЗДОРОВА:

---
серверная часть: https://www.googleapis.com/compute/v1/projects/REDACTED/zones/europe-west1-b/instanceGroups/k8s-ig--REDACTED
положение дел:
  статус здоровья:
  - HealthState: ЗДОРОВЫЙ
    экземпляр: https://www.googleapis.com/compute/v1/projects/REDACTED/zones/europe-west1-b/instances/REDACTED
    IP-адрес: УДАЛЕНО
    порт: 32080
  вид: вычислить#backendServiceGroupHealth
---
серверная часть: https://www.googleapis.com/compute/v1/projects/REDACTED/zones/europe-west1-c/instanceGroups/k8s-ig--REDACTED
положение дел:
  статус здоровья:
  - HealthState: ЗДОРОВЫЙ
    экземпляр: https://www.googleapis.com/compute/v1/projects/REDACTED/zones/europe-west1-c/instances/REDACTED
    IP-адрес: УДАЛЕНО
    порт: 32080
  вид: вычислить#backendServiceGroupHealth
---
серверная часть: https://www.googleapis.com/compute/v1/projects/REDACTED/zones/europe-west1-d/instanceGroups/k8s-ig--REDACTED
положение дел:
  статус здоровья:
  - HealthState: ЗДОРОВЫЙ
    экземпляр: https://www.googleapis.com/compute/v1/projects/REDACTED/zones/europe-west1-d/instances/REDACTED
    IP-адрес: УДАЛЕНО
    порт: 32080
  вид: вычислить#backendServiceGroupHealth

Мои целевые прокси http/https в порядке.

Проблема в том, что, начиная с GKE 1.21, у меня много времени ожидания проверки работоспособности от google lb:

{
  "insertId": "120vrdac2cf",
  "jsonПайлоад": {
    "healthCheckProbeResult": {
      "healthCheckProtocol": "HTTP",
      "healthState": "НЕЗДОРОВО",
      "previousHealthState": "ЗДОРОВЫЙ",
      "probeResultText": "Ответ HTTP: , Ошибка: время ожидания подключения истекло",
      "probeSourceIp": "35.191.13.216",
      "ipAddress": "УДАЛЕНО",
      "probeCompletionTimestamp": "2022-04-27T15:40:52.868912018Z",
      "previousDetailedHealthState": "ЗДОРОВО",
      "targetIp": "УДАЛЕНО",
      "detailedHealthState": "ТАЙМ-АУТ",
      "responseLatency": "5.001074s",
      "целевой порт": 32080,
      "probeRequest": "/здоровьез"
    }
  },
  "ресурс": {
    "тип": "gce_instance_group",
    "метки": {
      "instance_group_name": "k8s-ig--d350a72156e88e7d",
      "instance_group_id": "7274987390644036118",
      "местоположение": "europe-west1-c",
      "project_id": "УДАЛЕНО"
    }
  },
  "отметка времени": "2022-04-27T15:40:53.307035382Z",
  "серьезность": "ИНФОРМАЦИЯ",
  "logName": "projects/REDACTED/logs/compute.googleapis.com%2Fhealthchecks",
  "receiveTimestamp": "2022-04-27T15:40:54.568716762Z"
}

Вот скриншот всех ошибок: ошибки проверки работоспособности

У меня нет проблем с брандмауэром. С узла нет проблем с проверкой работоспособности: пока верно; do curl -m 2 -o /dev/null -sw "%{http_code} %{time_total}s\n" 0:32080/healthz; сделано

200 0,000984 с
200 0,000845 с
200 0,000704 с
200 0,002411 с
200 0,001235 с
200 0,000784 с
200 0,001471 с
200 0,000498 с

HTTP-ответ всегда равен 200. Все это означает, что и gke, и стручки здоровы. Если модули не были исправны, у меня будет несколько перезапусков, которых у меня вообще нет. Мои проверки работоспособности модулей всегда отвечают за миллисекунды.

Но по какой-то неизвестной причине у меня много проблем с проверкой работоспособности. Время ожидания подключения которые вызывают проблемы с трафиком на моем сайте.

Во время отладки у меня нет трафика на моем сайте.

Я не помню, чтобы у меня были проблемы с GKE. 1.19/1.20. Я, конечно, пробовал много версий 1.21, но все равно не повезло.

Я перешел с ingress-nginx 4.0.16 к 4.1.0 но проблема все еще присутствует.

Я также увеличил интервал проверки работоспособности и время ожидания, но та же проблема.

Я подумал, что, может быть, nginx много раз перезагружает свою конфигурацию, но на самом деле это не так, потому что в журналах почти то же самое:

Контроллер nginx-ingress-controller-fnxlc I0427 16:10:38.352350 8 event.go:285] Событие (v1.ObjectReference {Вид: «Ingress», пространство имен: «nginx-ingress», имя: «nginx-ingress-controller- gke", UID: "45baf918-c5b9-499e-9930-b6e5d03aa38e", APIVersion: "networking.k8s.io/v1", ResourceVersion: "83550719", FieldPath: ""}): тип: "Нормальный" причина: ' Синхронизация запланирована для синхронизации

У кого-нибудь есть такая же проблема? Любая помощь?

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.