CI: проверять admission-правила ESO (namespaced SecretStore ссылается на SA своего namespace) #401

Open
opened 2026-10-12 16:28:14 +00:00 by hermes · 0 comments
Collaborator

Что произошло

PR #387 был смержен зелёным, но в кластере namespaced SecretStore (см. kubernetes/apps/<ns>/hermes/secrets/app/secretstore-kubernetes.yaml) не применился: admission-вебхук External Secrets отклонил объект, потому что auth.serviceAccount.namespace указывал на ServiceAccount оператора из чужого namespace (security):

SecretStore/grachevaeu/kubernetes dry-run failed (Forbidden): admission webhook
"validate.secretstore.external-secrets.io" denied the request: namespace should either be empty
or match the namespace of the SecretStore for a namespaced SecretStore

Цепочка secrets -> env -> hermes не поехала, инстансы не перезагрузились. Фикс — #397: ServiceAccount secrets-reader с Role и RoleBinding переехал в namespace самого инстанса, remoteNamespace остался своим.

Почему CI пропустил

flate test all и Flux Local проверяют рендер и схемы значений, но не правила admission-вебхуков: вебхук существует только в кластере, а локальный рендер про него ничего не знает. Объект синтаксически корректен и проходит любую проверку без кластера.

Что добавить

Два варианта, они различаются ценой и охватом:

  1. Правило-политика (conftest/kyverno-json) по отрендеренным объектам: для SecretStore (не ClusterSecretStore) в auth.serviceAccount.namespace допустимы пустое значение или namespace самого объекта. Дёшево, без кластера, закрывает ровно этот класс ошибки.
  2. Server-side dry-run против эфемерного кластера с установленным ESO (kind + чарт 2.12.0): kubectl apply --dry-run=server на отрендеренный манифест — закрывает класс целиком (валидаторы вебхуков всех операторов, а не только ESO), но тянет за собой кластер в CI.

Совмещать с проверкой схем CRD (парный issue) стоит в одной обвязке: рендер даёт объекты, дальше — схемы и правила.

Критерий приёмки

  • манифест из #387 (SA из security) — проверка краснеет;
  • манифест после #397 (SA в namespace инстанса) — зелёный.
## Что произошло PR #387 был смержен зелёным, но в кластере namespaced `SecretStore` (см. `kubernetes/apps/<ns>/hermes/secrets/app/secretstore-kubernetes.yaml`) не применился: admission-вебхук External Secrets отклонил объект, потому что `auth.serviceAccount.namespace` указывал на ServiceAccount оператора из чужого namespace (`security`): ``` SecretStore/grachevaeu/kubernetes dry-run failed (Forbidden): admission webhook "validate.secretstore.external-secrets.io" denied the request: namespace should either be empty or match the namespace of the SecretStore for a namespaced SecretStore ``` Цепочка `secrets -> env -> hermes` не поехала, инстансы не перезагрузились. Фикс — #397: ServiceAccount `secrets-reader` с Role и RoleBinding переехал в namespace самого инстанса, `remoteNamespace` остался своим. ## Почему CI пропустил `flate test all` и `Flux Local` проверяют рендер и схемы значений, но не правила admission-вебхуков: вебхук существует только в кластере, а локальный рендер про него ничего не знает. Объект синтаксически корректен и проходит любую проверку без кластера. ## Что добавить Два варианта, они различаются ценой и охватом: 1. **Правило-политика** (`conftest`/`kyverno-json`) по отрендеренным объектам: для `SecretStore` (не `ClusterSecretStore`) в `auth.serviceAccount.namespace` допустимы пустое значение или namespace самого объекта. Дёшево, без кластера, закрывает ровно этот класс ошибки. 2. **Server-side dry-run** против эфемерного кластера с установленным ESO (kind + чарт `2.12.0`): `kubectl apply --dry-run=server` на отрендеренный манифест — закрывает класс целиком (валидаторы вебхуков всех операторов, а не только ESO), но тянет за собой кластер в CI. Совмещать с проверкой схем CRD (парный issue) стоит в одной обвязке: рендер даёт объекты, дальше — схемы и правила. ## Критерий приёмки - манифест из #387 (SA из `security`) — проверка краснеет; - манифест после #397 (SA в namespace инстанса) — зелёный.
Sign in to join this conversation.
No labels
No milestone
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
grachevko/home-ops#401
No description provided.