iac/apps/processing/aero/kustomization.yaml
emelinda 5efa1a5fd2 Processing: задачи не запускались из-за выключенного ENABLE_TOLERATION
Симптом: движок брал задачу и падал на её создании —
  ERROR create k8s job: create k8s job: unknown service
Ни одного пода при этом не создавалось.

Причина — моя правка. Я выставил ENABLE_TOLERATION=0, чтобы поды задач не
получали nodeSelector dedicated=processing на несуществующие выделенные
ноды. Но в движке ЭТОТ ЖЕ флаг управляет регистрацией классов ресурсов:

  if resCfg.EnableToleration {
      services[HighResources] = Service{...}
  }
  (pkg/kube_services/services.go)

Поэтому задача с service_request "high-resources" отваливалась не на
планировании, а раньше — на разборе, как неизвестный сервис. В логе при
этом ни слова про nodeSelector, связь с флагом неочевидна.

Вместо выключения флага селектор переведён на метку, которая есть на всех
трёх нодах контура, — kubernetes.io/os=linux. Класс сервисов остаётся
зарегистрированным, nodeSelector совпадает с любой нодой, toleration на
несуществующий taint безвреден. То же сделано для HIGH_MEM и PERSISTENT и
для DEFAULT_NODE_SELECTOR_*, которые раньше были пустыми строками.
Ресурсы не трогаем: в base это 1 CPU и 1Gi.

IGNORE_TAINTS_AND_NODE_SELECTOR, приехавший в base из master, для этого не
подходит: в исходниках workflows-engine такой переменной нет вовсе, образ
contour_3ef5b462 о ней не знает.
2026-08-09 23:00:31 +03:00

