Entenda o Kubernetes ConfigMaps

Concluído

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"

Verifique o seu conhecimento

1.

Porque é que devemos utilizar ConfigMaps?

2.

Como pode utilizar ConfigMaps numa aplicação?

3.

O espaço de nomes é uma limitação dos ConfigMaps?