====== 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_ADMIN'' e ''NET_RAW'' ao ''securityContext'' do 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 o ''PersistentVolumeClaim'' no 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 json'' ou em um formato mais detalhado com ''-o wide''. ==== Limitações do ''dry-run'' ==== - **Não gera configurações complexas**: ''securityContext'', ''probes'', ''volumeMounts'' e outras seções avançadas geralmente precisam ser adicionadas manualmente. - **Não valida referências**: O ''dry-run=client'' não verifica se os ''Secrets'' ou ''ConfigMaps'' referenciados 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.