init
This commit is contained in:
82
03-mutation/01-basics/README.md
Normal file
82
03-mutation/01-basics/README.md
Normal 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
|
||||
```
|
||||
36
03-mutation/01-basics/add-default-resource-requests.yaml
Normal file
36
03-mutation/01-basics/add-default-resource-requests.yaml
Normal 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"
|
||||
55
03-mutation/01-basics/add-default-security-context.yaml
Normal file
55
03-mutation/01-basics/add-default-security-context.yaml
Normal 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
|
||||
33
03-mutation/01-basics/add-standard-labels.yaml
Normal file
33
03-mutation/01-basics/add-standard-labels.yaml
Normal 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 }}"
|
||||
@@ -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"
|
||||
Reference in New Issue
Block a user