У нас есть HTTP (s) Load Balancer , созданный входом kubernetes, который указывает на бэкэнд, образованный набором модулей, запускающих nginx и Ruby on Rails.
Взглянув на журналы балансировки нагрузки, мы обнаружили растущее число запросов с кодом ответа 0
и statusDetails
= client_disconnected_before_any_response
.
Мы пытаемся понять, почему это произошло, но мы не нашли ничего подходящего. В журналах доступа или ошибок nginx ничего нет.
Это происходит для нескольких типов запросов, от GET до POST.
Мы также подозреваем, что иногда, несмотря на то, что запрос регистрируется с этой ошибкой, запросы фактически передаются бэкэнду. Например, мы видим ошибки PG :: UniqueViolation из-за того, что идентичные запросы на регистрацию дважды отправляются на сервер в нашей конечной точке регистрации.
Буду признателен за любую помощь. Спасибо!
ОБНОВЛЕНИЕ 1
По запросу вот файл yaml для входного ресурса:
ОБНОВЛЕНИЕ 2
Я создал метрику Stackdriver на основе журнала, чтобы подсчитать количество запросов, которые представляют это поведение. Вот диаграмма:
Большие пики приблизительно соответствуют отметке времени для этих событий kubernetes:
Полная ошибка: Readiness probe failed: Get http://10.48.1.28:80/health_check: net/http: request canceled (Client.Timeout exceeded while awaiting headers)"
Так что иногда кажется, что проверка готовности стручков за бэкэндом не удается, но не всегда.
Вот определение готовностиProbe
readinessProbe:
failureThreshold: 3
httpGet:
httpHeaders:
- name: X-Forwarded-Proto
value: https
- name: Host
value: [redacted]
path: /health_check
port: 80
scheme: HTTP
initialDelaySeconds: 1
periodSeconds: 30
successThreshold: 1
timeoutSeconds: 5