ConfigMap y Variables de Entorno
Muchas aplicaciones necesitan valores en sus variables de entorno. Muchas imágenes poseen en sus dockerfiles variables de entorno definidas que pueden ser sobrescritas en caso de ser necesario, así como hicimos con el entrypoint y el cmd.
En un pod podemos simplemente declarar pasando env de esta manera:
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: {}
Este pod debería imprimir entonces el valor:
The value of TEST is: my_test_var_env
Pero vea lo que sucedió:
kubectl apply -f echoenv.yaml
# No interpretó
kubectl logs pods/echo
The value of TEST is: $TEST
Más adelante vamos a entender el motivo.
Bien, podríamos pasar cuantas variables de entorno quisiéramos para el contenedor, pero a partir de un momento quedará tan grande que es mejor crear un archivo de configuración que es conocido como ConfigMap.
Podríamos mantener esas configuraciones fuera del pod y referenciarlas.
Así como otros componentes, podríamos crear configmaps a través de manifiestos o usando la línea 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 crear un configmap usando un archivo:
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
También podríamos crear nuestro configmap usando el dry-run para facilitar la prueba:
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 crear un pod inyectando ese configmap necesitamos hacer lo siguiente:
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: {}
En ese caso abajo podríamos crear una env basada en el valor definido en el 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"
# En ese caso estoy creando una variable nueva basada en una key del configmap
env:
- name: NEWENV
valueFrom:
configMapKeyRef:
name: myconfigmap
key: test
restartPolicy: Always
status: {}
Podríamos usar los valores del configmap de varias maneras:
