All Policies
Spread Pods Across Nodes & Zones
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 leass than 3 replicas are skipped.
Policy Definition
/other/require-topologyspreadconstraints/topologyspreadconstraints-policy.yaml
1apiVersion: kyverno.io/v1
2kind: ClusterPolicy
3metadata:
4 name: topologyspreadconstraints-policy
5 annotations:
6 kyverno.io/kubernetes-version: "1.22-1.23"
7 kyverno.io/kyverno-version: 1.8.0
8 policies.kyverno.io/category: Sample
9 policies.kyverno.io/description: >-
10 Deployments to a Kubernetes cluster with multiple availability zones often need to
11 distribute those replicas to align with those zones to ensure site-level failures
12 do not impact availability. This policy ensures topologySpreadConstraints are defined,
13 to spread pods over nodes and zones. Deployments or Statefulsets with leass than 3
14 replicas are skipped.
15 policies.kyverno.io/minversion: 1.8.0
16 policies.kyverno.io/severity: medium
17 policies.kyverno.io/subject: Deployment, StatefulSet
18 policies.kyverno.io/title: Spread Pods Across Nodes & Zones
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 preconditions:
32 all:
33 - key: "{{ request.object.spec.replicas }}"
34 operator: GreaterThanOrEquals
35 value: 3
36 validate:
37 message: "topologySpreadConstraint for kubernetes.io/hostname & topology.kubernetes.io/zone are required"
38 deny:
39 conditions:
40 any:
41 - key: "{{request.object.spec.template.spec.topologySpreadConstraints[?topologyKey=='kubernetes.io/hostname' || topologyKey=='topology.kubernetes.io/zone'] || `[]` | length(@) }}"
42 operator: NotEquals
43 value: 2