configmap.yml
Descrição: este arquivo cria um ConfigMap no Kubernetes.
Um ConfigMap é usado para armazenar dados de configuração não sensíveis em pares chave/valor, para que Pods e aplicações possam consumir essas informações sem que elas fiquem fixas dentro da imagem do container.
Ele permite separar configuração da imagem da aplicação. Assim, a mesma imagem pode ser usada em desenvolvimento, homologação e produção, mudando apenas o ConfigMap aplicado no namespace.
No arquivo de referência do cluster, o recurso aparece como:
Recurso: configmaps
Tipo: ConfigMap
Versão: v1
TIPO: ConfigMap
VERSÃO: v1
DESCRIÇÃO:
ConfigMap contém dados de configuração para consumo pelos pods.
Quando usar ConfigMap
Use ConfigMap quando a aplicação precisa consumir configuração não sensível, como:
- nome do ambiente;
- URL de serviço interno;
- modo de execução;
- nível de log;
- nome de fila;
- porta lógica da aplicação;
- flags de recurso;
- parâmetros de comportamento;
- arquivos de configuração;
- templates de configuração;
- configurações lidas como variáveis de ambiente;
- configurações montadas como arquivos dentro do container;
- argumentos de comando baseados em configuração.
Exemplos comuns:
AMBIENTE=homologacao;LOG_LEVEL=info;API_URL=http://backend;REDIS_HOST=redis;FEATURE_X_ENABLED=true;- arquivo
application.properties; - arquivo
nginx.conf; - arquivo
config.yaml; - arquivo
.envnão sensível; - configuração de aplicação de laboratório;
- parâmetros de sistema acadêmico, administrativo ou de pesquisa.
Quando ConfigMap não é o recurso indicado
ConfigMap não é o melhor recurso quando o problema exige outro tipo de controle.
| Necessidade | Recurso mais indicado | Motivo |
|---|---|---|
| Guardar senha, token ou chave privada | Secret |
ConfigMap não foi feito para dados sensíveis. |
| Executar aplicação | Deployment |
ConfigMap apenas armazena configuração. |
| Criar endereço de rede para Pods | Service |
ConfigMap não expõe aplicação. |
| Publicar por domínio HTTP/HTTPS | Ingress |
ConfigMap não faz roteamento de entrada. |
| Persistir dados da aplicação | PersistentVolumeClaim |
ConfigMap não é volume persistente de dados. |
| Controlar CPU/memória | ResourceQuota, LimitRange ou resources |
ConfigMap não controla recursos computacionais. |
| Isolar rede entre aplicações | NetworkPolicy |
ConfigMap não controla tráfego. |
| Rodar tarefa pontual | Job |
ConfigMap não executa tarefas. |
| Rodar tarefa agendada | CronJob |
ConfigMap não agenda execução. |
| Configuração muito grande | Arquivo externo, volume persistente ou solução própria | ConfigMap tem limite de tamanho e não deve virar repositório de arquivos grandes. |
| Configuração que precisa de criptografia forte | Secret ou ferramenta externa de segredo |
ConfigMap não fornece sigilo. |
Uso em cenário de universidade
Em uma universidade, um ConfigMap pode ser usado para padronizar configurações de aplicações acadêmicas, administrativas, laboratoriais e de pesquisa sem rebuildar imagens de container para cada ambiente.
Exemplos:
- definir
AMBIENTE=homologacaopara sistema em teste; - definir URL interna de API usada por um frontend;
- configurar nível de log de uma aplicação de laboratório;
- montar arquivo de configuração de uma aplicação web;
- separar configuração de desenvolvimento, homologação e produção;
- parametrizar aplicações de disciplinas;
- manter a mesma imagem da aplicação em vários namespaces;
- permitir que equipes alterem configuração sem alterar o Dockerfile;
- organizar configurações por projeto, sistema, laboratório ou ambiente.
Uso recomendado em ambiente universitário:
- um
Namespacepor projeto, sistema, disciplina, laboratório ou ambiente; - um
ConfigMappor aplicação ou componente; - um
Deploymentconsumindo o ConfigMap porenv,envFromou volume; - um
Secretseparado para dados sensíveis; - nomes claros e padronizados para ConfigMaps;
- GitLab, Argo CD ou outro GitOps/CI para aplicar os manifestos;
- evitar colocar senha, token, chave privada ou certificado em ConfigMap;
- versionar mudanças de configuração no repositório quando não forem sensíveis;
- usar
immutable: truequando a configuração não deve mudar em runtime.
Exemplo completo: configmap.yml
apiVersion: v1
kind: ConfigMap
metadata:
name: minha-aplicacao-config
namespace: meu-projeto
labels:
app: minha-aplicacao
ambiente: homologacao
componente: configuracao
annotations:
descricao: "ConfigMap exemplo para configuração não sensível da aplicação"
immutable: false
data:
AMBIENTE: "homologacao"
LOG_LEVEL: "info"
API_URL: "http://minha-api"
FEATURE_X_ENABLED: "true"
application.yaml: |
servidor:
porta: 8080
log:
nivel: info
recurso:
habilitado: true
binaryData:
exemplo.bin: "AAEC"
Explicação linha por linha
apiVersion: v1
Define a versão da API usada pelo manifesto.
Para ConfigMap, normalmente é:
apiVersion: v1
Significado:
v1: versão estável da API core do Kubernetes.
Use exatamente v1 para ConfigMap.
kind: ConfigMap
Define o tipo de recurso que será criado.
kind: ConfigMap
Significado:
ConfigMap: recurso que armazena dados de configuração não sensíveis para consumo por Pods.
Não confundir com:
Secret: guarda dados sensíveis;Deployment: cria e atualiza Pods;Service: expõe Pods na rede;Ingress: publica Services por HTTP/HTTPS;PersistentVolumeClaim: fornece armazenamento persistente.
metadata
metadata identifica e organiza o ConfigMap.
metadata:
name: minha-aplicacao-config
namespace: meu-projeto
labels:
app: minha-aplicacao
annotations:
descricao: "ConfigMap exemplo"
metadata.name
Nome do ConfigMap.
name: minha-aplicacao-config
Uso:
- identifica o recurso dentro do namespace;
- aparece em
kubectl get configmaps; - é referenciado por Pods, Deployments e outros recursos;
- deve ser único dentro do namespace.
Exemplos bons:
name: portal-academico-config
name: api-pesquisa-config
name: backend-laboratorio-config
Regras práticas:
- use letras minúsculas;
- use hífen;
- evite acentos;
- evite espaços;
- escolha nome curto e claro;
- use sufixo
-configquando ajudar na padronização.
metadata.namespace
Namespace onde o ConfigMap será criado.
namespace: meu-projeto
Uso:
- separa configurações por projeto;
- evita mistura entre ambientes;
- permite ter ConfigMaps com o mesmo nome em namespaces diferentes;
- ajuda em RBAC, quotas, isolamento e organização.
Regra importante:
- o Pod ou Deployment que consome o ConfigMap normalmente precisa estar no mesmo namespace do ConfigMap.
Se omitir:
- Kubernetes usa o namespace atual do contexto;
- em produção isso pode causar ConfigMap no namespace errado.
Recomendação:
- sempre declarar
namespace.
metadata.labels
Labels são pares chave/valor usados para organização e filtros.
labels:
app: minha-aplicacao
ambiente: homologacao
componente: configuracao
Uso:
- filtrar ConfigMaps com
kubectl; - organizar recursos;
- permitir automações;
- associar recursos ao mesmo sistema;
- ajudar ferramentas de observabilidade e GitOps.
Exemplo:
kubectl get configmaps -l app=minha-aplicacao
Boas labels:
app: minha-aplicacao
ambiente: producao
componente: configuracao
Evite usar label com dado sensível.
metadata.annotations
Annotations são metadados livres.
annotations:
descricao: "ConfigMap da aplicação"
Uso:
- documentação;
- configuração de ferramentas;
- automações;
- rastreabilidade;
- integração com GitOps.
Diferença entre labels e annotations:
| Campo | Uso |
|---|---|
labels |
seleção, filtro e organização |
annotations |
informação extra e configuração de ferramentas |
Campos de metadata normalmente gerenciados pelo Kubernetes
O kubectl explain mostra vários campos de metadata, mas muitos são preenchidos pelo próprio cluster.
Normalmente você não escreve manualmente:
creationTimestamp:
deletionTimestamp:
resourceVersion:
uid:
generation:
managedFields:
selfLink:
Eles servem para controle interno do Kubernetes.
data
data armazena dados de configuração em formato texto.
data:
AMBIENTE: "homologacao"
LOG_LEVEL: "info"
API_URL: "http://minha-api"
Formato:
chave: valor
Uso:
- variáveis de ambiente;
- arquivos de configuração em texto;
- parâmetros simples;
- conteúdo YAML, JSON, properties, conf, ini etc.
Regras importantes:
- chaves devem usar caracteres válidos;
- valores em
datasão texto; - dados não UTF-8 devem ficar em
binaryData; - uma chave não pode existir ao mesmo tempo em
dataebinaryData.
Exemplos de chaves válidas:
data:
LOG_LEVEL: "info"
application.yaml: |
log:
level: info
nginx.conf: |
server {
listen 80;
}
Chaves simples em data
data:
AMBIENTE: "homologacao"
LOG_LEVEL: "info"
Uso:
- consumir como variável de ambiente;
- consumir via
envFrom; - parametrizar aplicação sem rebuild da imagem.
Exemplo de consumo no Deployment:
envFrom:
- configMapRef:
name: minha-aplicacao-config
Arquivos em data
Uma chave do ConfigMap pode representar um arquivo.
data:
application.yaml: |
servidor:
porta: 8080
log:
nivel: info
Quando montado como volume, essa chave vira um arquivo chamado:
application.yaml
Exemplo de montagem:
volumes:
- name: config
configMap:
name: minha-aplicacao-config
containers:
- name: app
volumeMounts:
- name: config
mountPath: /app/config
Resultado dentro do container:
/app/config/application.yaml
binaryData
binaryData armazena dados binários.
binaryData:
exemplo.bin: "AAEC"
Uso:
- conteúdo que não é texto UTF-8;
- pequenos arquivos binários;
- dados que precisam ser representados como bytes.
Regras importantes:
- valores são representados em base64 no manifesto;
- chaves de
binaryDatanão podem repetir chaves dedata; - não use para segredo sensível; para isso use
Secret.
Exemplo:
binaryData:
arquivo.bin: "AAEC"
Cuidado:
- ConfigMap não é recomendado para arquivos grandes;
- ConfigMap não fornece criptografia nem sigilo;
- se o dado é sensível, use
Secret.
immutable
Define se o conteúdo do ConfigMap pode ser alterado depois de criado.
immutable: false
Valores:
immutable: true
immutable: false
immutable: false
Permite alterar data e binaryData.
immutable: false
Uso:
- configuração que pode mudar;
- ambiente de desenvolvimento;
- homologação;
- ConfigMaps simples.
Também pode ser omitido quando não houver necessidade de imutabilidade.
immutable: true
Impede alteração futura de data e binaryData.
immutable: true
Uso:
- configuração versionada;
- produção;
- evitar mudanças acidentais;
- melhorar previsibilidade do ambiente;
- ConfigMap referenciado por aplicações críticas.
Cuidado:
- depois de marcado como imutável, não é possível voltar para mutável;
- não é possível alterar
dataoubinaryData; - para mudar a configuração, crie outro ConfigMap ou delete e recrie o objeto;
- Pods que montam o ConfigMap antigo podem continuar referenciando o conteúdo antigo até serem atualizados/recriados.
kind
O campo kind já aparece no topo do manifesto.
kind: ConfigMap
Ele indica que este objeto é um ConfigMap.
apiVersion
O campo apiVersion já aparece no topo do manifesto.
apiVersion: v1
Ele indica que este objeto usa a API core v1.
Como consumir ConfigMap em um Deployment
Um ConfigMap sozinho não altera uma aplicação.
Ele precisa ser consumido por um Pod, normalmente dentro de um Deployment.
Consumo com env
Use env quando quiser escolher chaves específicas.
env:
- name: LOG_LEVEL
valueFrom:
configMapKeyRef:
name: minha-aplicacao-config
key: LOG_LEVEL
Uso:
- importar uma chave específica;
- controlar exatamente quais valores entram no container;
- evitar importar variáveis desnecessárias.
Consumo com envFrom
Use envFrom quando quiser importar todas as chaves como variáveis de ambiente.
envFrom:
- configMapRef:
name: minha-aplicacao-config
Uso:
- muitas variáveis simples;
- configuração no estilo
.env; - aplicações que já leem tudo por ambiente.
Cuidado:
- todas as chaves viram variáveis de ambiente;
- nomes de chaves precisam ser válidos como variáveis de ambiente;
- pode importar mais configuração do que a aplicação precisa.
Consumo como volume
Use volume quando a aplicação espera arquivo de configuração.
volumes:
- name: config
configMap:
name: minha-aplicacao-config
containers:
- name: app
volumeMounts:
- name: config
mountPath: /app/config
readOnly: true
Uso:
application.yaml;application.properties;nginx.conf;config.json;- arquivos de template.
Consumo como argumento de comando
ConfigMaps podem ser usados para definir variáveis que depois são usadas em comandos ou argumentos do container.
Exemplo:
env:
- name: PORTA
valueFrom:
configMapKeyRef:
name: minha-aplicacao-config
key: PORTA
args:
- "--porta=$(PORTA)"
Uso:
- aplicação recebe configuração via argumentos;
- imagem de container já suporta flags;
- configuração precisa entrar no processo no momento da inicialização.
Observações sobre atualização
Alterar um ConfigMap não significa que toda aplicação consumidora será reiniciada automaticamente.
Quando usado como variável de ambiente
Se o ConfigMap é consumido por env ou envFrom:
- o valor é definido na criação do Pod;
- Pods existentes não recebem automaticamente a nova variável;
- normalmente é necessário reiniciar o Deployment ou recriar os Pods.
Comando comum:
kubectl rollout restart deployment/minha-aplicacao -n meu-projeto
Quando usado como volume
Se o ConfigMap é montado como volume:
- o conteúdo projetado no volume pode ser atualizado pelo kubelet;
- a aplicação precisa ser capaz de reler o arquivo;
- se a aplicação só lê o arquivo na inicialização, pode ser necessário reiniciar o Pod.
Cuidado:
- ConfigMap montado usando
subPathnão recebe atualizações automáticas do volume projetado.
Limite de tamanho
ConfigMap não deve ser usado para dados grandes.
Regra prática:
- use ConfigMap para configuração pequena;
- evite arquivos grandes;
- evite muitos dados acumulados;
- para arquivos grandes, use imagem, volume, PVC, objeto externo ou outra solução adequada.
O limite documentado para ConfigMap é de até 1 MiB.
status
ConfigMap não possui uma seção status no manifesto de referência.
Você normalmente trabalha com:
apiVersion
kind
metadata
data
binaryData
immutable
Para ver o objeto aplicado:
kubectl get configmap minha-aplicacao-config -n meu-projeto -o yaml
Manifesto mínimo funcional
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-config
namespace: meu-projeto
data:
NOME_AMBIENTE: "homologacao"
Aplicar:
kubectl apply -f configmap.yml
Verificar:
kubectl get configmap nginx-config -n meu-projeto
kubectl describe configmap nginx-config -n meu-projeto
Manifesto recomendado para aplicação web simples
apiVersion: v1
kind: ConfigMap
metadata:
name: app-web-config
namespace: meu-projeto
labels:
app: app-web
componente: configuracao
data:
AMBIENTE: "homologacao"
LOG_LEVEL: "info"
API_URL: "http://app-web-api"
FEATURE_X_ENABLED: "false"
Este modelo é adequado para uma aplicação web/API que recebe configuração não sensível por variáveis de ambiente.
Manifesto com arquivo de configuração
apiVersion: v1
kind: ConfigMap
metadata:
name: app-web-config
namespace: meu-projeto
labels:
app: app-web
data:
application.yaml: |
servidor:
porta: 8080
log:
nivel: info
recurso:
habilitado: false
Uso comum:
- montar o ConfigMap como volume;
- aplicação lê
/app/config/application.yaml; - configuração fica separada da imagem.
Manifesto com ConfigMap imutável
apiVersion: v1
kind: ConfigMap
metadata:
name: app-web-config-v1
namespace: meu-projeto
labels:
app: app-web
immutable: true
data:
AMBIENTE: "producao"
LOG_LEVEL: "warn"
Uso:
- configuração versionada;
- produção;
- evitar alteração acidental.
Para mudar:
- crie outro ConfigMap, por exemplo
app-web-config-v2; - atualize o Deployment para usar o novo nome;
- faça rollout da aplicação.
Exemplo de Deployment consumindo ConfigMap por envFrom
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-web
namespace: meu-projeto
spec:
replicas: 1
selector:
matchLabels:
app: app-web
template:
metadata:
labels:
app: app-web
spec:
containers:
- name: app
image: registry.exemplo.local/projeto/app-web:1.0.0
envFrom:
- configMapRef:
name: app-web-config
Exemplo de Deployment consumindo ConfigMap como volume
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-web
namespace: meu-projeto
spec:
replicas: 1
selector:
matchLabels:
app: app-web
template:
metadata:
labels:
app: app-web
spec:
containers:
- name: app
image: registry.exemplo.local/projeto/app-web:1.0.0
volumeMounts:
- name: config
mountPath: /app/config
readOnly: true
volumes:
- name: config
configMap:
name: app-web-config
Comandos úteis
Aplicar
kubectl apply -f configmap.yml
Ver ConfigMaps
kubectl get configmaps -n meu-projeto
Ver ConfigMap específico
kubectl get configmap minha-aplicacao-config -n meu-projeto
Ver detalhes
kubectl describe configmap minha-aplicacao-config -n meu-projeto
Ver YAML real aplicado
kubectl get configmap minha-aplicacao-config -n meu-projeto -o yaml
Criar ConfigMap por literal
kubectl create configmap minha-aplicacao-config \
-n meu-projeto \
--from-literal=AMBIENTE=homologacao \
--from-literal=LOG_LEVEL=info
Criar ConfigMap a partir de arquivo
kubectl create configmap minha-aplicacao-config \
-n meu-projeto \
--from-file=application.yaml
Criar ConfigMap a partir de diretório
kubectl create configmap minha-aplicacao-config \
-n meu-projeto \
--from-file=./config/
Editar ConfigMap
kubectl edit configmap minha-aplicacao-config -n meu-projeto
Reiniciar Deployment após mudança em ConfigMap
kubectl rollout restart deployment/minha-aplicacao -n meu-projeto
Ver Pods que usam uma label da aplicação
kubectl get pods -n meu-projeto -l app=minha-aplicacao
Relação com outros manifestos
Um ConfigMap normalmente faz parte de um conjunto de manifestos.
Uso típico:
Namespace
├── ConfigMap
├── Secret
├── ServiceAccount
├── Deployment
├── Service
├── Ingress
├── NetworkPolicy
├── ResourceQuota
└── LimitRange
ConfigMap + Deployment
ConfigMap fornece configuração.
Deployment consome essa configuração nos Pods.
ConfigMap + Secret
ConfigMap guarda dados não sensíveis.
Secret guarda dados sensíveis.
ConfigMap + Volume
ConfigMap pode ser montado como arquivos dentro do container.
ConfigMap + env/envFrom
ConfigMap pode virar variável de ambiente no container.
ConfigMap + GitOps
ConfigMap pode ser versionado junto dos manifestos da aplicação, quando não contém dados sensíveis.
Erros comuns
Colocar senha em ConfigMap
Errado:
data:
SENHA_BANCO: "senha123"
Correto:
Use Secret para senha, token, chave privada e credencial.
Alterar ConfigMap e esperar que env mude em Pods já existentes
Quando o ConfigMap é consumido como variável de ambiente, Pods existentes não recebem automaticamente o novo valor.
Depois de alterar:
kubectl rollout restart deployment/minha-aplicacao -n meu-projeto
ConfigMap no namespace errado
Sintoma:
- Deployment referencia ConfigMap;
- Pod não inicia;
- evento mostra ConfigMap não encontrado.
Verificar:
kubectl get configmap -A | grep minha-aplicacao-config
kubectl describe pod -n meu-projeto POD
Correção:
- criar o ConfigMap no mesmo namespace do Deployment/Pod;
- ou corrigir o namespace do manifesto.
Chave inexistente
Errado:
env:
- name: LOG_LEVEL
valueFrom:
configMapKeyRef:
name: app-config
key: LOGLEVEL
Mas no ConfigMap existe:
data:
LOG_LEVEL: "info"
Correção:
key: LOG_LEVEL
Usar binaryData para dado sensível
binaryData não significa segredo.
Errado:
binaryData:
senha.txt: "..."
Correto:
Use Secret para dados sensíveis.
Repetir a mesma chave em data e binaryData
Errado:
data:
arquivo: "texto"
binaryData:
arquivo: "AAEC"
A mesma chave não pode existir nos dois campos.
ConfigMap grande demais
ConfigMap não é para armazenar arquivos grandes.
Evite:
- arquivos extensos;
- dumps;
- binários grandes;
- conteúdo que deveria estar em imagem, PVC ou storage externo.
Usar subPath esperando atualização automática
Quando ConfigMap é montado com subPath, atualizações do ConfigMap não são refletidas automaticamente naquele arquivo montado.
Se precisa atualização dinâmica:
- monte o ConfigMap como volume normal;
- ou reinicie os Pods após alteração.
Criar ConfigMap imutável e tentar editar depois
Se immutable: true, não é possível alterar data e binaryData.
Solução:
- criar novo ConfigMap com outro nome;
- atualizar o Deployment;
- fazer rollout;
- remover o ConfigMap antigo quando não estiver mais em uso.
Checklist para uso em produção
Antes de aplicar um ConfigMap em ambiente compartilhado:
-
namespacedefinido; -
nameclaro; -
labelsclaras; - contém apenas dados não sensíveis;
- senhas/tokens/chaves foram colocados em Secret, não em ConfigMap;
- chaves têm nomes claros;
- chaves de
datanão repetem chaves debinaryData; - valores em
datasão texto; - dados binários pequenos usam
binaryData; - ConfigMap não ultrapassa limite de tamanho;
- aplicação sabe consumir a configuração;
- Deployment referencia o ConfigMap correto;
- ConfigMap está no mesmo namespace do Pod/Deployment;
- mudança em ConfigMap tem estratégia de rollout;
-
immutable: truefoi usado apenas quando faz sentido; - configuração de produção não depende de edição manual fora do GitOps;
- alteração de configuração foi testada em homologação.
Resumo
Use ConfigMap para armazenar configuração não sensível consumida por Pods.
O ConfigMap controla:
- pares chave/valor de configuração;
- arquivos de configuração em texto;
- pequenos dados binários em
binaryData; - imutabilidade opcional com
immutable; - separação entre imagem da aplicação e configuração do ambiente.
Para aplicação web comum, o conjunto mínimo geralmente é:
Namespace + ConfigMap + Deployment + Service + Ingress
Para ambiente institucional compartilhado, o conjunto recomendado é:
Namespace + ResourceQuota + LimitRange + ServiceAccount + Role/RoleBinding
+ ConfigMap + Secret + Deployment + Service + Ingress + NetworkPolicy + PDB
Nenhum comentário para exibir
Nenhum comentário para exibir