Introdução
No desenvolvimento de software, inserir diretamente no código configurações como URLs de bancos de dados ou senhas é uma prática inadequada. Isso dificulta as alterações e aumenta os riscos de segurança.
O Kubernetes resolve esse problema com dois objetos:
- ConfigMap: imagine-o como um Quadro de Avisos Público. Você fixa informações nele, como “A cor de fundo é azul” ou “O endereço do banco de dados é 10.0.0.1”. Qualquer pessoa no escritório (os Pods) pode ler essas informações.
- Secret: usado para valores confidenciais, como senhas ou tokens.
Essa separação entre o código da aplicação e a configuração usada em tempo de execução é um princípio importante de design de plataformas, não apenas um recurso do Kubernetes.
Neste laboratório, você vai:
- Escrever uma mensagem no Quadro de Avisos (ConfigMap).
- Colocar uma senha no Cofre (Secret).
- Ensinar um Pod a ler os dois.
Criar um ConfigMap
Vamos criar um arquivo de configuração para um servidor web. Em vez de incorporá-lo à imagem, vamos armazená-lo em um ConfigMap.
Esse padrão faz parte de um princípio mais amplo de design de contêineres: criar uma única imagem reutilizável e fornecer a configuração específica do ambiente em tempo de execução. Assim, a imagem fica mais portável, pois desenvolvimento, homologação e produção podem usar o mesmo contêiner com configurações diferentes.
Primeiro, crie um arquivo de configuração simples do Nginx chamado nginx.conf:
echo 'events {} http { server { listen 80; location / { return 200 "Hello from ConfigMap!"; } } }' > nginx.conf
Agora, crie um ConfigMap chamado nginx-config a partir desse arquivo. Isso efetivamente “fixa” o arquivo no quadro de avisos do cluster Kubernetes.
kubectl create configmap nginx-config --from-file=nginx.conf
Verifique se ele existe:
kubectl describe configmap nginx-config
Você deverá ver o conteúdo de nginx.conf listado na seção “Data”.
Criar um Secret
Agora, vamos armazenar algo confidencial. Um Secret funciona de forma semelhante a um ConfigMap, mas o Kubernetes trata seus dados com cuidados adicionais (eles são ofuscados no armazenamento).
É importante ser preciso: um Secret é mais seguro do que inserir senhas diretamente em manifests ou imagens, mas a codificação base64 não é criptografia de verdade. Em produção, o gerenciamento de Secrets costuma ser combinado com criptografia em repouso, regras de RBAC mais restritivas e sistemas externos de gerenciamento de secrets.
Crie um Secret chamado app-secret para armazenar uma senha fictícia:
kubectl create secret generic app-secret --from-literal=password=SuperSecretPass123
Verifique se ele existe:
kubectl get secret app-secret
Se você consultar os detalhes, não verá a senha diretamente. Ela estará oculta (codificada).
kubectl get secret app-secret -o yaml
Observe que o campo password é formado por uma sequência embaralhada de caracteres. Essa é uma codificação base64, criada para evitar que a senha seja vista por quem observa sua tela ou apareça acidentalmente em logs.
Montar um ConfigMap como arquivo
Agora, vamos ensinar um Pod a ler o Quadro de Avisos.
A forma mais comum de usar um ConfigMap é montá-lo como um arquivo. Ele aparece dentro do contêiner como um arquivo comum no disco.
Essa abordagem baseada em arquivo é útil quando a aplicação já espera encontrar um arquivo de configuração em um determinado caminho. O Kubernetes projeta os dados do ConfigMap no sistema de arquivos do contêiner, permitindo que a aplicação continue usando seu comportamento normal de leitura de arquivos.
Crie um arquivo chamado pod-config.yaml:
nano pod-config.yaml
Cole o conteúdo a seguir. Esse Pod monta o ConfigMap nginx-config no caminho /etc/nginx/nginx.conf.
apiVersion: v1
kind: Pod
metadata:
name: config-pod
spec:
containers:
- name: nginx
image: nginx:alpine
volumeMounts:
- name: config-volume
mountPath: /etc/nginx/nginx.conf
subPath: nginx.conf
volumes:
- name: config-volume
configMap:
name: nginx-config
Salve e saia (Ctrl+X, Y, Enter).
Aplique a configuração:
kubectl apply -f pod-config.yaml
Aguarde alguns segundos para que o Pod seja iniciado. Agora, consulte o interior do contêiner para verificar se o arquivo está lá:
kubectl exec config-pod -- cat /etc/nginx/nginx.conf
Você deverá ver sua configuração personalizada. O Pod basicamente “leu o quadro de avisos” e usou esse arquivo.
Injetar um Secret como variável de ambiente
Agora vamos trabalhar com o Secret. Uma forma comum de passar senhas é usar variáveis de ambiente.
Esse método é conveniente, mas também mostra uma desvantagem. As aplicações conseguem ler variáveis de ambiente com facilidade, mas elas podem ser expostas por comandos de diagnóstico ou pela inspeção de processos. O Kubernetes oferece injeção baseada em arquivos e em variáveis de ambiente porque aplicações e perfis de risco diferentes exigem abordagens diferentes.
Crie um arquivo chamado pod-secret.yaml:
nano pod-secret.yaml
Cole o conteúdo a seguir. Esse Pod obtém o valor de password do app-secret e o atribui a uma variável de ambiente chamada APP_PASSWORD.
apiVersion: v1
kind: Pod
metadata:
name: secret-pod
spec:
containers:
- name: busybox
image: busybox
command: ["sleep", "3600"]
env:
- name: APP_PASSWORD
valueFrom:
secretKeyRef:
name: app-secret
key: password
Salve e saia (Ctrl+X, Y, Enter).
Aplique a configuração:
kubectl apply -f pod-secret.yaml
Quando o Pod estiver em execução, verifique as variáveis de ambiente dentro do contêiner:
kubectl exec secret-pod -- env | grep APP_PASSWORD
Você deverá ver APP_PASSWORD=SuperSecretPass123.
O ponto principal é que a definição do Pod não contém a senha. A senha fica no “Cofre” (Secret), e o Pod tem apenas uma chave para acessá-la em tempo de execução.
Resumo
Neste laboratório, você praticou a separação entre código e configuração.
Você conseguiu:
- Usar um ConfigMap (Quadro de Avisos) para injetar um arquivo de configuração em um servidor.
- Usar um Secret (Cofre) para injetar uma senha oculta em uma aplicação.
Com isso, você pode atualizar sua configuração ou alternar suas senhas sem precisar recriar suas imagens Docker.


