ConfigMaps e Secrets no Kubernetes: Guia Completo para Configurações Seguras e Ágeis
Visão geral
No Kubernetes, a lógica de configuração das aplicações fica separada da imagem do container. Essa separação é feita principalmente com ConfigMaps (para dados não sensíveis) e Secrets (para informações confidenciais). Ambos podem ser injetados nos containers via variáveis de ambiente ou como arquivos montados em volumes, mas cada um tem um propósito distinto.
1. Injetando dados nos containers
1.1 Variáveis de ambiente (env)
ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
APP_MODE: "production"
LOG_LEVEL: "debug"
# trecho do pod
env:
- name: APP_MODE
valueFrom:
configMapKeyRef:
name: app-config
key: APP_MODE
Secret
apiVersion: v1
kind: Secret
metadata:
name: app-secret
type: Opaque
data:
DB_PASSWORD: cGFzc3dvcmQ= # "password" em base64
# trecho do pod
env:
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: app-secret
key: DB_PASSWORD
1.2 Volumes montados
ConfigMap como volume
volumes:
- name: config-volume
configMap:
name: app-config
containers:
- name: app
volumeMounts:
- mountPath: /etc/config
name: config-volume
Secret como volume
volumes:
- name: secret-volume
secret:
secretName: app-secret
containers:
- name: app
volumeMounts:
- mountPath: /etc/secret
name: secret-volume
2. ConfigMap vs. Secret
| Característica | ConfigMap | Secret |
|---|---|---|
| Objetivo | Parâmetros, flags e arquivos de configuração que não são sensíveis | Senhas, tokens, chaves, certificados |
| Formato | Texto puro | Dados codificados em base64 (apenas para serialização) |
| Armazenamento | Não criptografado por padrão | Não criptografado por padrão; recomenda‑se habilitar criptografia em repouso (etcd) |
| Tamanho típico | Pode ser maior, usado para blocos de configuração | Ideal para pequenos blocos de dados confidenciais |
| Controle de acesso | RBAC mais permissivo | RBAC rigoroso; permissões de leitura devem ser restritas |
| Uso comum | Variáveis de ambiente, arquivos de configuração, flags de inicialização | Credenciais de banco, tokens de API, certificados TLS |
3. Boas práticas
- Mantenha a configuração fora da imagem – Use ConfigMaps para valores que podem mudar sem necessidade de rebuild.
- Separe sempre os dados sensíveis – Armazene credenciais, chaves e certificados em Secrets.
- Organize por namespaces e labels – Facilita a descoberta e o controle de acesso.
- RBAC restrito para Secrets – Conceda
get/listapenas a quem realmente precisa. - Criptografia em repouso – Ative a criptografia de Secrets no etcd.
- Monte Secrets como volumes – Evita que valores apareçam em processos ou logs.
- Não registre Secrets em logs – Remova qualquer impressão de variáveis sensíveis.
- Rotacione Secrets regularmente – Atualize senhas e tokens periodicamente.
4. Operações rápidas com a CLI
# Criar um Secret a partir de um literal
kubectl create secret generic app-secret \
--from-literal=DB_PASSWORD=senhaSegura123
# Criar um ConfigMap a partir de literais
kubectl create configmap app-config \
--from-literal=LOG_LEVEL=info \
--from-literal=APP_ENV=production
Depois, basta referenciar o ConfigMap ou Secret nos manifests de Pods, Deployments ou StatefulSets conforme os exemplos da seção 1.
5. Resumo rápido
| Recurso | Quando usar | Como injetar | Segurança |
|---|---|---|---|
| ConfigMap | Dados de configuração que não são confidenciais | Variáveis de ambiente ou volume | Acesso menos restrito; não criptografado |
| Secret | Credenciais, tokens, chaves, certificados | Variáveis de ambiente ou volume (preferível) | Criptografia em repouso recomendada + RBAC estrito |
6. Conclusão
Separar configuração e dados sensíveis usando ConfigMaps e Secrets é essencial para manter ambientes Kubernetes seguros e ágeis. Compreender as diferenças, aplicar as boas práticas de isolamento e proteger os Secrets reduz vulnerabilidades e simplifica a gestão de configurações dinâmicas.
Nos próximos artigos vamos aprofundar em volumes persistentes, StorageClasses e estratégias avançadas de segurança de dados no Kubernetes.