All Policies

Ensure Deployment Replicas Higher Than PodDisruptionBudget

PodDisruptionBudget resources are useful to ensuring minimum availability is maintained at all times. Introducing a PDB where there are already matching Pod controllers may pose a problem if the author is unaware of the existing replica count. This policy ensures that the minAvailable value is not greater not equal to the replica count of any matching existing Deployment. If other Pod controllers should also be included in this check, additional rules may be added to the policy which match those controllers.

Policy Definition

/other/deployment-replicas-higher-than-pdb/deployment-replicas-higher-than-pdb.yaml

1apiVersion: kyverno.io/v1 2kind: ClusterPolicy 3metadata: 4 name: deployment-replicas-higher-than-pdb 5 annotations: 6 policies.kyverno.io/title: Ensure Deployment Replicas Higher Than PodDisruptionBudget 7 policies.kyverno.io/category: Other 8 policies.kyverno.io/subject: PodDisruptionBudget, Deployment 9 kyverno.io/kyverno-version: 1.11.4 10 kyverno.io/kubernetes-version: "1.27" 11 policies.kyverno.io/description: >- 12 PodDisruptionBudget resources are useful to ensuring minimum availability is maintained at all times. 13 Introducing a PDB where there are already matching Pod controllers may pose a problem if the author 14 is unaware of the existing replica count. This policy ensures that the minAvailable value is not 15 greater not equal to the replica count of any matching existing Deployment. If other Pod controllers 16 should also be included in this check, additional rules may be added to the policy which match those 17 controllers. 18spec: 19 validationFailureAction: Audit 20 background: true 21 rules: 22 - name: deployment-replicas-greater-minAvailable 23 match: 24 any: 25 - resources: 26 kinds: 27 - PodDisruptionBudget 28 operations: 29 - CREATE 30 - UPDATE 31 context: 32 - name: deploymentreplicas 33 apiCall: 34 jmesPath: items[?label_match(`{{ request.object.spec.selector.matchLabels }}`, spec.template.metadata.labels)] || `[]` 35 urlPath: /apis/apps/v1/namespaces/{{request.namespace}}/deployments 36 preconditions: 37 all: 38 - key: '{{ regex_match(''^[0-9]+$'', ''{{ request.object.spec.minAvailable || ''''}}'') }}' 39 operator: Equals 40 value: true 41 - key: '{{ length(deploymentreplicas) }}' 42 operator: GreaterThan 43 value: 0 44 validate: 45 message: >- 46 PodDisruption budget minAvailable ({{ request.object.spec.minAvailable }}) cannot be 47 greater than or equal to the replica count of any matching existing Deployment. 48 There are {{ length(deploymentreplicas) }} Deployments which match this labelSelector 49 having {{ deploymentreplicas[*].spec.replicas }} replicas. 50 foreach: 51 - list: deploymentreplicas 52 deny: 53 conditions: 54 all: 55 - key: "{{ request.object.spec.minAvailable }}" 56 operator: GreaterThanOrEquals 57 value: "{{ element.spec.replicas }}"
yaml