251 lines
12 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: processing
resources:
- ../base
patches:
# --- Состав: только api и engine-low ---------------------------------------
# engine удалён: в base у него replicaCount 0, то есть он и там выключен, а
# образ прибит к тегу с опечаткой в имени (workflows-endigne_prod). Рабочий
# обработчик — engine-low, он же на более свежем образе contour_*.
- target: {kind: HelmRelease, name: engine}
patch: |
$patch: delete
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: engine
namespace: processing
# frontend идёт из base без патчей. Адреса бэкендов вшиты в бандл на этапе
# сборки (константа __BUILD_ENV__), но сборка ugok2 обращается к тому же
# origin относительными путями — иначе в остальных кластерах не понадобился
# бы отдельный маршрут /workflows/api/ перед /workflows/. Поэтому фронтенд
# публикуется на домене платформы, а не на своём поддомене: маршруты в
# infrastructure/istio-config/aero, VirtualService platform.
# --- workflows-api ----------------------------------------------------------
- target: {kind: HelmRelease, name: workflows-api}
patch: |
# S3 приезжает из Vault отдельным ФАЙЛОМ, а не парой переменных:
# приложение читает по этому пути целый JSON. В base путь ведёт в
# /etc/sarex/yc-s3/, куда в контуре ничего не смонтировано.
- op: test
path: /spec/values/services/backend/envs/3/name
value: S3_SERVICE_ACCOUNT
- op: replace
path: /spec/values/services/backend/envs/3/value/_default
value: /vault/secrets/processing-s3
- op: add
path: /spec/values/services/backend/podAnnotations/_default/vault.hashicorp.com~1agent-inject-secret-processing-s3
value: secrets/data/minio/apps/processing
- op: add
path: /spec/values/services/backend/podAnnotations/_default/vault.hashicorp.com~1agent-inject-template-processing-s3
value: |-
{{- with secret "secrets/data/minio/apps/processing" -}}
{
"host": "{{ index .Data.data "host" }}",
"bucket": "{{ index .Data.data "bucket" }}",
"access_key_id": "{{ index .Data.data "access_key_id" }}",
"secret_access_key": "{{ index .Data.data "secret_access_key" }}",
"region": "{{ index .Data.data "region" }}",
"verify": false
}
{{- end -}}
# --- engine-low -------------------------------------------------------------
# Патчи адресуются по индексу, поэтому перед каждым replace идёт op: test на
# имя переменной. Если в base порядок envs изменится, сборка упадёт явно,
# вместо того чтобы молча перезаписать соседнее значение.
- target: {kind: HelmRelease, name: engine-low}
patch: |
# Sentry — внешний домен, из контура недостижим. Значение прокидывается
# ещё и в каждый под задачи, поэтому зануляем в одном месте.
- op: test
path: /spec/values/services/backend/envs/2/name
value: WORKFLOWS_SENTRY_DSN
- op: replace
path: /spec/values/services/backend/envs/2/value/_default
value: ""
# В base адрес django неверный даже для кластеров, где он есть: сервис
# называется backend-svc и слушает 80, а не backend:8000. У api то же
# значение уже правильное.
- op: test
path: /spec/values/services/backend/envs/5/name
value: DJANGO_HOST
- op: replace
path: /spec/values/services/backend/envs/5/value/_default
value: http://backend-svc.django.svc.cluster.local:80
# S3 — как у api выше.
- op: test
path: /spec/values/services/backend/envs/6/name
value: S3_SERVICE_ACCOUNT
- op: replace
path: /spec/values/services/backend/envs/6/value/_default
value: /vault/secrets/processing-s3
# SMTP выключаем целиком: почтового релея в контуре нет. Вместе с флагом
# убираем аннотацию инжекции secrets/vault/common/smtp_auth — секрета в
# Vault нет, а vault-agent-init на несуществующем секрете не отрендерит
# шаблон и оставит под в Init:Error, до флага дело не дойдёт.
- op: test
path: /spec/values/services/backend/envs/23/name
value: ENABLE_SMTP
- op: replace
path: /spec/values/services/backend/envs/23/value/_default
value: "0"
- op: remove
path: /spec/values/services/backend/podAnnotations/_default/vault.hashicorp.com~1agent-inject-secret-processing-smtp
- op: remove
path: /spec/values/services/backend/podAnnotations/_default/vault.hashicorp.com~1agent-inject-template-processing-smtp
# Смежные сервисы, которых в контуре нет: documentations (PDM,
# filestream), resources, bim-api, workspace, issues, comparisons,
# mailgun. Оставляем только S3 — единственное внешнее хранилище, которое
# в aero действительно есть.
- op: test
path: /spec/values/services/backend/envs/22/name
value: ENABLE_PDM_STORAGE
- op: replace
path: /spec/values/services/backend/envs/22/value/_default
value: "0"
- op: test
path: /spec/values/services/backend/envs/26/name
value: ENABLE_BIM_API_V2_DB
- op: replace
path: /spec/values/services/backend/envs/26/value/_default
value: "0"
- op: test
path: /spec/values/services/backend/envs/27/name
value: ENABLE_WORKSPACE_API_DB
- op: replace
path: /spec/values/services/backend/envs/27/value/_default
value: "0"
- op: test
path: /spec/values/services/backend/envs/28/name
value: ENABLE_ISSUE_API_DB
- op: replace
path: /spec/values/services/backend/envs/28/value/_default
value: "0"
- op: test
path: /spec/values/services/backend/envs/29/name
value: ENABLE_RESOURCES_API
- op: replace
path: /spec/values/services/backend/envs/29/value/_default
value: "0"
- op: test
path: /spec/values/services/backend/envs/31/name
value: ENABLE_PDM_API_DB
- op: replace
path: /spec/values/services/backend/envs/31/value/_default
value: "0"
- op: test
path: /spec/values/services/backend/envs/32/name
value: ENABLE_COMPARISONS_API_DB
- op: replace
path: /spec/values/services/backend/envs/32/value/_default
value: "0"
- op: test
path: /spec/values/services/backend/envs/33/name
value: ENABLE_MAIL_GUN
- op: replace
path: /spec/values/services/backend/envs/33/value/_default
value: "0"
# Планирование подов задач. engine работает kubernetes-исполнителем и сам
# создаёт Job'ы, подставляя им nodeSelector dedicated=processing и
# соответствующий toleration. Выделенных нод в контуре нет — все три
# равнозначны, — поэтому поды задач висли бы в Pending с
# didn't match Pod's node affinity/selector
# ровно как это было у postgresql (см. postRenderers в его релизе).
#
# ENABLE_TOLERATION ЗДЕСЬ НЕ ВЫКЛЮЧАТЬ. Сначала я поставил его в "0" — и
# это тихо сломало запуск задач совсем: в движке классы ресурсов
# регистрируются ПОД ЭТИМ ЖЕ ФЛАГОМ,
# if resCfg.EnableToleration { services[HighResources] = ... }
# (pkg/kube_services/services.go), поэтому задача с service_request
# "high-resources" падала не на планировании, а раньше — на разборе:
# ERROR create k8s job: create k8s job: unknown service
# Ни одного пода при этом не создавалось, и в логе не было ни слова про
# nodeSelector, так что связь с этим флагом неочевидна.
#
# Вместо выключения переводим селектор на метку, которая есть на всех
# нодах, — kubernetes.io/os=linux. Класс сервисов остаётся
# зарегистрированным, nodeSelector совпадает с любой нодой, а toleration
# на несуществующий taint безвреден. Запрашиваемые ресурсы трогать не
# надо: в base это 1 CPU и 1Gi.
#
# IGNORE_TAINTS_AND_NODE_SELECTOR (появился в base из master) для этого
# НЕ годится: в исходниках workflows-engine такой переменной нет вовсе,
# образ contour_3ef5b462 о ней не знает.
- op: test
path: /spec/values/services/backend/envs/53/name
value: TOLERATION_KEY
- op: replace
path: /spec/values/services/backend/envs/53/value/_default
value: kubernetes.io/os
- op: test
path: /spec/values/services/backend/envs/54/name
value: TOLERATION_VALUE
- op: replace
path: /spec/values/services/backend/envs/54/value/_default
value: linux
- op: test
path: /spec/values/services/backend/envs/55/name
value: TOLERATION_KEY_HIGH_MEM
- op: replace
path: /spec/values/services/backend/envs/55/value/_default
value: kubernetes.io/os
- op: test
path: /spec/values/services/backend/envs/56/name
value: TOLERATION_VALUE_HIGH_MEM
- op: replace
path: /spec/values/services/backend/envs/56/value/_default
value: linux
- op: test
path: /spec/values/services/backend/envs/57/name
value: TOLERATION_KEY_PERSISTENT
- op: replace
path: /spec/values/services/backend/envs/57/value/_default
value: kubernetes.io/os
- op: test
path: /spec/values/services/backend/envs/58/name
value: TOLERATION_VALUE_PERSISTENT
- op: replace
path: /spec/values/services/backend/envs/58/value/_default
value: linux
- op: test
path: /spec/values/services/backend/envs/70/name
value: DEFAULT_NODE_SELECTOR_KEY
- op: replace
path: /spec/values/services/backend/envs/70/value/_default
value: kubernetes.io/os
- op: test
path: /spec/values/services/backend/envs/71/name
value: DEFAULT_NODE_SELECTOR_VALUE
- op: replace
path: /spec/values/services/backend/envs/71/value/_default
value: linux
# S3 из Vault, как у api.
- op: add
path: /spec/values/services/backend/podAnnotations/_default/vault.hashicorp.com~1agent-inject-secret-processing-s3
value: secrets/data/minio/apps/processing
- op: add
path: /spec/values/services/backend/podAnnotations/_default/vault.hashicorp.com~1agent-inject-template-processing-s3
value: |-
{{- with secret "secrets/data/minio/apps/processing" -}}
{
"host": "{{ index .Data.data "host" }}",
"bucket": "{{ index .Data.data "bucket" }}",
"access_key_id": "{{ index .Data.data "access_key_id" }}",
"secret_access_key": "{{ index .Data.data "secret_access_key" }}",
"region": "{{ index .Data.data "region" }}",
"verify": false
}
{{- end -}}