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.1 — Переменные окружения и ConfigMaps

Файлы

Файл Описание
kyverno-global-config.yaml Централизованный ConfigMap с настройками
set-resource-limits-from-config.yaml Мутация: лимиты из ConfigMap
inherit-namespace-labels.yaml Мутация: лейблы из Namespace (через apiCall)

Применение

# Сначала 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

# 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

# Создать под — должны примениться лимиты из 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

# Создать 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

Дефолтные значения (защита от отсутствующих полей)

# Опасно: упадёт если лейбл не задан
{{ request.object.metadata.labels.env }}

# Безопасно: вернёт "unknown" если лейбл отсутствует
{{ request.object.metadata.labels.env || 'unknown' }}

# Цепочка дефолтов
{{ request.object.metadata.labels.region ||
   globalConfig.data.default_region ||
   'us-east-1' }}