Este documento ha sido traducido utilizando tecnología de traducción automática. Si bien nos esforzamos por proporcionar traducciones precisas, no ofrecemos garantías sobre la integridad, precisión o confiabilidad del contenido traducido. En caso de discrepancia, la versión original en inglés prevalecerá y constituirá el texto autorizado.

Esta es documentación inédita para Admission Controller 1.34-dev.

Configurando directivas

Omitiendo espacios de nombres para una directiva específica

Por defecto, las directivas se aplican a todos los espacios de nombres para los que está configurado el PolicyServer. Si deseas que una directiva apunte solo a espacios de nombres específicos, puedes desplegar varios AdmissionPolicies en cada espacio de nombres.

Otra opción es configurar ClusterAdmissionPolicies estableciendo su spec.namespaceSelector (ver documentos CRD). El spec.namespaceSelector decide si ejecutar la directiva sobre un objeto, basado en si el espacio de nombres de ese objeto coincide con el selector.

Por ejemplo, aquí hay una directiva que solo apunta a los espacios de nombres kube-system y my-namespace:

---
apiVersion: policies.kubewarden.io/v1
kind: ClusterAdmissionPolicy
metadata:
  name: psa-enforcer-privileged-namespaces
spec:
  module: registry://ghcr.io/kubewarden/policies/psa-label-enforcer:v1.0.3
  rules:
    - apiGroups: [""]
      apiVersions: ["v1"]
      resources: ["namespaces"]
      operations:
        - CREATE
        - UPDATE
  mutating: true
  namespaceSelector:
    matchExpressions:
      - key: "kubernetes.io/metadata.name"
        operator: In
        values: [kube-system, my-namespace]
  settings:
    modes:
      enforce: "privileged"

Aquí hay una directiva que apunta a todos los espacios de nombres excepto los kube-system y my-namespace:

---
apiVersion: policies.kubewarden.io/v1
kind: ClusterAdmissionPolicy
metadata:
  name: psa-enforcer-default-mode
spec:
  module: registry://ghcr.io/kubewarden/policies/psa-label-enforcer:v1.0.3
  rules:
    - apiGroups: [""]
      apiVersions: ["v1"]
      resources: ["namespaces"]
      operations:
        - CREATE
        - UPDATE
  mutating: true
  namespaceSelector:
    matchExpressions:
      - key: "kubernetes.io/metadata.name"
        operator: NotIn
        values: [kube-system, my-namespace]
  settings:
    modes:
      enforce: "restricted"

Mensaje de rechazo personalizado

Cuando una directiva rechaza un recurso, el mensaje mostrado al usuario es el que escribió el autor de la directiva. A veces, los operadores de clúster pueden querer establecer un mensaje de rechazo personalizado. Por ejemplo, esto puede usarse para señalar a una wiki interna o para proporcionar un código de error más específico.

El campo message en los tipos ClusterAdmissionPolicy y AdmissionPolicy puede usarse para lograr esto.

ClusterAdmissionPolicyGroup y AdmissionPolicyGroup ya tienen un campo message que se comporta de la misma manera.

El campo message permite a los operadores de clúster definir un mensaje de rechazo personalizado que anula el que devuelve la directiva. Al utilizar esta configuración, el mensaje de rechazo original se puede encontrar en el campo causes de la respuesta.

apiVersion: policies.kubewarden.io/v1
kind: ClusterAdmissionPolicy
metadata:
  name: pod-privileged-with-message
spec:
  module: registry://ghcr.io/kubewarden/policies/pod-privileged:1.0.2
  policyServer: default
  mode: protect
  message: "Nops! You cannot do that"
  settings: {}
  rules:
    - apiGroups:
        - ""
      apiVersions:
        - v1
      resources:
        - "*"
      operations:
        - CREATE
  mutating: false

Puedes obtener todos los detalles de una solicitud de admisión rechazada aumentando el nivel de verbosidad de kubectl:

$ kubectl -v4 run pod-privileged2 --image=registry.k8s.io/pause --privileged
I0612 16:32:43.647601   48424 cert_rotation.go:137] Starting client certificate rotation controller
I0612 16:32:43.662550   48424 helpers.go:246] server response object: [{
  "metadata": {},
  "status": "Failure",
  "message": "admission webhook \"clusterwide-pod-privileged-with-message.kubewarden.admission\" denied the request: Nops! You cannot do that",
  "details": {
    "causes": [
      {
        "message": "Privileged container is not allowed"
      }
    ]
  },
  "code": 400
}]

Negar un resultado de directiva envolviéndolo en un PolicyGroup

A veces, al utilizar una directiva, no implementa la lógica inversa de lo que necesitas aún.

Por ejemplo, quieres utilizar la priority-class directiva para rechazar un conjunto de clases de prioridad. Pero en el momento de escribir, la directiva priority-class solo admite permitido, no lista de bloqueo.

Un patrón común es envolver tu directiva en un AdmissionPolicyGroup o ClusterAdmissionPolicyGroup, y negar el resultado de la directiva en su spec.expression.

Por ejemplo, supongamos que queremos que los usuarios utilicen todas las clases de prioridad definidas dentro del clúster, excepto una de las siguientes: low-priority, med-priority y high-priority.

Actualmente, la configuración de la directiva permite expresar solo la lista de clases de prioridad permitidas. La siguiente directiva de grupo supera esta limitación.

apiVersion: policies.kubewarden.io/v1
kind: AdmissionPolicyGroup
metadata:
  name: priority-class-denylist
  namespace: your-namespace # or use a CLusterAdmissionPolicyGroup and set spec.namespaceSelector
spec:
  rules:
    - apiGroups: [""]
      apiVersions: ["v1"]
      resources: ["pods"]
      operations: ["CREATE", "UPDATE"]
    - apiGroups: [""]
      apiVersions: ["v1"]
      resources: ["replicationcontrollers"]
      operations: ["CREATE", "UPDATE"]
    - apiGroups: ["apps"]
      apiVersions: ["v1"]
      resources: ["deployments", "replicasets", "statefulsets", "daemonsets"]
      operations: ["CREATE", "UPDATE"]
    - apiGroups: ["batch"]
      apiVersions: ["v1"]
      resources: ["jobs", "cronjobs"]
      operations: ["CREATE", "UPDATE"]
  policies:
    is_a_denied_priority_class:
      module: ghcr.io/kubewarden/policies/priority-class-policy:v1.0.4
      settings:
        allowed_priority_classes:
          - low-priority
          - med-priority
          - high-priority
  expression: "!is_a_denied_priority_class()" # negated result
  message: "the Pod is using a priorityClass that is not allowed"