Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
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.
Há inúmeras formas de se criar esse tipo de recurso, vamos detalhar algumas delas a seguir:
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
TerminalLembre-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
TerminalEmbora nos exemplos acima utilizamos apenas duas chaves com valor, isso não é um limitador, é possível adicionar bem mais informações.
É 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
TerminalExemplo de arquivo de configuração:
chave1=valor1
chave2=valor2
config.txtCaso 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
TerminalUma 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.
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.ymlNesse arquivo de manifesto também é possível adicionar informações como namespace, uid entre outras, seguindo o mesmo modelo de outros recursos do kubernetes.
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.
Para listar todos os objetos criados, podemos utilizar o comando:
kubectl get configmap
TerminalCaso precise verificar as informações de contidas dentro de um objeto, podemos utilizar o comando:
kubectl describe configmap nome-do-configmap
TerminalTambé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
TerminalDiferente 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}'
TerminalNo exemplo que utilizamos para armazenar as informações do banco de dados ficaria assim:
kubectl get configmap database -o jsonpath='{.data.url}'
TerminalA 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
TerminalLembrando que exclusões são irreversíveis, então é importante se atentar quando for utilizar esse comando, principalmente em ambientes produtivos.
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.ymlTambé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.ymlNo exemplo acima os dados do ConfigMap serão montados no diretório /etc/config, dentro do container.
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.ymlApós criar o arquivo de manisfesto acima, é preciso aplicá-lo através do comando:
kubectl apply -f test-pod.yml
TerminalApós a aplicação podemos verificar os valores de variável de ambiente fornecido a ele com o comando log:
kubectl logs test-pod
TerminalVeja 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=/
TerminalVeja 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.