Validação dinâmica K8s
Tags: kubernetes, braziliandevs, devops, eks
Published: 2023-09-12 18:24:09

![Símbolo do kubernetes representado por um timão azul](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/r12dgj8mbbz4s6dbfwl9.png)
&nbsp;

Neste artigo vou abordar um componente do kubernetes que precisei entender sua função para avaliar sua real necessidade para uma determinada situação, o objeto em questão é o _ValidatingWebhookConfiguration_.


O ValidatingWebhookConfiguration é um dos componentes utilizados para acionar validações aos objetos que estão sendo criados, deletados ou atualizados em um cluster Kubernetes. Isso é possível pois este componente realiza chamadas a um serviço que validará por exemplo, se um pod atende ou não a determinadas regras para poder ingressar ou não no cluster.

**QUANDO USAR?**
Vamos supor que você não quer que sejam criados pods sem a label "ambiente: teste" no seu cluster. Para conseguir validar se este pod atende ou não a sua necessidade e permitir que ele seja criado, você criará um serviço de validação que será acionado por um ValidatingWebhookConfiguration.

Para entender melhor, vamos analisar o manifesto abaixo que especifica a criação de um ValidatingWebhookConfiguration:

```
apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
metadata:
  name: pod-validator
webhooks:
  - name: pod.validator.teste.io
    clientConfig:
      service:
        name: pod-validator
        namespace: default
        path: "/validate"
    rules:
      - apiGroups:
          - ""
        apiVersions:
          - "v1"
        operations:
          - CREATE
          - UPDATE
        resources:
          - pods
    failurePolicy: Fail
```

**name** é o nome que damos ao webhook.
**clientConfig** especifica o serviço que fornecerá a validação. Nesse caso o nome do service é pod-validator e está no namespace default, suponhamos que este aponte para um pod que executa um script python, esse script irá conter a lógica de validação, como por exemplo, verificar se o POD que está sendo criado  possui a label "ambiente: teste".
**rules** aqui você descreve a 'quem' essa política se aplica, no caso do exemplo, essa validação será acionada sempre que houver um evento do tipo _CREATE_ e _UPDATE_ para recursos do tipo _POD_ cujo _apiVersion_ seja _v1_.
**failurePolicy** o valor Fail faz com que a criação do pod falhe caso a validação feita pelo nosso script python não retorne com sucesso.
&nbsp;

O desenho abaixo explica de forma bem macro o fluxo quando o ValidatingWebhookConfiguration está presente:

![Fluxo de criação de um pod com o componente ValidatingWebhookConfiguration](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5n1kcgmf57a26nr32pwh.png)

---

**PONTOS IMPORTANTES:**
- Você pode validar qualquer tipo de componente do kubernetes, não só PODs, se você especificar "*" no campo _resources_ por exemplo, o serviço será chamado para qualquer tipo de recurso que estiver sendo criado ou atualizado no cluster.
- Você pode restringir a validação aos recursos que estejam sendo criados em apigroups específicos, para isso, basta especificar na lista de apiGroups do manifesto os grupos no qual deseja realizar a validação, por exemplo o grupo gateway.networking.k8s.io.

---

**RESUMO**
O ValidatingWebhookConfiguration é um componente importante para que possamos controlar as operações de CREATE, UPDATE, DELETE e CONNECT de recursos em um cluster, chamando serviços que validam determinadas configurações que precisam ou não estar presentes nos recursos para que sejam 'aceitos'. É possível fazer ajustes precisos para se alcançar qualquer tipo de política de validação.

---

**REFERÊNCIAS:**
- https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#validatingwebhookconfiguration-v1-admissionregistration-k8s-io

- https://kubernetes.io/docs/reference/access-authn-authz/extensible-admission-controllers/

---

Valeu e até a próxima! :)