Skip to main content

Configmap e Envs

Muitas aplicações precisam de valores em suas variáveis de ambiente. Muitas imagens possuem em seus dockerfiles variáveis de ambientes definidas que podem ser sobrescritas caso necessária assim como fizemos com o entrypoint e o cmd.

Em um pod podemos simplesmente declarar passando env dessa maneira

apiVersion: v1
kind: Pod
metadata:
labels:
run: echo
name: echo
spec:
containers:
- image: ubuntu
name: echo
command: ["echo"]
args:
- "The value of TEST is: $TEST"
env:
- name: TEST
value: my_test_var_env
- name: TEST1
value: my_test_var_env
- name: TEST2
value: my_test_var_env
- name: TEST3
value: my_test_var_env
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}

Esse pod deveria imprimir então o valor The value of TEST is: my_test_var_env mas veja o que aconteceu

kubectl apply -f echoenv.yaml

#Não interpretou
kubectl logs pods/echo
The value of TEST is: $TEST

Mais tarde vamos entender o motivo.

Bom, poderíamos passar quantas variáveis de ambiente quiséssemos para o container, mas a partir de um momento ficará tão grande que é melhor criar um arquivo de configuração que é conhecido como ConfigMap.

Poderíamos manter essas configurações fora do pod e chamá-las.

Assim como outros componentes, poderíamos criar configmaps através de um manifestos ou usando a linha de comando.

kubectl create configmap myconfigmap --from-literal=TEST=my_test_var_env
configmap/myconfigmap created

kubectl describe configmaps myconfigmap
Name: myconfigmap
Namespace: default
Labels: <none>
Annotations: <none>

Data
====
TEST:
----
my_test_var_env

BinaryData
====

Events: <none>

kubectl delete configmaps myconfigmap
configmap "myconfigmap" deleted

Para criar um configmap usando um file.

```yaml
kind: ConfigMap
apiVersion: v1
metadata:
name: myconfigmap
data:
TEST1: my_test_var_env1
TEST2: my_test_var_env2
TEST3: my_test_var_env3
TEST4: my_test_var_env4
kubectl apply -f configmap.yaml
configmap/myconfigmap created

kubectl describe configmaps myconfigmap
Name: myconfigmap
Namespace: default
Labels: <none>
Annotations: <none>

Data
====
TEST1:
----
my_test_var_env1
TEST2:
----
my_test_var_env2
TEST3:
----
my_test_var_env3
TEST4:
----
my_test_var_env4

BinaryData
====

Events: <none>

kubectl get configmaps myconfigmap
NAME DATA AGE
myconfigmap 5 4m19

kubectl get configmaps myconfigmap -o yaml
apiVersion: v1
data:
TEST1: my_test_var_env1
TEST2: my_test_var_env2
TEST3: my_test_var_env3
TEST4: my_test_var_env4
TEST5: my_test_var_env4
kind: ConfigMap
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","data":{"TEST1":"my_test_var_env1","TEST2":"my_test_var_env2","TEST3":"my_test_var_env3","TEST4":"my_test_var_env4","TEST5":"my_test_var_env4"},"kind":"ConfigMap","metadata":{"annotations":{},"name":"myconfigmap","namespace":"default"}}
creationTimestamp: "2023-12-31T02:06:29Z"
name: myconfigmap
namespace: default
resourceVersion: "23405"
uid: 2a68c93a-1ce9-49ad-81e6-097c06fe6265

Também poderíamos criar o nosso configmap usando o dry-run para facilitar para o teste

kubectl create configmap myconfigmap --dry-run=client -o yaml --from-literal=test=testvalue
apiVersion: v1
data:
test: testvalue
kind: ConfigMap
metadata:
creationTimestamp: null
name: myconfigmap

Para criar um pod injetando esse configmap precisamos fazer o seguinte.

apiVersion: v1
kind: Pod
metadata:
labels:
run: echo
name: echo
spec:
containers:
- image: ubuntu
name: echo
command:
- "/bin/sh"
- "-c"
- "echo $test && sleep 10"
envFrom:
- configMapRef:
name: myconfigmap
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}

Nesse caso abaixo poderíamos criar uma env baseado no valor definido no configmap.

apiVersion: v1
kind: Pod
metadata:
labels:
run: echo
name: echo
spec:
containers:
- image: ubuntu
name: echo
command:
- "/bin/sh"
- "-c"
- "echo $NEWENV && sleep 10"
# NESSE CASO ESTOU CRIANDO UMA VARIÁVEL NOVA BASEADA EM UM UMA KEY DO CONFIGMAP.
env:
- name: NEWENV
valueFrom:
configMapKeyRef:
name: myconfigmap
key: test
restartPolicy: Always
status: {}

Poderíamos usar os valores do configmap de várias maneiras

Alt text