Расскажи про admission controllers: что такое ValidatingAdmissionWebhook и MutatingAdmissionWebhook, и какую роль играют OPA/Gatekeeper или Kyverno?
Admission controllers — последний рубеж перед записью в etcd: MutatingAdmissionWebhook изменяет объекты (sidecar injection, defaults), ValidatingAdmissionWebhook отклоняет нарушающие политики. OPA/Gatekeeper и Kyverno реализуют policy engine поверх этой модели.
Admission Controllers: MutatingAdmissionWebhook и ValidatingAdmissionWebhook
Admission control — последний рубеж перед сохранением объекта в etcd. Запрос уже прошёл authentication и authorization, но объект ещё можно изменить или отклонить. MutatingAdmissionWebhook изменяет объект: добавляет sidecar, labels, defaults. ValidatingAdmissionWebhook проверяет и запрещает: например, нельзя privileged Pod или latest image. OPA/Gatekeeper и Kyverno дают policy engine поверх этой модели.
Как работает
API server вызывает admission controllers в цепочке. Mutating webhooks идут до validating, потому что валидация должна видеть финальный объект после defaults и injections. Webhook получает AdmissionReview и возвращает allowed/denied, JSON patch или message.
failurePolicy определяет поведение при недоступном webhook: Fail безопаснее (отклонить запрос), но может остановить операции в кластере при падении policy service; Ignore повышает availability, но ослабляет политику. Gatekeeper использует OPA/Rego и ConstraintTemplate, Kyverno описывает политики в YAML, близком к Kubernetes-манифестам, и поддерживает validate, mutate, generate и verify images.
apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
metadata:
name: require-labels
webhooks:
- name: labels.example.com
rules:
- apiGroups: ["apps"]
apiVersions: ["v1"]
operations: ["CREATE", "UPDATE"]
resources: ["deployments"]
clientConfig:
service:
namespace: policy
name: labels-webhook
path: /validate
admissionReviewVersions: ["v1"]
sideEffects: None
failurePolicy: Fail
timeoutSeconds: 5
OPA/Gatekeeper vs Kyverno
Gatekeeper требует изучения языка Rego, зато даёт мощные policy-as-code возможности с audit и violations в status ресурса. Kyverno ближе к Kubernetes-YAML и быстрее стартует для команд без опыта Rego. Оба поддерживают audit mode — включайте его перед enforcement, чтобы увидеть нарушения без блокировки.
Подводные камни
- Поставить
failurePolicy: Failна webhook без HA (одна реплика) — при падении policy service всеapplyв кластере начнут завершаться ошибкой. - Делать mutation, о которой пользователи не знают. Это усложняет diff и debugging: kubectl apply возвращает одно, а кластер хранит другое.
- Писать политики без audit/exception процесса. Платформа превращается в блокер для команд, если нет способа получить временное исключение.
- Не выставлять
timeoutSecondsявно. Дефолт 10 с, но при медленном webhook это добавляет latency к каждому API-запросу в данном scope. - Забывать про
namespaceSelector. Webhook без селектора применяется ко всем namespace включая kube-system, что может сломать системные компоненты. - Не тестировать webhook на admission review примерах. Ошибка в логике может отклонить валидные объекты и заблокировать деплой в production.
Common mistakes
- Путать admission с RBAC
- Не различать mutate и validate
- Не учитывать failurePolicy
What the interviewer is testing
- Понимает место admission chain
- Знает webhook risks
- Может сравнить Gatekeeper и Kyverno