From f9874afb2b1d5dfb3892f33d92b873b4530fbb1d Mon Sep 17 00:00:00 2001 From: emelinda Date: Sun, 9 Aug 2026 11:27:34 +0300 Subject: [PATCH] =?UTF-8?q?Istio:=20=D0=B6=D0=B4=D0=B0=D1=82=D1=8C=20?= =?UTF-8?q?=D0=B3=D0=BE=D1=82=D0=BE=D0=B2=D0=BD=D0=BE=D1=81=D1=82=D0=B8=20?= =?UTF-8?q?sidecar=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B4=20=D1=81=D1=82=D0=B0?= =?UTF-8?q?=D1=80=D1=82=D0=BE=D0=BC=20=D0=BF=D1=80=D0=B8=D0=BB=D0=BE=D0=B6?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Envoy перехватывает исходящий трафик через iptables-правила, которые ставит init-контейнер istio-init. Правила появляются раньше, чем envoy начинает слушать, поэтому приложение, дёрнувшее сеть в первые секунды, получает не таймаут, а connection refused — пакет уже завёрнут на порт envoy, а там ещё никого нет. Так падал workflows-api: контейнер стартовал и умирал в ту же секунду, INFO Starting workflows migrations INFO init database connection... FATAL [dial tcp 10.43.195.4:5432: connect: connection refused] при restartCount=0 у istio-proxy. Со второй попытки envoy успевал, и дальше всё работало — то есть симптомом был ровно один рестарт на старте, который легко списать на случайность. Настройка сделана на уровне mesh, а не аннотацией на поде: уязвимы все, кто ходит в БД или брокер сразу при запуске, а это почти каждый бэкенд контура — django катит migrate первым делом, celery подключается к rabbitmq, workspaces-api и engine-low к postgres. Они не падали не потому, что устроены иначе, а потому что успевали. Цена — каждый под стартует на время готовности envoy дольше, обычно секунду-две: istio добавляет в sidecar postStart-хук, блокирующий запуск остальных контейнеров. На Job'ы не влияет, у них инжекция отключена. Действует в момент инжекции, поэтому на уже запущенные поды не распространяется — хук появится при следующем пересоздании. --- .../istio-pilot/aero/istio-pilot.yaml | 44 +++++++++++++++++++ .../istio-pilot/aero/kustomization.yaml | 3 ++ 2 files changed, 47 insertions(+) create mode 100644 infrastructure/istio-pilot/aero/istio-pilot.yaml diff --git a/infrastructure/istio-pilot/aero/istio-pilot.yaml b/infrastructure/istio-pilot/aero/istio-pilot.yaml new file mode 100644 index 0000000..c5d5ece --- /dev/null +++ b/infrastructure/istio-pilot/aero/istio-pilot.yaml @@ -0,0 +1,44 @@ +# Ожидание готовности sidecar'а перед стартом приложения. +# +# ЗАЧЕМ. Envoy перехватывает исходящий трафик пода через iptables-правила, +# которые ставит init-контейнер istio-init. Правила появляются РАНЬШЕ, чем +# сам envoy начинает слушать, и приложение, дёрнувшее сеть в первые секунды, +# получает не таймаут, а connection refused: пакет уже завёрнут на порт +# envoy, а там ещё никого нет. +# +# Так падал workflows-api: контейнер стартовал и умирал в ту же секунду — +# INFO Starting workflows migrations +# INFO init database connection... +# FATAL [dial tcp 10.43.195.4:5432: connect: connection refused] +# при restartCount=0 у istio-proxy. Kubernetes перезапускал его, со второй +# попытки envoy успевал подняться, и дальше всё работало. То есть симптом — +# ровно один рестарт на старте, легко принимаемый за случайность. +# +# ПОЧЕМУ НА УРОВНЕ MESH, А НЕ АННОТАЦИЕЙ НА ПОДЕ. Уязвимы все, кто ходит в +# БД или брокер сразу при запуске, а это почти каждый бэкенд контура: +# django катит migrate первым делом, celery подключается к rabbitmq, +# workspaces-api и engine-low — к postgres. Они не падали не потому, что +# устроены иначе, а потому что успевали. Чинить это по одному поду — +# значит ждать, пока каждый однажды не повезёт. +# +# ЦЕНА. Каждый под стартует на время готовности envoy дольше (обычно 1-2 с): +# istio добавляет в sidecar postStart-хук, который блокирует запуск +# остальных контейнеров. Для контура это несопоставимо дешевле, чем +# ложные падения на старте. +# +# На Job'ы не влияет: у всех, что есть в контуре, инжекция отключена +# аннотацией sidecar.istio.io/inject: "false" — иначе envoy не давал бы им +# завершиться. +# +# Настройка действует В МОМЕНТ ИНЖЕКЦИИ, поэтому на уже запущенные поды не +# распространяется: хук появится у них при следующем пересоздании. +apiVersion: helm.toolkit.fluxcd.io/v2 +kind: HelmRelease +metadata: + name: istiod + namespace: istio-system +spec: + values: + meshConfig: + defaultConfig: + holdApplicationUntilProxyStarts: true diff --git a/infrastructure/istio-pilot/aero/kustomization.yaml b/infrastructure/istio-pilot/aero/kustomization.yaml index 736651a..fe2474c 100644 --- a/infrastructure/istio-pilot/aero/kustomization.yaml +++ b/infrastructure/istio-pilot/aero/kustomization.yaml @@ -3,3 +3,6 @@ apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization resources: - ../base +patches: + # holdApplicationUntilProxyStarts — обоснование в шапке файла. + - path: istio-pilot.yaml