Есть такой интересный инструмент для безопасности k8s, который умеет всякое и называется kyverno.
Тут подробнее.
Сегодня рассмотрим одну из возможностей мутирования манифестов пода, а именно мутирование imagePullPolicy.
Рассматриваемый кейс — предположим, что у нам нужно мутировать imagePullPolicy: Always всегда в политику IfNotPresent, дабы не пулить каждый раз образы и избежать ошибки и человеческого фактора в ревью манифестов, но при этом, если мы используем тег latest, мы наоборот меняем политику на Always.
ClusterPolicy для kyverno будет выглядить примерно вот так:
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
annotations:
policies.kyverno.io/category: Mutate imagePullPolicy for pod
policies.kyverno.io/description: Set imagePullPolicy IfNotPresent always exepct if image tag latest
policies.kyverno.io/severity: low
policies.kyverno.io/subject: Pod
policies.kyverno.io/title: Mutate imagePullPolicy
name: mutateimagepullpolicy
spec:
background: true
rules:
- match:
any:
- resources:
kinds:
- Pod
mutate:
patchStrategicMerge:
spec:
initContainers:
- (imagePullPolicy): Always
imagePullPolicy: IfNotPresent
containers:
- (imagePullPolicy): Always
imagePullPolicy: IfNotPresent
name: imagepullpolicy-ifnotpresent
preconditions:
all:
- key: '{{ request.operation }}'
operator: In
value:
- CREATE
- UPDATE
- match:
any:
- resources:
kinds:
- Pod
mutate:
patchStrategicMerge:
spec:
initContainers:
- (image): '*:latest'
imagePullPolicy: Always
containers:
- (image): '*:latest'
imagePullPolicy: Always
name: imagepullpolicy-always
preconditions:
all:
- key: '{{ request.operation }}'
operator: In
value:
- CREATE
- UPDATE
validationFailureAction: Audit
Здесь в рамках одной ClusterPolicy используется несколько политик. Такой манифест скажется kyverno применять политики последовательно, к примеру применив одну политку, если она станет противоречить другой, то мутация сработает еще раз.
Тем самым при операциях UPDATE, CREATE на любом namespace, kyverno проверить initContainers и containers в поде и мутирует их imagePullPolicy если это потребуется.