This commit is contained in:
2026-04-08 20:22:14 +07:00
commit 34fbdd1412
96 changed files with 5321 additions and 0 deletions

View File

@@ -0,0 +1,82 @@
# Урок 3.1 — Основы мутации ресурсов
## Файлы
| Файл | Описание |
|------|----------|
| `add-standard-labels.yaml` | Автодобавление лейблов managed-by, monitored, cost-center |
| `add-default-resource-requests.yaml` | Дефолтные requests для контейнеров без них |
| `add-default-security-context.yaml` | Безопасный SecurityContext по умолчанию |
## Как проверить результат мутации
```bash
# Применить политики
kubectl apply -f .
# Создать под без лейблов и requests
kubectl apply -f test-resources/pod-before-mutation.yaml
# Посмотреть что изменилось — сравнить с оригиналом
kubectl get pod pod-before-mutation -o yaml | \
grep -A 20 "labels:"
kubectl get pod pod-before-mutation -o yaml | \
grep -A 10 "resources:"
# Dry-run — увидеть результат без реального создания
kubectl apply -f test-resources/pod-before-mutation.yaml \
--dry-run=server -o yaml | \
diff test-resources/pod-before-mutation.yaml - || true
```
## Отладка мутаций через Kyverno CLI
```bash
# Показывает изменённый ресурс в stdout
kyverno apply add-standard-labels.yaml \
--resource test-resources/pod-before-mutation.yaml \
--detailed-results
# Сохранить мутированный ресурс
kyverno apply . \
--resource test-resources/pod-before-mutation.yaml \
> test-resources/pod-after-mutation.yaml
cat test-resources/pod-after-mutation.yaml
```
## Типы patch операций
```yaml
# Strategic Merge — наиболее читаемый, для добавления полей
mutate:
patchStrategicMerge:
metadata:
labels:
+(new-label): value # + = добавить только если нет
# JSON Patch RFC 6902 — для точечных изменений и удаления полей
mutate:
patchesJson6902: |-
- op: add
path: /metadata/annotations/company.com~1reviewed # ~1 = / в имени
value: "true"
- op: replace
path: /spec/replicas
value: 3
- op: remove
path: /spec/template/metadata/annotations/debug
```
## Порядок применения политик
Если несколько политик мутируют один ресурс — они применяются
в **алфавитном порядке** имён политик.
```bash
# Управляйте порядком через числовые префиксы в именах:
# 01-add-labels → 02-add-annotations → 03-add-sidecar
kubectl get mutatingwebhookconfigurations -o yaml | \
grep "name:" | grep kyverno
```

View File

@@ -0,0 +1,36 @@
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: add-default-resource-requests
annotations:
policies.kyverno.io/title: "Дефолтные resource requests"
policies.kyverno.io/category: Resources
policies.kyverno.io/severity: low
policies.kyverno.io/subject: Pod
policies.kyverno.io/description: >-
Автоматически добавляет дефолтные resource requests контейнерам,
у которых они не указаны. Requests нужны для корректного планирования.
Символ + добавляет только отсутствующие поля.
spec:
rules:
- name: add-default-requests
match:
resources:
kinds:
- Pod
exclude:
resources:
namespaces:
- kube-system
- kyverno
mutate:
foreach:
- list: "request.object.spec.containers"
patchStrategicMerge:
spec:
containers:
- name: "{{ element.name }}"
resources:
requests:
+(memory): "128Mi"
+(cpu): "100m"

View File

@@ -0,0 +1,55 @@
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: add-default-security-context
annotations:
policies.kyverno.io/title: "Дефолтный SecurityContext"
policies.kyverno.io/category: Security
policies.kyverno.io/severity: medium
policies.kyverno.io/subject: Pod
policies.kyverno.io/description: >-
Автоматически применяет безопасный SecurityContext к подам и контейнерам,
если поля не заданы явно. Работает в связке с validation политиками
(сначала mutate, потом validate).
spec:
rules:
- name: add-pod-security-context
match:
resources:
kinds:
- Pod
exclude:
resources:
namespaces:
- kube-system
mutate:
patchStrategicMerge:
spec:
+(securityContext):
+(runAsNonRoot): true
+(runAsUser): 1000
+(seccompProfile):
+(type): RuntimeDefault
- name: add-container-security-context
match:
resources:
kinds:
- Pod
exclude:
resources:
namespaces:
- kube-system
mutate:
foreach:
- list: "request.object.spec.containers"
patchStrategicMerge:
spec:
containers:
- name: "{{ element.name }}"
+(securityContext):
+(allowPrivilegeEscalation): false
+(readOnlyRootFilesystem): true
+(capabilities):
+(drop):
- ALL

View File

@@ -0,0 +1,33 @@
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: add-standard-labels
annotations:
policies.kyverno.io/title: "Добавление стандартных лейблов"
policies.kyverno.io/category: Governance
policies.kyverno.io/severity: low
policies.kyverno.io/subject: Deployment,StatefulSet,DaemonSet
policies.kyverno.io/description: >-
Автоматически добавляет стандартные лейблы к workload ресурсам,
если они отсутствуют. Символ + означает "добавить только если нет".
spec:
rules:
- name: add-managed-by-label
match:
resources:
kinds:
- Deployment
- StatefulSet
- DaemonSet
exclude:
resources:
namespaces:
- kube-system
mutate:
patchStrategicMerge:
metadata:
labels:
+(managed-by): "kyverno"
+(monitored): "true"
# Динамически берём namespace как cost-center
+(cost-center): "{{ request.object.metadata.namespace }}"

View File

@@ -0,0 +1,16 @@
apiVersion: v1
kind: Pod
metadata:
name: pod-before-mutation
namespace: default
# нет лейблов managed-by, monitored, cost-center
spec:
containers:
- name: app
image: nginx:1.25.3
# нет resources.requests — будут добавлены мутацией
# нет securityContext — будет добавлен мутацией
resources:
limits:
memory: "128Mi"
cpu: "100m"