OPA blacklistimages

I referred a OPA sample and developed template & constraint to blacklist images, just struggling to figure out where it went wrong.
sorry about the messed indentations, as I had no idea how to maintain original indentations at copy

candidate@node01:~$ vi template2.yaml

apiVersion: templates.gatekeeper.sh/v1beta1
kind: ConstraintTemplate
metadata:
  name: BlacklistImages-test
spec:
  crd:
    spec:
      names:
        kind: BlacklistImages
      validation:
        openAPIV3Schema:
          properties:
            message:
              type: string
  targets:
  - rego: |
      package k8strustedimages

      images {
        image := input.review.object.spec.containers[_].image
        not startswith(image, "fake-image.com/") #
      }

      violation[{"msg": msg}] {
        not images
        msg := "not trusted image!"
      }
    target: admission.k8s.gatekeeper.sh

candidate@node01:~$ kubectl create -f template2.yaml
error: error parsing template2.yaml: error converting YAML to JSON: yaml: line 6: did not find expected key

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: BlacklistImages
metadata:
  name: pod-with-bad-images
spec:
  match:
    kinds:
    - apiGroups:
      - ""
      kinds:
      - Pod
  parameters:
    message: "ACCESS DENIED!"

candidate@node01:~$ kubectl create -f constraint2.yaml
error: error parsing constraint2.yaml: error converting YAML to JSON: yaml: line 6: did not find expected key

Getting the indentations right is actually fairly simple: it uses Markdown syntax. So
‘```’ will open a code block, and the same 3 back-tics will close the block. Or you can use the ‘</>’ key to create the opening and closing of the block.

You’re going to need to get that right, since the syntax of an OPA Gateway definition will be more or less unreadable if you don’t, and we won’t be able to try out your code to help.

Thanks for the tips, I managed to get indentation right:-) Can I ask you to look into the issue again?

Let’s start by looking at template2.yaml. The errors I initially got look like this:

$ k apply -f blacklist1.yaml
The ConstraintTemplate “BlacklistImages-test” is invalid: metadata.name: Invalid value: “BlacklistImages-test”: a lowercase RFC 1123 subdomain must consist of lower case alphanumeric characters, ‘-’ or ‘.’, and must start and end with an alphanumeric character (e.g. ‘example.com’, regex used for validation is ‘a-z0-9?(.a-z0-9?)*’)

So if I change .metadata.name to “blacklistimages”, it works.

constrainttemplate.templates.gatekeeper.sh/blacklistimages created

Your constraint file then also applies without trouble.

Can you help further? Got no idea what it really meant with these errors

candidate@node01:~$ vi template2.yaml
apiVersion: templates.gatekeeper.sh/v1beta1
kind: ConstraintTemplate
metadata:
  name: k8salwaysdeny
spec:
  crd:
    spec:
      names:
        kind: K8sAlwaysDeny
      validation:
        # Schema for the `parameters` field
        openAPIV3Schema:
          properties:
            message:
              type: string
  targets:
    - target: admission.k8s.gatekeeper.sh
      rego: |
        package k8salwaysdeny

        violation[{"msg": msg}] {
          1 > 0
          msg := input.parameters.message```

candidate@node01:~$ vi constraint2.yaml
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sAlwaysDeny
metadata:
  name: pod-always-deny
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]
  parameters:
    message: "ACCESS DENIED!"

candidate@node01:~$ kubectl create -f template2.yaml

error: resource mapping not found for name: “k8salwaysdeny” namespace: “” from “template2.yaml”: no matches for kind “ConstraintTemplate” in version “templates.gatekeeper.sh/v1beta1”

ensure CRDs are installed first

candidate@node01:~$ kubectl create -f constraint2.yaml

error: resource mapping not found for name: “pod-always-deny” namespace: “” from “constraint2.yaml”: no matches for kind “K8sAlwaysDeny” in version “constraints.gatekeeper.sh/v1beta1”

ensure CRDs are installed first

You’re missing the top part of template2.yaml. Could you please supply it as well (say, by doing cat template2.yaml)?

Hi Rob, I really missed the CRD yaml. It started to work after applying the right CRD yaml. FYI, I followed this course:
cks-course-environment/course-content/opa/gatekeeper.yaml at master · killer-sh/cks-course-environment · GitHub

apiVersion: v1
kind: Namespace
metadata:
  labels:
    admission.gatekeeper.sh/ignore: no-self-managing
    control-plane: controller-manager
    gatekeeper.sh/system: "yes"
  name: gatekeeper-system
---
apiVersion: v1
kind: ResourceQuota
metadata:
  labels:
    gatekeeper.sh/system: "yes"
  name: gatekeeper-critical-pods
  namespace: gatekeeper-system
spec:
  hard:
    pods: 100
  scopeSelector:
    matchExpressions:
      - operator: In
        scopeName: PriorityClass
        values:
          - system-cluster-critical
---
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  annotations:
    controller-gen.kubebuilder.io/version: v0.5.0
  creationTimestamp: null
  labels:
    gatekeeper.sh/system: "yes"
  name: configs.config.gatekeeper.sh
spec:
  group: config.gatekeeper.sh
  names:
    kind: Config
    listKind: ConfigList
    plural: configs
    singular: config
  scope: Namespaced
  versions:
    - name: v1alpha1
      schema:
        openAPIV3Schema:
          description: Config is the Schema for the configs API
          properties:
            apiVersion:
              description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
              type: string
            kind:
              description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
              type: string
            metadata:
              type: object
            spec:
              description: ConfigSpec defines the desired state of Config
              properties:
                match:
                  description: Configuration for namespace exclusion
                  items:
                    properties:
                      excludedNamespaces:
                        items:
                          type: string
                        type: array
                      processes:
                        items:
                          type: string
                        type: array
                    type: object
                  type: array
                readiness:
                  description: Configuration for readiness tracker
                  properties:
                    statsEnabled:
                      type: boolean
                  type: object
                sync:
                  description: Configuration for syncing k8s objects
                  properties:
                    syncOnly:
                      description: If non-empty, only entries on this list will be replicated into OPA
                      items:
                        properties:
                          group:
                            type: string
                          kind:
                            type: string
                          version:
                            type: string
                        type: object
                      type: array
                  type: object
                validation:
                  description: Configuration for validation
                  properties:
                    traces:
                      description: List of requests to trace. Both "user" and "kinds" must be specified
                      items:
                        properties:
                          dump:
                            description: Also dump the state of OPA with the trace. Set to `All` to dump everything.
                            type: string
                          kind:
                            description: Only trace requests of the following GroupVersionKind
                            properties:
                              group:
                                type: string
                              kind:
                                type: string
                              version:
                                type: string
                            type: object
                          user:
                            description: Only trace requests from the specified user
                            type: string
                        type: object
                      type: array
                  type: object
              type: object
            status:
              description: ConfigStatus defines the observed state of Config
              type: object
          type: object
      served: true
      storage: true
status:
  acceptedNames:
    kind: ""
    plural: ""
  conditions: []
  storedVersions: []
---
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  annotations:
    controller-gen.kubebuilder.io/version: v0.5.0
  creationTimestamp: null
  labels:
    gatekeeper.sh/system: "yes"
  name: constraintpodstatuses.status.gatekeeper.sh
spec:
  group: status.gatekeeper.sh
  names:
    kind: ConstraintPodStatus
    listKind: ConstraintPodStatusList
    plural: constraintpodstatuses
    singular: constraintpodstatus
  scope: Namespaced
  versions:
    - name: v1beta1
      schema:
        openAPIV3Schema:
          description: ConstraintPodStatus is the Schema for the constraintpodstatuses API
          properties:
            apiVersion:
              description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
              type: string
            kind:
              description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
              type: string
            metadata:
              type: object
            status:
              description: ConstraintPodStatusStatus defines the observed state of ConstraintPodStatus
              properties:
                constraintUID:
                  description: Storing the constraint UID allows us to detect drift, such as when a constraint has been recreated after its CRD was deleted out from under it, interrupting the watch
                  type: string
                enforced:
                  type: boolean
                errors:
                  items:
                    description: Error represents a single error caught while adding a constraint to OPA
                    properties:
                      code:
                        type: string
                      location:
                        type: string
                      message:
                        type: string
                    required:
                      - code
                      - message
                    type: object
                  type: array
                id:
                  type: string
                observedGeneration:
                  format: int64
                  type: integer
                operations:
                  items:
                    type: string
                  type: array
              type: object
          type: object
      served: true
      storage: true
