ConfigMap no Kubernetes: Guia Completo

No Kubernetes, o ConfigMap é um objeto que permite armazenar dados de configuração não confidenciais, em um formato chave e valor.

Eles são ideais para externalizar a configuração de Pods, inclusive compartilhando configurações entre inúmeros Pods.

Essa abordagem facilita a modificação desses valores sem precisar ficar alterando o container de sua aplicação, ou precisar recria-la.

Um ponto importante é que esse recurso não é o lugar ideal para gravar informações sensíveis como senhas de acesso a banco, ou chaves privadas, nesse caso você pode optar por utilizar uma Secret, temos um artigo explicando e demonstrando o uso de Secrets aqui.

Criando um ConfigMap

Há inúmeras formas de se criar esse tipo de recurso, vamos detalhar algumas delas a seguir:

Usando valores literais

Você pode criar o seu objeto definindo chave e valor direto no terminal com a ferramente kubectl, veja o exemplo a seguir:

kubectl create configmap nome-do-configmap \                                        
  --from-literal=chave1=valor1 \
  --from-literal=chave2=valor2
Terminal

Lembre-se de modificar “nome-do-configmap”, “chave1”, “valor1”, “chave2”, “valor2”, para o contexto do seu ambiente.

Abaixo demonstramos um exemplo na prática criamos um ConfigMap para armazenar as informações de acesso a um banco de dados.

kubectl create configmap banco-dados \                                        
  --from-literal=url=jdbc:postgres://localhost:5432/db \
  --from-literal=schema=default
Terminal

Embora nos exemplos acima utilizamos apenas duas chaves com valor, isso não é um limitador, é possível adicionar bem mais informações.

Usando arquivo de configuração

É possível utilizar um arquivo de configuração para centralizar as chaves e valores, essa prática facilita bem mais o uso quando você tem muitas informações para adicionar no seu ConfigMap, segue o exemplo:

kubectl create configmap nome-do-configmap --from-file=caminho-do-arquivo.txt
Terminal

Exemplo de arquivo de configuração:

chave1=valor1
chave2=valor2
config.txt

Caso você tenha inúmeros arquivos, dentro de um diretório, é possível montar um ConfigMap utilizando todos, basta passar o caminho do diretório, para que o kubectl aplique o seu objeto com todos os arquivos existentes.

kubectl create configmap nome-do-configmap --from-file=/caminho/do/diretorio
Terminal

Uma observação importante a se fazer é que quando se utiliza arquivos de configuração, os valores tendem a ficar dentro de uma chave com o nome do arquivo, importante lembrar disso quando for fazer o consumo das informações.

Usando arquivo de manifesto YAML

Acredito que essa é a forma mais utilizada, principalmente com uso em pipelines que auxiliam o deploy de aplicações, para usar basta criar um arquivo com a extensão .yml, segue o exemplo:

apiVersion: v1
kind: ConfigMap
metadata:
  name: nome-do-configmap
data:
  chave1: valor1
  chave2: valor2
configmap.yml

Nesse arquivo de manifesto também é possível adicionar informações como namespace, uid entre outras, seguindo o mesmo modelo de outros recursos do kubernetes.

Recuperando valores

Quando se está administrando um cluster, muitas das vezes precisamos conferir as informações de configuração, quando armazenamos essas configurações em um ConfigMap, fica muito fácil fazer o debug.

Listando existentes

Para listar todos os objetos criados, podemos utilizar o comando:

kubectl get configmap
Terminal

Exibindo detalhes

Caso precise verificar as informações de contidas dentro de um objeto, podemos utilizar o comando:

kubectl describe configmap nome-do-configmap
Terminal

Também é possível recuperar os valores em formato json, para isso basta acrescentar -o json ao comando ficando assim:

kubectl describe configmap nome-do-configmap -o json
Terminal

Diferente de um Secret as informações contidas dentro desse recurso estão expostas, e você pode validar os valores, mas mesmo assim ainda é possível fazer um filtro para recuperar a chave que você precisa, para isso usamos o seguinte comando:

kubectl get configmap nome-do-configmap -o jsonpath='{.data.chave}'
Terminal

No exemplo que utilizamos para armazenar as informações do banco de dados ficaria assim:

kubectl get configmap database -o jsonpath='{.data.url}'
Terminal

Exclusão

A exclusão de um ConfigMap é tão simples quanto excluir qualquer outro recurso do Kubernetes, basta usar a sintexe padrão:

kubectl delete configmap nome-do-configmap
Terminal

Lembrando que exclusões são irreversíveis, então é importante se atentar quando for utilizar esse comando, principalmente em ambientes produtivos.

Utilizando em um Pod

Para fazer referência às propriedades de um objeto ConfigMap nas variáveis de ambiente de um Pod, basta seguir o exemplo:

apiVersion: v1
kind: Pod
metadata:
  name: nome-do-pod
spec:
  containers:
  - name: nome-do-container
    image: minha-imagem
    envFrom:
    - configMapRef:
        name: nome-do-configmap
pod.yml

Também é possível montar um volume, armazenando suas chaves e valores em arquivos dentro do sistema de arquivo do container, segue o exemplo:

apiVersion: v1
kind: Pod
metadata:
  name: nome-do-pod
spec:
  containers:
  - name: nome-do-container
    image: minha-imagem
    volumeMounts:
    - name: config-volume
      mountPath: /etc/config
  volumes:
  - name: config-volume
    configMap:
      name: nome-do-config-map
pod.yml

No exemplo acima os dados do ConfigMap serão montados no diretório /etc/config, dentro do container.

Debugando

Caso você esteja enfrentando problemas, com a configuração do seu cluster, e tenha dúvidas se os valores do seu ConfigMap estão chegando mesmo ao Pod, é possível fazer um debug através de um Pod para verificar os valores, a abordagem é bem simples, basta criar um Pod que executa, uma linha de comando que lê as variáveis de ambiente, abaixo demonstramos isso:

apiVersion: v1
kind: Pod
metadata:
  name: test-pod
spec:
  containers:
  - name: test-container
    image: busybox
    command: ["/bin/sh", "-c", "env"]
    envFrom:
      - configMapRef:
          name: nome-do-configmap
pod.yml

Após criar o arquivo de manisfesto acima, é preciso aplicá-lo através do comando:

kubectl apply -f test-pod.yml
Terminal

Após a aplicação podemos verificar os valores de variável de ambiente fornecido a ele com o comando log:

kubectl logs test-pod
Terminal

Veja o exemplo aplicado, na demonstração de um objeto que contém a configuração de banco de dados.

Saída:

KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT=tcp://10.96.0.1:443
HOSTNAME=test-secret-pod
SHLVL=1
HOME=/root
schema=default
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_PROTO=tcp
url=jdbc:postgres://localhost:5432/db
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_SERVICE_HOST=10.96.0.1
PWD=/
Terminal

Veja nas linhas 6 e 11 as informações contidas no nosso objeto.

O uso de ConfigMap em um cluster pode ser uma ferramenta poderosíssima, quando você possui muitas aplicações que utilizam-se de uma configuração em comum, é um boa prática utilizar um objeto desses para armazenar essas informações.

Com essa abordagem, manter o cluster fica muito mais simples, pois você sabe que as informações estão concentradas, e caso precise fazer uma atualização, só precisará se preocupar com um único recurso.

Links uteis

Mauricio Lima
Mauricio Lima

Bacharel em Ciência da Computação, profissional dedicado ao desenvolvimento de software e entusiasta da tecnologia.

Artigos: 65