135 lines
3.9 KiB
Markdown
135 lines
3.9 KiB
Markdown
# Урок 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' }}
|
|
```
|