status:
  acceptedNames:
    kind: ""
    plural: ""
  conditions: []
  storedVersions: []
---
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  annotations:
    controller-gen.kubebuilder.io/version: v0.5.0
  creationTimestamp: null
  labels:
    gatekeeper.sh/system: "yes"
  name: constrainttemplatepodstatuses.status.gatekeeper.sh
spec:
  group: status.gatekeeper.sh
  names:
    kind: ConstraintTemplatePodStatus
    listKind: ConstraintTemplatePodStatusList
    plural: constrainttemplatepodstatuses
    singular: constrainttemplatepodstatus
  scope: Namespaced
  versions:
    - name: v1beta1
      schema:
        openAPIV3Schema:
          description: ConstraintTemplatePodStatus is the Schema for the constrainttemplatepodstatuses API
          properties:
            apiVersion:
              description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
              type: string
            kind:
              description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
              type: string
            metadata:
              type: object
            status:
              description: ConstraintTemplatePodStatusStatus defines the observed state of ConstraintTemplatePodStatus
              properties:
                errors:
                  items:
                    description: CreateCRDError represents a single error caught during parsing, compiling, etc.
                    properties:
                      code:
                        type: string
                      location:
                        type: string
                      message:
                        type: string
                    required:
                      - code
                      - message
                    type: object
                  type: array
                id:
                  description: 'Important: Run "make" to regenerate code after modifying this file'
                  type: string
                observedGeneration:
                  format: int64
                  type: integer
                operations:
                  items:
                    type: string
                  type: array
                templateUID:
                  description: UID is a type that holds unique ID values, including UUIDs.  Because we don't ONLY use UUIDs, this is an alias to string.  Being a type captures intent and helps make sure that UIDs and names do not get conflated.
                  type: string
              type: object
          type: object
      served: true
      storage: true
status:
  acceptedNames:
    kind: ""
    plural: ""
  conditions: []
  storedVersions: []
---
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  annotations:
    controller-gen.kubebuilder.io/version: v0.5.0
  creationTimestamp: null
  labels:
    gatekeeper.sh/system: "yes"
  name: constrainttemplates.templates.gatekeeper.sh
