init
This commit is contained in:
127
05-variables/02-context/README.md
Normal file
127
05-variables/02-context/README.md
Normal file
@@ -0,0 +1,127 @@
|
||||
# Урок 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.
|
||||
```
|
||||
Reference in New Issue
Block a user