Este documento foi traduzido usando tecnologia de tradução automática de máquina. Sempre trabalhamos para apresentar traduções precisas, mas não oferecemos nenhuma garantia em relação à integridade, precisão ou confiabilidade do conteúdo traduzido. Em caso de qualquer discrepância, a versão original em inglês prevalecerá e constituirá o texto official.

Esta é uma documentação não divulgada para Admission Controller 1.34-dev.

Reutilizando Políticas de Validação de Admissão

O Kubernetes vanilla Políticas de Validação consistem nos seguintes recursos:

  • ValidatingAdmissionPolicy: descreve a lógica em CEL. Opcionalmente, também aceita parâmetros em spec.paramKind.

  • ValidatingAdmissionPolicyBinding: delimita a política.

Vamos ver um exemplo concreto. Essas e outras podem ser reutilizadas com SUSE Security Admission Controller’s cel-policy com pouco esforço.

Política de Validação de Admissão

A seguinte Política de Validação de Admissão é adaptada da documentação do Kubernetes.

Esta política verifica se o número de réplicas em implantações é menor ou igual a um padrão maxreplicas de 5. Os usuários podem substituir esse padrão por namespace ou implantação e escolher um número menor por meio do uso de um parâmetro.

Está vinculada a um ValidatingAdmissionPolicyBinding. Portanto, afeta apenas namespaces que têm um rótulo environment definido como 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"

Aqui, temos uma política 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"

Observe os números comentados em ambos os manifests YAML. Vamos expandir sobre eles:

# campo VAP cel-policy campo Descrição

1

failurePolicy

settings.failurePolicy

Comportamento CEL, para quando a expressão CEL avalia como falsa, há erros de runtime CEL, ou há CEL inválido ou mal configurado. Por exemplo, uma expressão CEL retornando falso, parâmetros ausentes ou variáveis ausentes. Não confundir com (6).

2

matchConstraints

rules

Ambos aceitam o mesmo RuleWithOperations que informa sobre que tipo de Recurso a política se aplica.

3

variables

settings.variables

Em Admission Controller’s cel-policy, expressões que definem variáveis estão em settings.variables. Além disso, eles são equivalentes.

4

paramKind,paramRef

settings.paramKind,settings.paramRef

Em Admission Controller’s cel-policy, definições de parâmetros estão em settings.paramKind, settings.paramRef. Além disso, eles são equivalentes.

5

validations

settings.validations

Em Admission Controller’s cel-policy, expressões que definem validações estão em settings.validations. Além disso, eles são equivalentes.

6

---

failurePolicy

Comportamento do Webhook, para erro ou timeout da API do Kubernetes Webhook, ou para avaliação de matchConditions. Não confundir com (1).

7

validationActions

mode

mode tem como opções protect e monitor. A auditoria é mais completa em Admission Controller, veja (9).

8

matchResources

namespaceSelector, objectSelector

Defina maneiras de restringir usando Seletores. As políticas de Admission Controller têm como namespaceSelector e objectSelector.

9

auditAnnotations (não ilustrado)

backgroundAudit, anotações

Use campos Admission Controller em vez disso para definir o uso da política em Audit Scanner, e sua categoria e severidade para OpenReports.

10

---

contextAwareResources permissões

As políticas de Admission Controller’s têm permissões detalhadas para leitura dos Recursos do cluster. Aqui é usado para ler os parâmetros.

matchConditions

matchConditions

As políticas de Admission Controller’s têm matchConditions (não ilustrado neste exemplo).

---

Recursos exclusivos para Admission Controller

Para outros recursos, veja o restante dos exemplos do tutorial CEL.

Você pode usar a ferramenta kwctl para migrar uma política VAP para Admission Controller.

Este procedimento de migração VAP descreve como fazê-lo.

Equivalências ainda a serem implementadas

Existem alguns recursos VAP que ainda não foram implementados. Se você está ansioso por eles, entre em contato conosco. Estes são os eventos:

Aplicando a política

Como de costume, podemos implantar nossa política instanciando seu manifesto:

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

E então testá-la instanciando uma implantação:

$ 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