Files
2026-04-08 20:22:14 +07:00
..
2026-04-08 20:22:14 +07:00
2026-04-08 20:22:14 +07:00
2026-04-08 20:22:14 +07:00
2026-04-08 20:22:14 +07:00

Урок 5.2 — Контекстные данные и информация о кластере

Файлы

Файл Описание
deployment-freeze-config.yaml ConfigMap для управления freeze
restrict-deploys-during-freeze.yaml Блокировка деплоев во время freeze
restrict-privileged-non-admins.yaml Привилегии только для admin-групп

Применение

kubectl apply -f deployment-freeze-config.yaml
kubectl apply -f restrict-deploys-during-freeze.yaml
kubectl apply -f restrict-privileged-non-admins.yaml

Тест deployment freeze

# Убедиться что freeze выключен
kubectl get configmap deployment-freeze-config -n kyverno \
  -o jsonpath='{.data.freeze_active}'
# Должно быть: false

# Создать тестовый deployment — должен пройти
kubectl create deployment test-deploy \
  --image=nginx:1.25.3 --replicas=1

# Активировать freeze
kubectl patch configmap deployment-freeze-config -n kyverno \
  --type merge \
  -p '{"data":{"freeze_active":"true"}}'

# Подождать обновления кэша (~60 сек), затем попробовать деплой
kubectl create deployment blocked-deploy \
  --image=nginx:1.25.3 --replicas=1
# Ожидаем ошибку: Деплойменты заморожены...

# Деактивировать freeze
kubectl patch configmap deployment-freeze-config -n kyverno \
  --type merge \
  -p '{"data":{"freeze_active":"false"}}'

# Уборка
kubectl delete deployment test-deploy 2>/dev/null || true

Доступные контекстные данные запроса

# Информация о ресурсе
request.object.metadata.name
request.object.metadata.namespace
request.object.metadata.labels
request.object.metadata.annotations

# Информация об операции
request.operation          # CREATE | UPDATE | DELETE | CONNECT
request.dryRun             # true при --dry-run=server

# Старый объект (только при UPDATE)
request.oldObject.spec.replicas

# Информация о пользователе
request.userInfo.username
request.userInfo.uid
request.userInfo.groups    # список групп
request.userInfo.extra     # дополнительные атрибуты

# Пример: разные правила для CREATE vs UPDATE
preconditions:
  any:
  - key: "{{ request.operation }}"
    operator: Equals
    value: CREATE

Тест userInfo — проверка групп

# Посмотреть свои группы в кластере
kubectl auth whoami

# Попробовать создать привилегированный под (должен быть отклонён)
kubectl apply -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
  name: test-privileged
  namespace: default
spec:
  containers:
  - name: app
    image: nginx:1.25.3
    securityContext:
      privileged: true
    resources:
      limits:
        memory: "128Mi"
        cpu: "100m"
EOF
# Ожидаем: error... не имеет права создавать привилегированные контейнеры

Cross-resource проверка через apiCall

# Читаем лейблы namespace во время обработки Pod запроса
context:
- name: nsLabels
  apiCall:
    urlPath: "/api/v1/namespaces/{{ request.object.metadata.namespace }}"
    jmesPath: "metadata.labels"

# Читаем список всех Deployments в namespace
context:
- name: existingDeployments
  apiCall:
    urlPath: "/apis/apps/v1/namespaces/{{ request.object.metadata.namespace }}/deployments"
    jmesPath: "items[].metadata.name"

# ВАЖНО: каждый apiCall = HTTP запрос к API Server.
# Используйте с умом — это влияет на латентность admission.
# Для часто используемых данных предпочитайте ConfigMap.