spec:
  group: templates.gatekeeper.sh
  names:
    kind: ConstraintTemplate
    listKind: ConstraintTemplateList
    plural: constrainttemplates
    singular: constrainttemplate
  scope: Cluster
  versions:
    - name: v1alpha1
      schema:
        openAPIV3Schema:
          description: ConstraintTemplate is the Schema for the constrainttemplates API
          properties:
            apiVersion:
              description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
              type: string
            kind:
              description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
              type: string
            metadata:
              type: object
            spec:
              description: ConstraintTemplateSpec defines the desired state of ConstraintTemplate
              properties:
                crd:
                  properties:
                    spec:
                      properties:
                        names:
                          properties:
                            kind:
                              type: string
                            shortNames:
                              items:
                                type: string
                              type: array
                          type: object
                        validation:
                          properties:
                            openAPIV3Schema:
                              type: object
                              x-kubernetes-preserve-unknown-fields: true
                          type: object
                      type: object
                  type: object
                targets:
                  items:
                    properties:
                      libs:
                        items:
                          type: string
                        type: array
                      rego:
                        type: string
                      target:
                        type: string
                    type: object
                  type: array
              type: object
            status:
              description: ConstraintTemplateStatus defines the observed state of ConstraintTemplate
              properties:
                byPod:
                  items:
                    description: ByPodStatus defines the observed state of ConstraintTemplate as seen by an individual controller
                    properties:
                      errors:
                        items:
                          description: CreateCRDError represents a single error caught during parsing, compiling, etc.
                          properties:
                            code:
                              type: string
                            location:
                              type: string
                            message:
                              type: string
                          required:
                            - code
                            - message
                          type: object
                        type: array
                      id:
                        description: a unique identifier for the pod that wrote the status
                        type: string
                      observedGeneration:
                        format: int64
                        type: integer
                    type: object
                    x-kubernetes-preserve-unknown-fields: true
                  type: array
                created:
                  type: boolean
              type: object
          type: object
      served: true
      storage: false
      subresources:
        status: {}
    - name: v1beta1
      schema:
        openAPIV3Schema:
          description: ConstraintTemplate is the Schema for the constrainttemplates API
          properties:
            apiVersion:
              description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
              type: string
            kind:
              description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
              type: string
            metadata:
              type: object
            spec:
              description: ConstraintTemplateSpec defines the desired state of ConstraintTemplate
              properties:
                crd:
                  properties:
                    spec:
                      properties:
                        names:
                          properties:
                            kind:
                              type: string
                            shortNames:
                              items:
                                type: string
                              type: array
                          type: object
                        validation:
                          properties:
                            openAPIV3Schema:
                              type: object
                              x-kubernetes-preserve-unknown-fields: true
                          type: object
                      type: object
                  type: object
                targets:
                  items:
                    properties:
                      libs:
                        items:
                          type: string
                        type: array
                      rego:
                        type: string
                      target:
                        type: string
                    type: object
                  type: array
              type: object
            status:
              description: ConstraintTemplateStatus defines the observed state of ConstraintTemplate
              properties:
                byPod:
                  items:
                    description: ByPodStatus defines the observed state of ConstraintTemplate as seen by an individual controller
                    properties:
                      errors:
                        items:
                          description: CreateCRDError represents a single error caught during parsing, compiling, etc.
                          properties:
                            code:
                              type: string
                            location:
                              type: string
                            message:
                              type: string
                          required:
                            - code
                            - message
                          type: object
                        type: array
                      id:
                        description: a unique identifier for the pod that wrote the status
                        type: string
                      observedGeneration:
                        format: int64
                        type: integer
                    type: object
                    x-kubernetes-preserve-unknown-fields: true
                  type: array
                created:
                  type: boolean
              type: object
          type: object
      served: true
      storage: true
      subresources:
        status: {}
status:
  acceptedNames:
    kind: ""
    plural: ""
  conditions: []
  storedVersions: []
---
apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    gatekeeper.sh/system: "yes"
  name: gatekeeper-admin
  namespace: gatekeeper-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  creationTimestamp: null
  labels:
    gatekeeper.sh/system: "yes"
  name: gatekeeper-manager-role
  namespace: gatekeeper-system
rules:
  - apiGroups:
      - ""
    resources:
      - events
    verbs:
      - create
      - patch
  - apiGroups:
      - ""
    resources:
      - secrets
    verbs:
      - create
      - delete
      - get
      - list
      - patch
      - update
      - watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  creationTimestamp: null
  labels:
    gatekeeper.sh/system: "yes"
  name: gatekeeper-manager-role
