
Curso Kubernetes 12 — ConfigMap, Secret e o guard de credenciais
Você não quer rebuildar a imagem para trocar uma URL. ConfigMap e Secret existem para separar configuração de código.
Mas há uma diferença perigosa entre “funciona” e “está seguro”. Um Secret com minioadmin já derrubou um deploy nosso — e o guard estava certo.
Selo do curso: testado em Kubernetes 1.35.
ConfigMap: configuração não sensível
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
APP_ENV: production
LOG_LEVEL: info
features.json: |
{"novoCheckout": true}
Três formas de consumir:
# 1) variável individual
env:
- name: APP_ENV
valueFrom:
configMapKeyRef:
name: app-config
key: APP_ENV
# 2) todas as chaves como variáveis
envFrom:
- configMapRef:
name: app-config
# 3) arquivo montado
volumes:
- name: config
configMap:
name: app-config
Secret: configuração sensível (com ressalvas)
kubectl create secret generic app-secret \
--from-literal=DB_PASSWORD='...' \
--from-literal=API_TOKEN='...'
env:
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: app-secret
key: DB_PASSWORD
Base64 não é criptografia. Qualquer pessoa com get secret vê o valor. Segurança de Secret depende de:
- RBAC restritivo.
- Criptografia do etcd em repouso.
- Não versionar secrets no Git.
- Rotação.
ConfigMap/Secret em volume
Montagem como arquivo:
volumes:
- name: secret
secret:
secretName: app-secret
Cada chave vira um arquivo. Atualizações no ConfigMap/Secret propagam para o volume (com atraso), mas não para variáveis de ambiente já injetadas. Se a aplicação lê env no boot, ela precisa reiniciar.
immutable: true impede alterações e reduz carga no kubelet; útil para configurações versionadas.
O guard de credenciais
Um guard de produção verifica se senhas default conhecidas estão em uso. Exemplo real:
INF-SEC-01: credenciais default/segredo ausente detetados em produção
(app.storage.s3.accessKey, app.storage.s3.secretKey).
O app recusou subir porque o secret tinha minioadmin. O guard estava certo; o cluster estava errado.
Lição prática: preflight no pipeline. Antes de trocar a imagem:
VAL=$(kubectl -n portal get secret portal-secrets \
-o jsonpath='{.data.APP_STORAGE_S3_ACCESSKEY}' | base64 -d)
[ "$VAL" != "minioadmin" ] || { echo "credencial default"; exit 1; }
Rotação sem downtime
- Crie a nova credencial no provedor (MinIO, banco, API).
- Atualize o Secret.
- Reinicie os pods que leem env (rolling update).
- Valide.
- Revogue a antiga.
Para segredos que não podem coexistir, planeje janela. Para os que suportam múltiplas chaves, faça rotação gradual.
Alternativas ao Secret nativo
| Ferramenta | Ideia |
|---|---|
| Sealed Secrets | secret criptografado no Git |
| External Secrets Operator | busca no Vault/AWS/GCP |
| SOPS | criptografia no repositório |
| Vault Agent Injector | injeta segredo em runtime |
O objetivo é o mesmo: o valor real não fica em texto claro no Git.
Laboratório
- Crie ConfigMap e Secret.
- Injete como env e como volume.
- Altere o ConfigMap e veja o arquivo atualizar (e o env não).
- Tente subir um pod com
secretKeyRefpara uma chave inexistente — veja o erro. - Decodifique o Secret e comprove que base64 não protege.
Erros comuns
| Sintoma | Causa |
|---|---|
CreateContainerConfigError |
chave do Secret/ConfigMap ausente |
| App não vê mudança | env injetado no boot; precisa restart |
illegal base64 data |
valor inválido no Secret |
Arquivo com \r |
CRLF no valor |
| Secret no Git | vazamento; rotacione |
| Guard derruba o pod | credencial default em produção |
Checklist
- [ ] Configuração não sensível em ConfigMap.
- [ ] Segredos em Secret com RBAC restrito.
- [ ] etcd com criptografia em repouso.
- [ ] Nenhum secret em texto claro no Git.
- [ ] Plano de rotação documentado.
- [ ] Preflight de credenciais no pipeline.
- [ ] Sei que base64 não é criptografia.
Glossário
- ConfigMap: configuração não sensível.
- Secret: objeto para dados sensíveis.
- envFrom: importa todas as chaves como env.
- immutable: objeto imutável.
- External Secrets: operador que sincroniza segredos externos.
- etcd encryption: criptografia do estado em repouso.
Próximo
Agora que a configuração está sob controle, vamos observar o cluster: metrics-server, Prometheus, Grafana e os sinais que realmente importam.
Próximo: Curso Kubernetes 13 — Observabilidade: metrics-server, Prometheus e Grafana
Continuar a ler
Leia também
KubernetesKubernetes de Verdade — do zero ao cluster em produção
Uma trilha prática para entender, montar e operar um cluster Kubernetes — do primeiro pod ao failover do Postgres.
4 min de leitura
KubernetesCurso Kubernetes 28 — DR e capstone: provar que o cluster volta
RPO, RTO e drills reais: cenários de desastre, runbook, restore medido e o capstone que fecha o curso com um cluster que se recupera.
5 min de leitura
KubernetesCurso Kubernetes 27 — SLO/SLI, on-call e postmortem blameless
O que prometer, como medir e o que fazer quando o erro estoura: SLI, SLO, error budget, alertas que acordam alguém e postmortem sem caça às bruxas.
4 min de leitura
Comentários
Ainda sem comentários
Seja o primeiro a compartilhar sua opinião sobre este artigo.
Deixe um comentário