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.

Reusing ValidatingAdmissionPolicies

Kubernetes vanilla políticas de validación consisten en los siguientes recursos:

  • ValidatingAdmissionPolicy: describe la lógica en CEL. Opcionalmente también acepta parámetros en spec.paramKind.

  • ValidatingAdmissionPolicyBinding: delimita la directiva.

Veamos un ejemplo concreto. Estos y otros pueden ser reutilizados con SUSE Security Admission Controller’s cel-policy con poco esfuerzo.

ValidatingAdmissionPolicy

La siguiente ValidatingAdmissionPolicy está adaptada de los documentos de Kubernetes.

Esta directiva verifica si el número de Réplicas en ampliaciones es menor o igual a un maxreplicas predeterminado de 5. Los usuarios pueden anular este valor predeterminado por espacio de nombres o ampliación y elegir un número menor mediante el uso de un parámetro.

Está vinculada con un ValidatingAdmissionPolicyBinding. Por lo tanto, solo afecta a los espacios de nombres que tienen una etiqueta environment establecida en test.

./vap-policy-example.yaml
apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingAdmissionPolicy
metadata:
  name: "replicalimit-policy.example.com"
spec:
  failurePolicy: Fail # (1)
  matchConstraints: # (2)
    resourceRules:
      - apiGroups: ["apps"]
        apiVersions: ["v1"]
        operations: ["CREATE", "UPDATE"]
        resources: ["deployments"]
  variables: # (3)
    - name: maxReplicas # hardcoded global default
      expression: int(5)
  paramKind: # (4)
    apiVersion: v1
    kind: ConfigMap # user-provided override
  validations: # (5)
    - expression: |
        object.spec.replicas <= (
          has(params.data.overrideReplicas) && int(params.data.overrideReplicas) < variables.maxReplicas
          ? int(params.data.overrideReplicas)
          : variables.maxReplicas
        )
      messageExpression: |
        'The number of replicas must be less than or equal to ' +
        string( has(params.data.overrideReplicas) && int(params.data.overrideReplicas) < variables.maxReplicas
          ? int(params.data.overrideReplicas)
          : variables.maxReplicas)
---
apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingAdmissionPolicyBinding
metadata:
  name: "replicalimit-binding-test.example.com"
spec:
  policyName: "replicalimit-policy.example.com"
  validationActions: [Deny] # (7)
  matchResources: # (8)
    namespaceSelector:
      matchLabels:
        environment: test
  paramRef: # (4)
    name: "replica-limit-override"
    namespace: "test"
    parameterNotFoundAction: Deny
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: replica-limit-override
  namespace: test
data:
  overrideReplicas: "3"

Aquí, tenemos una directiva equivalente Admission Controller:

Admission Controller’s cel-policy

./cel-policy-example.yaml
apiVersion: policies.kubewarden.io/v1
kind: ClusterAdmissionPolicy
metadata:
  annotations:
    io.kubewarden.policy.category: Resource validation # (9)
    io.kubewarden.policy.severity: low # (9)
  name: "cel-policy-replica-example"
spec:
  module: registry://ghcr.io/kubewarden/policies/cel-policy:v1.4.0
  failurePolicy: Fail # (6). Webhook behavior. Defaults to "Fail"
  mode: protect # (7). Defaults to "protect"
  rules: # (2)
    - apiGroups: ["apps"]
      apiVersions: ["v1"]
      operations: ["CREATE", "UPDATE"]
      resources: ["deployments"]
  contextAwareResources: # (10). Fine-grained perms for accessing resources
    - apiVersion: v1
      kind: ConfigMap
  settings:
    failurePolicy: Fail # (1). CEL behavior. Defaults to "Fail"
    variables: # (3)
      - name: "replicas"
        expression: "object.spec.replicas"
      - name: maxReplicas
        expression: int(5)
    paramKind: # (4)
      apiVersion: v1
      kind: ConfigMap # user-provided override
    paramRef: # (4)
      name: "replica-limit-override"
      namespace: "test"
      parameterNotFoundAction: Deny
    validations: # (5)
      - expression: |
          object.spec.replicas <= (
            has(params.data.overrideReplicas) && int(params.data.overrideReplicas) < variables.maxReplicas
            ? int(params.data.overrideReplicas)
            : variables.maxReplicas
          )
        messageExpression: |
          'The number of replicas must be less than or equal to ' +
          string( has(params.data.overrideReplicas) && int(params.data.overrideReplicas) < variables.maxReplicas
            ? int(params.data.overrideReplicas)
            : variables.maxReplicas)
  backgroundAudit: true # (9). Defaults to "true"
  namespaceSelector: # (8)
    matchLabels:
      environment: test
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: replica-limit-override
  namespace: test
data:
  overrideReplicas: "3"

Observa los números comentados en ambos manifiestos YAML. Profundicemos en ellos:

# campo VAP cel-policy campo Descripción

1

failurePolicy

settings.failurePolicy

Comportamiento de CEL, para cuando la expresión CEL evalúa a falso, hay errores de tiempo de ejecución de CEL, o hay CEL inválido o mal configurado. Por ejemplo, una expresión CEL que devuelve falso, parámetros faltantes o variables faltantes. No confundir con (6).

2

matchConstraints

rules

Ambos aceptan la misma ReglaConOperaciones que informa sobre qué tipo de Recurso se aplica la directiva.

3

variables

settings.variables

En Admission Controller’s cel-policy, las expresiones que definen variables están en settings.variables. Aparte de eso, son equivalentes.

4

paramKind,paramRef

settings.paramKind,settings.paramRef

En Admission Controller’s cel-policy, las definiciones de parámetros están en settings.paramKind, settings.paramRef. Aparte de eso, son equivalentes.

5

validations

settings.validations

En Admission Controller’s cel-policy, las expresiones que definen validaciones están en settings.validations. Aparte de eso, son equivalentes.

6

---

failurePolicy

Comportamiento de Webhook, para error o tiempo de espera de la API de Kubernetes Webhook, o para la evaluación de matchConditions. No confundir con (1).

7

validationActions

mode

mode tiene como opciones protect y monitor. La auditoría es más completa en Admission Controller, ver (9).

8

matchResources

namespaceSelector, objectSelector

Definir formas de restricción utilizando Selectores. Las directivas de Admission Controller las tienen como namespaceSelector y objectSelector.

9

auditAnnotations (no representado)

backgroundAudit, anotaciones

Utiliza campos Admission Controller en su lugar para establecer el uso de la directiva en Escáner de Auditoría, y su categoría y severidad para OpenReports.

10

---

contextAwareResources permisos

Las directivas de Admission Controller tienen permisos granulares para leer Recursos del clúster. Aquí se utiliza para leer los parámetros.

matchConditions

matchConditions

Las directivas de Admission Controller tienen matchConditions (no representado en este ejemplo).

---

Funciones exclusivas de Admission Controller.

Para otras funciones, consulta el resto de ejemplos del tutorial de CEL.

Puedes utilizar la herramienta kwctl para migrar una directiva de VAP a Admission Controller.

Estas instrucciones de migración de VAP describen cómo hacerlo.

Equivalencias aún por implementar.

Hay algunas funciones de VAP que aún no están implementadas. Si tienes ganas de que se implementen, por favor, contacta con nosotros. Son los siguientes:

Aplicando la directiva.

Como de costumbre, podemos desplegar nuestra directiva instanciando su manifiesto:

$ kubectl apply -f ./cel-policy-example.yaml

Y luego probarla instanciando una ampliación:

$ kubectl apply -f - <<EOF
apiVersion: v1
kind: Namespace
metadata:
  name: test
  labels:
    environment: test
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: test
spec:
  replicas: 6
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
EOF

namespace/test created
Error from server: error when creating "STDIN":
  admission webhook "clusterwide-cel-policy-replica-example.kubewarden.admission" denied the request:
  The number of replicas must be less than or equal to 5