rules:
  - apiGroups:
      - '*'
    resources:
      - '*'
    verbs:
      - get
      - list
      - watch
  - apiGroups:
      - apiextensions.k8s.io
    resources:
      - customresourcedefinitions
    verbs:
      - create
      - delete
      - get
      - list
      - patch
      - update
      - watch
  - apiGroups:
      - config.gatekeeper.sh
    resources:
      - configs
    verbs:
      - create
      - delete
      - get
      - list
      - patch
      - update
      - watch
  - apiGroups:
      - config.gatekeeper.sh
    resources:
      - configs/status
    verbs:
      - get
      - patch
      - update
  - apiGroups:
      - constraints.gatekeeper.sh
    resources:
      - '*'
    verbs:
      - create
      - delete
      - get
      - list
      - patch
      - update
      - watch
  - apiGroups:
      - mutations.gatekeeper.sh
    resources:
      - '*'
    verbs:
      - create
      - delete
      - get
      - list
      - patch
      - update
      - watch
  - apiGroups:
      - policy
    resourceNames:
      - gatekeeper-admin
    resources:
      - podsecuritypolicies
    verbs:
      - use
  - apiGroups:
      - status.gatekeeper.sh
    resources:
      - '*'
    verbs:
      - create
      - delete
      - get
      - list
      - patch
      - update
      - watch
  - apiGroups:
      - templates.gatekeeper.sh
    resources:
      - constrainttemplates
    verbs:
      - create
      - delete
      - get
      - list
      - patch
      - update
      - watch
  - apiGroups:
      - templates.gatekeeper.sh
    resources:
      - constrainttemplates/finalizers
    verbs:
      - delete
      - get
      - patch
      - update
  - apiGroups:
      - templates.gatekeeper.sh
    resources:
      - constrainttemplates/status
    verbs:
      - get
      - patch
      - update
  - apiGroups:
      - admissionregistration.k8s.io
    resourceNames:
      - gatekeeper-validating-webhook-configuration
    resources:
      - validatingwebhookconfigurations
    verbs:
      - create
      - delete
      - get
      - list
      - patch
      - update
      - watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  labels:
    gatekeeper.sh/system: "yes"
  name: gatekeeper-manager-rolebinding
  namespace: gatekeeper-system
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: gatekeeper-manager-role
subjects:
  - kind: ServiceAccount
    name: gatekeeper-admin
    namespace: gatekeeper-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  labels:
    gatekeeper.sh/system: "yes"
  name: gatekeeper-manager-rolebinding
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: gatekeeper-manager-role
subjects:
  - kind: ServiceAccount
    name: gatekeeper-admin
    namespace: gatekeeper-system
---
apiVersion: v1
kind: Secret
metadata:
  labels:
    gatekeeper.sh/system: "yes"
  name: gatekeeper-webhook-server-cert
  namespace: gatekeeper-system
---
apiVersion: v1
kind: Service
metadata:
  labels:
    gatekeeper.sh/system: "yes"
  name: gatekeeper-webhook-service
  namespace: gatekeeper-system
spec:
  ports:
    - port: 443
      targetPort: 8443
  selector:
    control-plane: controller-manager
    gatekeeper.sh/operation: webhook
    gatekeeper.sh/system: "yes"
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    control-plane: audit-controller
    gatekeeper.sh/operation: audit
    gatekeeper.sh/system: "yes"
  name: gatekeeper-audit
  namespace: gatekeeper-system
spec:
  replicas: 1
  selector:
    matchLabels:
      control-plane: audit-controller
      gatekeeper.sh/operation: audit
      gatekeeper.sh/system: "yes"
  template:
    metadata:
      annotations:
        container.seccomp.security.alpha.kubernetes.io/manager: runtime/default
      labels:
        control-plane: audit-controller
        gatekeeper.sh/operation: audit
        gatekeeper.sh/system: "yes"
    spec:
      automountServiceAccountToken: true
      containers:
        - args:
            - --operation=audit
            - --operation=status
            - --logtostderr
          command:
            - /manager
          env:
            - name: POD_NAMESPACE
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: metadata.namespace
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
          image: openpolicyagent/gatekeeper:v3.5.2
          imagePullPolicy: Always
          livenessProbe:
            httpGet:
              path: /healthz
              port: 9090
          name: manager
          ports:
            - containerPort: 8888
              name: metrics
              protocol: TCP
            - containerPort: 9090
              name: healthz
              protocol: TCP
          readinessProbe:
            httpGet:
              path: /readyz
              port: 9090
          resources:
            limits:
              cpu: 1000m
              memory: 512Mi
            requests:
              cpu: 50m
              memory: 100Mi
          securityContext:
            allowPrivilegeEscalation: false
            capabilities:
              drop:
                - all
            readOnlyRootFilesystem: true
            runAsGroup: 999
            runAsNonRoot: true
            runAsUser: 1000
      nodeSelector:
        kubernetes.io/os: linux
      priorityClassName: system-cluster-critical
      serviceAccountName: gatekeeper-admin
      terminationGracePeriodSeconds: 60
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    control-plane: controller-manager
    gatekeeper.sh/operation: webhook
    gatekeeper.sh/system: "yes"
  name: gatekeeper-controller-manager
  namespace: gatekeeper-system
