ConfigMap e Variáveis de Ambiente
Muitas aplicações precisam de valores em suas variáveis de ambiente. Muitas imagens possuem em seus dockerfiles variáveis de ambiente definidas que podem ser sobrescritas caso necessário, 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.
Bem, 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 referenciá-las.
Assim como outros componentes, poderíamos criar configmaps através de 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 arquivo:
```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 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 baseada 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 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:
