All Policies

Require Requests and Limits for emptyDir

Pods which mount emptyDir volumes may be allowed to potentially overrun the medium backing the emptyDir volume. This sample ensures that any initContainers or containers mounting an emptyDir volume have ephemeral-storage requests and limits set.

Policy Definition

/other/require_emptydir_requests_limits/require-emptydir-requests-limits.yaml

 1apiVersion: kyverno.io/v1
 2kind: ClusterPolicy
 3metadata:
 4  name: require-emptydir-requests-and-limits
 5  annotations:
 6    policies.kyverno.io/title: Require Requests and Limits for emptyDir
 7    policies.kyverno.io/category: Other
 8    policies.kyverno.io/severity: medium
 9    policies.kyverno.io/minversion: 1.6.0
10    kyverno.io/kyverno-version: 1.6.0
11    kyverno.io/kubernetes-version: "1.23"
12    policies.kyverno.io/subject: Pod
13    policies.kyverno.io/description: >-
14      Pods which mount emptyDir volumes may be allowed to potentially overrun
15      the medium backing the emptyDir volume. This sample ensures that any
16      initContainers or containers mounting an emptyDir volume have
17      ephemeral-storage requests and limits set.         
18spec:
19  background: false
20  validationFailureAction: audit
21  rules:
22  - name: check-emptydir-requests-limits
23    match:
24      any:
25      - resources:
26          kinds:
27          - Pod
28    preconditions:
29      all:
30      - key: "{{ request.object.spec.volumes[?contains(keys(@), 'emptyDir')] || '' | length(@) }}"
31        operator: GreaterThanOrEquals
32        value: 1
33      - key: "{{request.operation}}"
34        operator: In
35        value:
36        - CREATE
37        - UPDATE
38    validate:
39      message: Containers mounting emptyDir volumes must specify requests and limits for ephemeral-storage.
40      foreach:
41      - list: "request.object.spec.volumes[?contains(keys(@), 'emptyDir')]"
42        elementScope: false
43        deny:
44          conditions:
45            any:
46              # get the number of containers (based on name) which mount this emptyDir (by name)
47            - key: "{{request.object.spec.[initContainers, containers][].volumeMounts[?name == '{{ element.name }}' ][].name | length(@) }}"
48              operator: NotEquals
49              # compare it to the number of containers (also mounting this same emptyDir vol by name) which have ephemeral-storage requests.
50              # block if the two numbers aren't equal. If limits are specified but not requests, requests are automatically
51              # set equal to the value of the limit. Therefore, this condition only works effectively if both requests and limits are not set.
52              value: "{{request.object.spec.[initContainers, containers[?volumeMounts[?name == '{{element.name}}' ]]][].resources.requests.\"ephemeral-storage\" | length(@) }}"
53            - key: "{{request.object.spec.[initContainers, containers][].volumeMounts[?name == '{{ element.name }}' ][].name | length(@) }}"
54              operator: NotEquals
55              # same as above but with limits
56              value: "{{request.object.spec.[initContainers, containers[?volumeMounts[?name == '{{element.name}}' ]]][].resources.limits.\"ephemeral-storage\" | length(@) }}"
57