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