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/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
 7    kyverno.io/kubernetes-version: "1.22-1.23"
 8    kyverno.io/kyverno-version: 1.8.0
 9    policies.kyverno.io/category: Sample
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 leass than 3 
15      replicas are skipped.
16    policies.kyverno.io/minversion: 1.8.0
17    policies.kyverno.io/severity: medium
18    policies.kyverno.io/subject: Deployment, StatefulSet
19    
20spec:
21  background: true
22  failurePolicy: Ignore
23  validationFailureAction: Audit
24  rules:
25    - name: spread-pods
26      match:
27        any:
28          - resources:
29              kinds:
30                - Deployment
31                - StatefulSet
32      preconditions:
33        all:
34          - key: "{{ request.object.spec.replicas }}"
35            operator: GreaterThanOrEquals
36            value: 3
37      validate:
38        message: "topologySpreadConstraint for kubernetes.io/hostname & topology.kubernetes.io/zone are required"
39        deny:
40          conditions:
41            any:
42              - key: "{{request.object.spec.template.spec.topologySpreadConstraints[?topologyKey=='kubernetes.io/hostname' || topologyKey=='topology.kubernetes.io/zone'] || `[]` | length(@) }}"
43                operator: NotEquals
44                value: 2