All Policies
Spread Pods Across Nodes & Zones in CEL expressions
Deployments to a Kubernetes cluster with multiple availability zones often need to distribute those replicas to align with those zones to ensure site-level failures do not impact availability. This policy ensures topologySpreadConstraints are defined, to spread pods over nodes and zones. Deployments or Statefulsets with less than 3 replicas are skipped.
Policy Definition
/other-cel/topologyspreadconstraints-policy/topologyspreadconstraints-policy.yaml
1apiVersion: kyverno.io/v1
2kind: ClusterPolicy
3metadata:
4 name: topologyspreadconstraints-policy
5 annotations:
6 policies.kyverno.io/title: Spread Pods Across Nodes & Zones in CEL expressions
7 kyverno.io/kubernetes-version: "1.26-1.27"
8 kyverno.io/kyverno-version: 1.11.0
9 policies.kyverno.io/category: Sample in CEL
10 policies.kyverno.io/description: >-
11 Deployments to a Kubernetes cluster with multiple availability zones often need to
12 distribute those replicas to align with those zones to ensure site-level failures
13 do not impact availability. This policy ensures topologySpreadConstraints are defined,
14 to spread pods over nodes and zones. Deployments or Statefulsets with less than 3
15 replicas are skipped.
16 policies.kyverno.io/minversion: 1.11.0
17 policies.kyverno.io/severity: medium
18 policies.kyverno.io/subject: Deployment, StatefulSet
19spec:
20 background: true
21 failurePolicy: Ignore
22 validationFailureAction: Audit
23 rules:
24 - name: spread-pods
25 match:
26 any:
27 - resources:
28 kinds:
29 - Deployment
30 - StatefulSet
31 operations:
32 - CREATE
33 - UPDATE
34 celPreconditions:
35 - name: "replicas-must-be-3-or-more"
36 expression: "object.spec.replicas >= 3"
37 validate:
38 cel:
39 expressions:
40 - expression: >-
41 size(object.spec.template.spec.?topologySpreadConstraints.orValue([]).filter(t, t.topologyKey == 'kubernetes.io/hostname' || t.topologyKey == 'topology.kubernetes.io/zone')) == 2
42 message: "topologySpreadConstraint for kubernetes.io/hostname & topology.kubernetes.io/zone are required"