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

135 lines
3.9 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.1 — Переменные окружения и ConfigMaps
## Файлы
| Файл | Описание |
|------|----------|
| `kyverno-global-config.yaml` | Централизованный ConfigMap с настройками |
| `set-resource-limits-from-config.yaml` | Мутация: лимиты из ConfigMap |
| `inherit-namespace-labels.yaml` | Мутация: лейблы из Namespace (через apiCall) |
## Применение
```bash
# Сначала ConfigMap
kubectl apply -f kyverno-global-config.yaml
# Затем политики
kubectl apply -f set-resource-limits-from-config.yaml
kubectl apply -f inherit-namespace-labels.yaml
```
## Типы источников переменных в Kyverno
```yaml
# 1. Данные запроса (всегда доступны)
{{ request.object.metadata.name }}
{{ request.object.metadata.namespace }}
{{ request.operation }} # CREATE | UPDATE | DELETE
{{ request.userInfo.username }}
{{ request.userInfo.groups }}
# 2. ConfigMap
context:
- name: myConfig
configMap:
name: my-config
namespace: kyverno
# Использование:
{{ myConfig.data.my-key }}
# 3. Прямой API вызов
context:
- name: nsInfo
apiCall:
urlPath: "/api/v1/namespaces/{{ request.object.metadata.namespace }}"
jmesPath: "metadata.labels"
# Использование:
{{ nsInfo.environment }}
# 4. Встроенная переменная
context:
- name: defaults
variable:
value:
memory: "256Mi"
cpu: "250m"
# Использование:
{{ defaults.memory }}
# 5. Генерируемые значения
{{ random('[0-9]{6}') }} # случайные 6 цифр
{{ time_now_utc() }} # текущее UTC время
```
## Тест переменных из ConfigMap
```bash
# Создать под — должны примениться лимиты из ConfigMap
kubectl apply -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
name: test-config-vars
namespace: default
spec:
containers:
- name: app
image: nginx:1.25.3
EOF
# Проверить лимиты
kubectl get pod test-config-vars \
-o jsonpath='{.spec.containers[0].resources}' | jq .
# Ожидаем: limits.memory=512Mi, limits.cpu=500m (из ConfigMap)
# Изменить дефолты в ConfigMap и подождать ~60 секунд
kubectl patch configmap kyverno-global-config -n kyverno \
--type merge \
-p '{"data":{"default.memory.limit":"1Gi"}}'
# Новый под получит 1Gi
kubectl run test-after-change --image=nginx:1.25.3 --restart=Never
kubectl get pod test-after-change \
-o jsonpath='{.spec.containers[0].resources.limits.memory}'
# Ожидаем: 1Gi
# Уборка
kubectl delete pod test-config-vars test-after-change
```
## Тест наследования лейблов из Namespace
```bash
# Создать namespace с лейблами
kubectl create namespace labeled-ns
kubectl label namespace labeled-ns environment=production team=backend
# Создать под в этом namespace
kubectl run test-pod --image=nginx:1.25.3 \
--restart=Never -n labeled-ns
# Проверить унаследованные лейблы
kubectl get pod test-pod -n labeled-ns \
-o jsonpath='{.metadata.labels}' | jq .
# Ожидаем: environment=production, team=backend
kubectl delete pod test-pod -n labeled-ns
kubectl delete namespace labeled-ns
```
## Дефолтные значения (защита от отсутствующих полей)
```yaml
# Опасно: упадёт если лейбл не задан
{{ request.object.metadata.labels.env }}
# Безопасно: вернёт "unknown" если лейбл отсутствует
{{ request.object.metadata.labels.env || 'unknown' }}
# Цепочка дефолтов
{{ request.object.metadata.labels.region ||
globalConfig.data.default_region ||
'us-east-1' }}
```