This is an old revision of the document!
Table of Contents
Guia de Referência: Gerando Manifestos Kubernetes com ''kubectl --dry-run''
Este guia consolida uma série de comandos e exemplos práticos para a geração de manifestos Kubernetes utilizando a flag –dry-run=client. O objetivo é fornecer um material de referência estruturado que abrange desde conceitos básicos para iniciantes até um fluxo de trabalho completo para a implantação de uma aplicação como o phpIPAM.
1. Introdução ao ''kubectl --dry-run''
A flag –dry-run é uma ferramenta poderosa do kubectl que permite simular a execução de um comando sem que ele realize qualquer alteração real no cluster. Isso é extremamente útil para gerar, validar e inspecionar os manifestos YAML que serão aplicados.
- –dry-run=client: O comando é processado inteiramente no lado do cliente. Ele gera o objeto da API em formato YAML ou JSON, mas não o envia para o servidor da API do Kubernetes. É ideal para criar esqueletos de manifestos que serão posteriormente editados.
–dry-run=server: O comando é enviado ao servidor da API, que executa todas as etapas de validação (como autenticação, autorização e verificação de admission controllers), mas não persiste o objeto no etcd. Isso é útil para validar se um manifesto seria aceito pelo cluster.
2. Guia para Iniciantes: Comandos Essenciais
Para quem está começando, os comandos imperativos simplificados são uma ótima maneira de gerar manifestos básicos rapidamente.
| Recurso | Comando de Exemplo | Descrição |
|---|---|---|
| Deployment | kubectl create deploy nginx –image=nginx –dry-run=client -o yaml | Gera um manifesto para um Deployment simples com a imagem do Nginx. |
| Service | kubectl expose deploy nginx –port=8080 –target-port=80 –dry-run=client -o yaml | Cria um Service do tipo ClusterIP para expor a porta 80 do Deployment nginx na porta 8080 do Service. |
| Namespace | kubectl create namespace meu-app –dry-run=client -o yaml | Gera o manifesto para a criação de um novo Namespace. |
| Secret | kubectl create secret generic db-secret –from-literal=USER=admin –from-literal=PASS=1234 –dry-run=client -o yaml | Cria um Secret com dados sensíveis passados diretamente como literais. |
| Ingress | kubectl create ingress meu-ingress –class=nginx –rule=“app.com/*=meu-servico:80” –dry-run=client -o yaml | Gera uma regra de Ingress básica para rotear o tráfego para um Service. |
3. Geração de Manifestos para Recursos Comuns
À medida que a complexidade aumenta, comandos mais detalhados são necessários para configurar todos os aspectos dos recursos do Kubernetes.
3.1. Configuração e Armazenamento
# ConfigMap com múltiplos valores literais kubectl create configmap phpipam-config \ --from-literal=TZ="America/Sao_Paulo" \ --from-literal=SCAN_INTERVAL="1h" \ -n phpipam-system --dry-run=client -o yaml # Secret TLS a partir de arquivos de certificado e chave kubectl create secret tls tls-secret-phpipam \ --cert=path/to/cert.crt \ --key=path/to/cert.key \ -n phpipam-system --dry-run=client -o yaml # PersistentVolumeClaim (PVC) para armazenamento persistente kubectl create pvc phpipam-db-pvc \ --namespace=phpipam-system \ --storage-class=default-storageclass \ --access-mode=ReadWriteOnce \ --requests=storage=15Gi \ --dry-run=client -o yaml
3.2. Cargas de Trabalho (Workloads)
# Deployment com réplicas e variáveis de ambiente kubectl create deployment phpipam-web \ --image=phpipam/phpipam-www:v1.7.4 \ --namespace=phpipam-system \ --replicas=1 \ --port=80 \ --env="TZ=America/Sao_Paulo" \ --dry-run=client -o yaml # StatefulSet para aplicações com estado, como bancos de dados kubectl create statefulset phpipam-db \ --image=mariadb:11.8 \ --namespace=phpipam-system \ --service=phpipam-db \ --dry-run=client -o yaml # CronJob para tarefas agendadas, como backups kubectl create cronjob phpipam-backup \ --image=mariadb:11.8 \ --namespace=phpipam-system \ --schedule="0 2 * * *" \ --dry-run=client -o yaml
3.3. Rede (Networking)
# Service do tipo ClusterIP (padrão, para comunicação interna) kubectl create service clusterip phpipam-web \ --tcp=80:80 \ --namespace=phpipam-system --dry-run=client -o yaml # Service do tipo NodePort (expõe em uma porta estática em cada nó) kubectl create service nodeport phpipam-web \ --tcp=80:80 \ --node-port=30080 \ --namespace=phpipam-system --dry-run=client -o yaml # Service Headless (para descoberta de serviço com StatefulSets) kubectl create service clusterip phpipam-db \ --tcp=3306:3306 \ --clusterip="None" \ --namespace=phpipam-system --dry-run=client -o yaml
3.4. Políticas e Controle de Acesso
# ServiceAccount, Role e RoleBinding (RBAC) kubectl create serviceaccount phpipam-sa -n phpipam-system --dry-run=client -o yaml kubecl create role phpipam-role --verb=get,list --resource=pods -n phpipam-system --dry-run=client -o yaml kubectl create rolebinding phpipam-rb --role=phpipam-role --serviceaccount=phpipam-system:phpipam-sa -n phpipam-system --dry-run=client -o yaml # NetworkPolicy para restringir o tráfego de rede kubectl create networkpolicy phpipam-netpol \ --pod-selector=app=phpipam-web \ --ingress='[{"from":[{"podSelector":{"matchLabels":{"app":"ingress"}}}]}]' \ -n phpipam-system --dry-run=client -o yaml
3.5. Gerenciamento de Recursos e Alta Disponibilidade
# ResourceQuota para limitar o consumo de recursos em um Namespace kubectl create quota phpipam-quota \ --hard=pods=10,cpu=2,memory=4Gi \ -n phpipam-system --dry-run=client -o yaml # HorizontalPodAutoscaler (HPA) para escalar automaticamente os Pods kubectl autoscale deployment phpipam-web \ --min=1 --max=3 --cpu-percent=80 \ -n phpipam-system --dry-run=client -o yaml # PodDisruptionBudget (PDB) para garantir a disponibilidade durante manutenções kubectl create poddisruptionbudget phpipam-pdb \ --selector=app=phpipam-web \ --max-unavailable=1 \ -n phpipam-system --dry-run=client -o yaml
4. Fluxo de Trabalho Completo para phpIPAM
Este fluxo demonstra como usar o dry-run para gerar a base de uma aplicação completa e, em seguida, customizá-la.
Passo 1: Geração Automática de Manifestos com Script
O script a seguir gera todos os manifestos básicos necessários para a aplicação phpIPAM, incluindo Namespace, ConfigMap, Secret, PVC, Deployments e Services.
#!/bin/bash # generate-phpipam-manifests.sh NAMESPACE="phpipam-system" echo "=== Gerando todos os manifests para phpIPAM no namespace $NAMESPACE ===" mkdir -p phpipam-manifests cd phpipam-manifests # Namespace kubectl create namespace $NAMESPACE --dry-run=client -o yaml > 00-namespace.yaml # ConfigMap kubectl create configmap phpipam-config \ --from-literal=TZ="America/Sao_Paulo" \ --from-literal=IPAM_DATABASE_HOST="phpipam-db" \ -n $NAMESPACE --dry-run=client -o yaml > 01-configmap.yaml # Secret (com placeholders) kubectl create secret generic phpipam-secrets \ --from-literal=DB_ROOT_PASSWORD="CHANGE_ME" \ --from-literal=DB_PASSWORD="CHANGE_ME" \ -n $NAMESPACE --dry-run=client -o yaml > 02-secrets.yaml # PVC kubectl create pvc phpipam-db-pvc \ --namespace=$NAMESPACE \ --access-mode=ReadWriteOnce \ --requests=storage=15Gi \ --dry-run=client -o yaml > 03-pvc-db.yaml # Deployment e Service do Banco de Dados (MariaDB) kubectl create deployment phpipam-db --image=mariadb:11.8 -n $NAMESPACE --dry-run=client -o yaml > 04-deployment-db.yaml kubectl create service clusterip phpipam-db --tcp=3306:3306 -n $NAMESPACE --dry-run=client -o yaml > 05-service-db.yaml # Deployment e Service da Aplicação Web (phpIPAM) kubectl create deployment phpipam-web --image=phpipam/phpipam-www:v1.7.4 -n $NAMESPACE --dry-run=client -o yaml > 06-deployment-web.yaml kubectl create service clusterip phpipam-web --tcp=80:80 -n $NAMESPACE --dry-run=client -o yaml > 07-service-web.yaml # Ingress kubectl create ingress phpipam-ingress \ --class=nginx \ --rule="ipam.example.com/*=phpipam-web:80" \ -n $NAMESPACE --dry-run=client -o yaml > 08-ingress.yaml echo " Manifests gerados em 'phpipam-manifests/'!" echo " === PRÓXIMOS PASSOS ===" echo "1. Edite os arquivos gerados para adicionar configurações avançadas." echo "2. Gere senhas seguras e atualize '02-secrets.yaml' (use codificação base64)." echo "3. Aplique os manifestos: kubectl apply -f ."
Passo 2: Edição e Customização Manual
O dry-run gera uma base sólida, mas não cobre todas as configurações. Após a geração, é crucial editar os manifestos para adicionar detalhes específicos da aplicação.
Principais edições necessárias para o phpIPAM:
- Capabilities de Rede: Adicionar
NET_ADMINeNET_RAWaosecurityContextdo container para permitir que o phpIPAM execute scans de rede. - Variáveis de Ambiente Complexas: Configurar variáveis que buscam valores de Secrets ou ConfigMaps (usando
valueFrom). - Volumes e
volumeMounts: Montar oPersistentVolumeClaimno Pod do banco de dados para garantir a persistência dos dados. Resources(requests/limits): Definir requisições e limites de CPU e memória para garantir a estabilidade e o bom uso dos recursos do cluster.Probes(liveness/readiness): Configurar verificações de saúde para que o Kubernetes saiba quando um container está pronto para receber tráfego ou precisa ser reiniciado.
Exemplo de edição no 06-deployment-web.yaml:
# ... (início do arquivo) spec: template: spec: containers: - name: phpipam-web image: phpipam/phpipam-www:v1.7.4 # ADIÇÕES MANUAIS ABAIXO ports: - containerPort: 80 env: - name: IPAM_DATABASE_PASS valueFrom: secretKeyRef: name: phpipam-secrets key: DB_PASSWORD resources: requests: cpu: "250m" memory: "256Mi" limits: cpu: "500m" memory: "512Mi" readinessProbe: httpGet: path: /login port: 80 initialDelaySeconds: 10 periodSeconds: 5 securityContext: capabilities: add: ["NET_ADMIN", "NET_RAW"] # ... (resto do arquivo)
5. Dicas e Limitações
Dicas Avançadas
- Visualizar diferenças: Antes de aplicar uma alteração, veja o que mudará com
kubectl diff -f seu-arquivo.yaml. - Validar no servidor: Para uma validação mais completa, use
–dry-run=server. - Mudar formato de saída: Gere a saída em JSON com
-o jsonou em um formato mais detalhado com-o wide.
Limitações do ''dry-run''
- Não gera configurações complexas:
securityContext,probes,volumeMountse outras seções avançadas geralmente precisam ser adicionadas manualmente. - Não valida referências: O
dry-run=clientnão verifica se osSecretsouConfigMapsreferenciados realmente existem no cluster. - Suporte limitado: Alguns recursos mais novos ou Custom Resource Definitions (CRDs) podem não ter suporte completo para geração via comandos imperativos.
Conclusão
O kubectl –dry-run é uma ferramenta indispensável no fluxo de trabalho de um administrador Kubernetes. Ele acelera a criação de manifestos, reduz erros e serve como um excelente ponto de partida para a configuração de aplicações. A abordagem recomendada é usar o dry-run para gerar o esqueleto dos manifestos e, em seguida, investir tempo na revisão e customização manual para atender aos requisitos específicos de produção, segurança e resiliência da sua aplicação.
