Kubernetes Validating Admission Policy | Kubernetes
- Kubernetes Validating Admission Policy | Kubernetes
1. O que são Validating Admission Controllers?
Eles são um mecanismo no API Server do Kubernetes que valida requisições antes que elas sejam aplicadas ou persistidas no cluster. Isso permite que você controle o comportamento e as configurações dos objetos no cluster.
- Por que usá-los?
- Garantir conformidade com políticas organizacionais (por exemplo, uso de namespaces obrigatórios, restrições de segurança, etc.).
- Impedir a criação de recursos mal configurados ou não seguros.
- Melhorar a segurança e a estabilidade do cluster.
2. Onde os Validating Admission Controllers agem?
No ciclo de vida de uma requisição ao Kubernetes:
-
Recepção pelo API Server:
- O usuário (ou uma aplicação) envia uma requisição HTTP ao API Server.
-
Autenticação:
- O Kubernetes verifica se o cliente está autenticado.
-
Autorização:
- O Kubernetes verifica se o cliente tem permissão para executar a operação.
-
Mutating Admission Controllers (opcional):
- Plugins podem modificar a requisição, adicionando ou alterando valores.
-
Validating Admission Controllers:
- A requisição é validada por meio de webhooks configurados.
- Se a validação falhar, a requisição é rejeitada.
-
Persistência no etcd:
- Se a validação for bem-sucedida, a alteração é persistida no etcd e aplicada ao cluster.
3. Como Funcionam os Validating Admission Controllers?
3.1 Estrutura Geral
O Kubernetes chama webhooks configurados para validar requisições. Esses webhooks são serviços externos que:
- Recebem uma solicitação JSON com detalhes da requisição.
- Avaliam se a requisição é válida ou não.
- Respondem ao Kubernetes com um resultado:
allowed: true→ Permitir a requisição.allowed: false→ Rejeitar a requisição com uma mensagem de erro.
3.2 Exemplo de Fluxo
Imagine que você quer garantir que todos os Pods criados no cluster tenham uma anotação específica chamada team.
-
Um usuário cria um Pod:
apiVersion: v1
kind: Pod
metadata:
name: example-pod
namespace: default
spec:
containers:
- name: nginx
image: nginx -
O Validating Admission Controller intercepta a requisição antes que ela seja salva no etcd.
-
O Webhook verifica se a anotação
teamestá presente:- Se estiver ausente:
- O Webhook responde com
allowed: falsee uma mensagem de erro.
- O Webhook responde com
- Se estiver presente:
- O Webhook responde com
allowed: true.
- O Webhook responde com
- Se estiver ausente:
3.3 Implementação Detalhada
Para implementar um Validating Admission Controller, siga estes passos:
Passo 1: Criar o Webhook
Um webhook é um serviço HTTP que recebe e processa solicitações de validação. Vamos usar um exemplo simples em Python:
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/validate', methods=['POST'])
def validate():
admission_review = request.json
# Extrair as informações do objeto
obj = admission_review['request']['object']
metadata = obj.get('metadata', {})
annotations = metadata.get('annotations', {})
# Verificar se a anotação 'team' está presente
if 'team' not in annotations:
return jsonify({
"response": {
"uid": admission_review['request']['uid'],
"allowed": False,
"status": {
"message": "Annotation 'team' is required."
}
}
})
# Aprovar a requisição
return jsonify({
"response": {
"uid": admission_review['request']['uid'],
"allowed": True
}
})
if __name__ == '__main__':
app.run(host='0.0.0.0', port=443, ssl_context=('cert.pem', 'key.pem'))
Passo 2: Configurar o Webhook no Cluster
Crie um recurso ValidatingWebhookConfiguration para informar ao Kubernetes sobre o Webhook.
apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
metadata:
name: validate-pod-annotations
webhooks:
- name: validate-annotations.example.com
clientConfig:
service:
name: validation-service
namespace: default
path: /validate
caBundle: <Base64-encoded-CA-cert>
rules:
- apiGroups: [""]
apiVersions: ["v1"]
operations: ["CREATE", "UPDATE"]
resources: ["pods"]
admissionReviewVersions: ["v1"]
sideEffects: None
Passo 3: Implantar o Serviço
Implante o serviço de Webhook no cluster. Você precisará:
-
Um Deployment:
apiVersion: apps/v1
kind: Deployment
metadata:
name: validation-service
spec:
replicas: 1
selector:
matchLabels:
app: validation-service
template:
metadata:
labels:
app: validation-service
spec:
containers:
- name: webhook
image: your-webhook-image
ports:
- containerPort: 443
volumeMounts:
- mountPath: /certs
name: webhook-cert
volumes:
- name: webhook-cert
secret:
secretName: webhook-cert -
Um Service para expor o webhook:
apiVersion: v1
kind: Service
metadata:
name: validation-service
spec:
ports:
- port: 443
targetPort: 443
selector:
app: validation-service -
Certificados TLS válidos: Admission Controllers exigem que os webhooks usem TLS. Você pode gerar certificados usando o cert-manager ou ferramentas como openssl.
4. Casos de Uso Reais
-
Segurança:
- Impedir a criação de Pods com privilégios elevados (
securityContext.privileged: true). - Restringir o uso de imagens de contêiner não verificadas.
- Impedir a criação de Pods com privilégios elevados (
-
Conformidade:
- Garantir que todos os objetos tenham anotações ou rótulos obrigatórios.
- Validar que os namespaces seguem um padrão de nomenclatura.
-
Boas Práticas:
- Bloquear recursos com valores de CPU/memória ausentes ou inadequados.
- Validar que apenas certas contas de serviço podem executar determinadas operações.