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

128 lines
4.0 KiB
Markdown
Raw Permalink 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.
# Урок 5.2 — Контекстные данные и информация о кластере
## Файлы
| Файл | Описание |
|------|----------|
| `deployment-freeze-config.yaml` | ConfigMap для управления freeze |
| `restrict-deploys-during-freeze.yaml` | Блокировка деплоев во время freeze |
| `restrict-privileged-non-admins.yaml` | Привилегии только для admin-групп |
## Применение
```bash
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
```bash
# Убедиться что 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
```
## Доступные контекстные данные запроса
```yaml
# Информация о ресурсе
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 — проверка групп
```bash
# Посмотреть свои группы в кластере
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
```yaml
# Читаем лейблы 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.
```