Secrets e ConfigMaps

KubernetesBeginner
Pratique Agora

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:

  1. 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.
  2. 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:

  1. Usar um ConfigMap (Quadro de Avisos) para injetar um arquivo de configuração em um servidor.
  2. 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.