128 lines
4.0 KiB
Markdown
128 lines
4.0 KiB
Markdown
# Урок 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.
|
|
```
|