Entenda o Kubernetes ConfigMaps
No repositório do aplicativo, há um arquivo de configuração carregado no index.html
arquivo para permitir que as variáveis de ambiente sejam atualizadas sem a necessidade de uma compilação de imagem completa.
O arquivo de configuração não contém informações confidenciais, ele só precisa ser carregado junto com o contêiner. Como é que podemos montar o ficheiro no contentor sem ter de encriptar ou codificar?
Compreender os ConfigMaps
ConfigMaps são contrapartes de Secrets. Enquanto os Segredos fornecem uma maneira de armazenar e fornecer dados confidenciais, os ConfigMaps são objetos que fornecem uma maneira de armazenar dados não confidenciais usando a mesma estrutura chave-valor de um Segredo. O objeto ConfigMaps permite separar configurações de imagens de contêiner para que as imagens permaneçam sem monitoração de estado.
Você cria um ConfigMap para armazenar dados de configuração separadamente do código do aplicativo e carregá-lo de forma semelhante a como carregamos objetos Secret no Pod. Você só pode fazer referência a ConfigMaps usando uma variável de ambiente ou montando-os como um arquivo em um volume dentro do contêiner.
O ConfigMaps tem uma limitação de tamanho de dados: você pode armazenar até 1 MiB de dados em um ConfigMap. A limitação de tamanho ajuda a evitar arquivos de configuração grandes e complexos, fazendo com que você quebre configurações grandes em partes menores. Com o ConfigMaps, você pode montar apenas os arquivos de configuração necessários em seus contêineres, o que permite mais granularidade.
Tal como os Segredos, os ConfigMaps são recursos com espaços de nomes. Você só pode acessar e montar um ConfigMap usando os contêineres presentes no mesmo namespace em que ele foi criado.
ConfigMaps também são amplamente utilizados por outras ferramentas, como Helm e Kubernetes Operators, para armazenar e ler estados.
Atualizações de ConfigMaps
Os ConfigMaps que são montados como volumes num pod são atualizados automaticamente assim que o respetivo valor for alterado. Essa alteração pode não ocorrer imediatamente devido à configuração do Kubelet, mas acontece automaticamente, portanto, não há necessidade de reiniciar o Pod.
Quando um ConfigMap é vinculado a variáveis de ambiente, ele não é atualizado automaticamente. Para esses casos, é necessário reiniciar o Pod para que as alterações entrem em vigor.
Criar e usar ConfigMaps
Você pode criar um ConfigMap usando a mesma abordagem de um Secret: um arquivo YAML. A especificação ConfigMap é a seguinte:
apiVersion: v1
kind: ConfigMap
metadata:
name: configmap-name
namespace: default
data:
key-name: "value as key"
key.name: |
multi line
property, called "file-like" values
Você pode fazer referência a ConfigMaps por uma ou mais chaves na especificação de um Pod ou Deployment, conforme mostrado no exemplo a seguir:
apiVersion: v1
kind: Pod
metadata:
name: configmap-as-env
namespace: default
spec:
containers:
- name: configmap-env
image: alpine
command: ["sleep", "3600"]
env:
- name: ENVIRONMENT_VARIABLE_NAME
valueFrom:
configMapKeyRef:
name: configmap-name
key: key-name
Você também pode montá-los como arquivos dentro do pod usando volumes somente leitura, conforme mostrado no exemplo a seguir:
apiVersion: v1
kind: Pod
metadata:
name: configmap-as-env
namespace: default
spec:
containers:
- name: configmap-env
image: alpine
command: ["sleep", "3600"]
volumeMounts:
- name: volume-name
mountPath: "/path/to/mount"
readOnly: true
volumes:
- name: volume-name
configMap:
name: configmap-name
items:
- key: "key-name"
path: "path/to/mount/the/key"