spec:
  replicas: 3
  selector:
    matchLabels:
      control-plane: controller-manager
      gatekeeper.sh/operation: webhook
      gatekeeper.sh/system: "yes"
  template:
    metadata:
      annotations:
        container.seccomp.security.alpha.kubernetes.io/manager: runtime/default
      labels:
        control-plane: controller-manager
        gatekeeper.sh/operation: webhook
        gatekeeper.sh/system: "yes"
    spec:
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
            - podAffinityTerm:
                labelSelector:
                  matchExpressions:
                    - key: gatekeeper.sh/operation
                      operator: In
                      values:
                        - webhook
                topologyKey: kubernetes.io/hostname
              weight: 100
      automountServiceAccountToken: true
      containers:
        - args:
            - --port=8443
            - --logtostderr
            - --exempt-namespace=gatekeeper-system
            - --operation=webhook
          command:
            - /manager
          env:
            - name: POD_NAMESPACE
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: metadata.namespace
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
          image: openpolicyagent/gatekeeper:v3.5.2
          imagePullPolicy: Always
          livenessProbe:
            httpGet:
              path: /healthz
              port: 9090
          name: manager
          ports:
            - containerPort: 8443
              name: webhook-server
              protocol: TCP
            - containerPort: 8888
              name: metrics
              protocol: TCP
            - containerPort: 9090
              name: healthz
              protocol: TCP
          readinessProbe:
            httpGet:
              path: /readyz
              port: 9090
          resources:
            limits:
              cpu: 1000m
              memory: 512Mi
            requests:
              cpu: 100m
              memory: 256Mi
          securityContext:
            allowPrivilegeEscalation: false
            capabilities:
              drop:
                - all
            readOnlyRootFilesystem: true
            runAsGroup: 999
            runAsNonRoot: true
            runAsUser: 1000
          volumeMounts:
            - mountPath: /certs
              name: cert
              readOnly: true
      nodeSelector:
        kubernetes.io/os: linux
      priorityClassName: system-cluster-critical
      serviceAccountName: gatekeeper-admin
      terminationGracePeriodSeconds: 60
      volumes:
        - name: cert
          secret:
            defaultMode: 420
            secretName: gatekeeper-webhook-server-cert
---
apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
metadata:
  labels:
    gatekeeper.sh/system: "yes"
  name: gatekeeper-validating-webhook-configuration
webhooks:
  - admissionReviewVersions:
      - v1
      - v1beta1
    clientConfig:
      service:
        name: gatekeeper-webhook-service
        namespace: gatekeeper-system
        path: /v1/admit
    failurePolicy: Ignore
    matchPolicy: Exact
    name: validation.gatekeeper.sh
    namespaceSelector:
      matchExpressions:
        - key: admission.gatekeeper.sh/ignore
          operator: DoesNotExist
    rules:
      - apiGroups:
          - '*'
        apiVersions:
          - '*'
        operations:
          - CREATE
          - UPDATE
        resources:
          - '*'
    sideEffects: None
    timeoutSeconds: 3
  - admissionReviewVersions:
      - v1
      - v1beta1
    clientConfig:
      service:
        name: gatekeeper-webhook-service
        namespace: gatekeeper-system
        path: /v1/admitlabel
    failurePolicy: Fail
    matchPolicy: Exact
    name: check-ignore-label.gatekeeper.sh
    rules:
      - apiGroups:
          - ""
        apiVersions:
          - '*'
        operations:
          - CREATE
          - UPDATE
        resources:
          - namespaces
    sideEffects: None
    timeoutSeconds: 3

Happens to best of us. Great it’s working.