init
This commit is contained in:
134
05-variables/01-configmaps/README.md
Normal file
134
05-variables/01-configmaps/README.md
Normal file
@@ -0,0 +1,134 @@
|
||||
# Урок 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' }}
|
||||
```
|
||||
36
05-variables/01-configmaps/inherit-namespace-labels.yaml
Normal file
36
05-variables/01-configmaps/inherit-namespace-labels.yaml
Normal file
@@ -0,0 +1,36 @@
|
||||
apiVersion: kyverno.io/v1
|
||||
kind: ClusterPolicy
|
||||
metadata:
|
||||
name: inherit-namespace-labels
|
||||
annotations:
|
||||
policies.kyverno.io/title: "Наследование лейблов из Namespace"
|
||||
policies.kyverno.io/category: Governance
|
||||
policies.kyverno.io/severity: low
|
||||
policies.kyverno.io/subject: Pod
|
||||
policies.kyverno.io/description: >-
|
||||
Копирует лейблы environment и team из Namespace в Pod.
|
||||
Позволяет автоматически тегировать поды данными их namespace
|
||||
без ручного дублирования в каждом манифесте.
|
||||
spec:
|
||||
rules:
|
||||
- name: copy-namespace-labels
|
||||
match:
|
||||
resources:
|
||||
kinds:
|
||||
- Pod
|
||||
exclude:
|
||||
resources:
|
||||
namespaces:
|
||||
- kube-system
|
||||
- kyverno
|
||||
context:
|
||||
- name: nsLabels
|
||||
apiCall:
|
||||
urlPath: "/api/v1/namespaces/{{ request.object.metadata.namespace }}"
|
||||
jmesPath: "metadata.labels"
|
||||
mutate:
|
||||
patchStrategicMerge:
|
||||
metadata:
|
||||
labels:
|
||||
+(environment): "{{ nsLabels.environment || 'unknown' }}"
|
||||
+(team): "{{ nsLabels.team || 'unknown' }}"
|
||||
27
05-variables/01-configmaps/kyverno-global-config.yaml
Normal file
27
05-variables/01-configmaps/kyverno-global-config.yaml
Normal file
@@ -0,0 +1,27 @@
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: kyverno-global-config
|
||||
namespace: kyverno
|
||||
labels:
|
||||
app: kyverno-config
|
||||
data:
|
||||
# --- Resource defaults ---
|
||||
default.memory.request: "128Mi"
|
||||
default.memory.limit: "512Mi"
|
||||
default.cpu.request: "100m"
|
||||
default.cpu.limit: "500m"
|
||||
|
||||
# --- Registry ---
|
||||
allowed.registries: "registry.company.com,gcr.io/company-project"
|
||||
|
||||
# --- Environment ---
|
||||
production.replicas.minimum: "2"
|
||||
staging.replicas.minimum: "1"
|
||||
|
||||
# --- Required labels (через запятую) ---
|
||||
required.labels: "app,team,environment"
|
||||
|
||||
# --- Node settings ---
|
||||
default.node.type: "standard"
|
||||
default.region: "eu-west-1"
|
||||
@@ -0,0 +1,44 @@
|
||||
apiVersion: kyverno.io/v1
|
||||
kind: ClusterPolicy
|
||||
metadata:
|
||||
name: set-resource-limits-from-config
|
||||
annotations:
|
||||
policies.kyverno.io/title: "Resource limits из централизованного ConfigMap"
|
||||
policies.kyverno.io/category: Resources
|
||||
policies.kyverno.io/severity: low
|
||||
policies.kyverno.io/subject: Pod
|
||||
policies.kyverno.io/description: >-
|
||||
Устанавливает дефолтные resource limits из ConfigMap kyverno-global-config.
|
||||
Изменение лимитов для всего кластера — это kubectl edit configmap,
|
||||
а не изменение и деплой политики.
|
||||
spec:
|
||||
rules:
|
||||
- name: set-limits-from-configmap
|
||||
match:
|
||||
resources:
|
||||
kinds:
|
||||
- Pod
|
||||
exclude:
|
||||
resources:
|
||||
namespaces:
|
||||
- kube-system
|
||||
- kyverno
|
||||
context:
|
||||
- name: globalConfig
|
||||
configMap:
|
||||
name: kyverno-global-config
|
||||
namespace: kyverno
|
||||
mutate:
|
||||
foreach:
|
||||
- list: "request.object.spec.containers"
|
||||
patchStrategicMerge:
|
||||
spec:
|
||||
containers:
|
||||
- name: "{{ element.name }}"
|
||||
resources:
|
||||
requests:
|
||||
+(memory): "{{ globalConfig.data.\"default.memory.request\" }}"
|
||||
+(cpu): "{{ globalConfig.data.\"default.cpu.request\" }}"
|
||||
limits:
|
||||
+(memory): "{{ globalConfig.data.\"default.memory.limit\" }}"
|
||||
+(cpu): "{{ globalConfig.data.\"default.cpu.limit\" }}"
|
||||
Reference in New Issue
Block a user