Hoy es sencillo pero son cosas que no recuerdo bien, asi que vamos alla.
Crea un ConfigMap llamado app-config con una clave LOG_LEVEL=debug, y monta ese ConfigMap como variable de entorno en el Deployment frontend.
Un ConfigMap es un archivo de configuracion que se inyecta en los recursos. Asi que sobre el deployment de ayer debo agregarlo como una variable.
https://kubernetes.io/es/docs/concepts/configuration/configmap
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
LOG_LEVEL: "debug"
De forma imperativa seria algo como
kubectl create configmap app-config --from-literal=LOG_LEVEL=debug
Algo interesante en la documentacion es que hay 4 formas de usarlo:
- Argumento en la linea de comandos como entrypoint de un contenedor
- Variable de entorno de un contenedor
- Como fichero en un volumen de solo lectura, para que lo lea la aplicación
- Escribir el código para ejecutar dentro de un Pod que utiliza la API para leer el ConfigMap
# Import specific keys from a config map
kubectl set env --keys=my-example-key --from=configmap/myconfigmap deployment/myapp
Y la otra forma es en la definicion:
# En el namespace exam-ns,
# crea un Deployment llamado frontend con 3 réplicas
# usando la imagen nginx:stable,
# y expónlo con un Service de tipo ClusterIP al puerto 80. / NodePort
---
apiVersion: v1
kind: Namespace
metadata:
name: exam-ns
labels:
app: frontend
---
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
labels:
app: frontend
namespace: exam-ns
data:
LOG_LEVEL: "debug"
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: frontend
namespace: exam-ns
spec:
replicas: 3
selector:
matchLabels:
app: frontend
template:
metadata:
labels:
app: frontend
spec:
containers:
- name: frontend
env:
- name: LOG_LEVEL
valueFrom:
configMapKeyRef:
name: app-config
key: LOG_LEVEL
image: nginx:1.21-alpine
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: frontendsvc
namespace: exam-ns
spec:
type: NodePort
selector:
app: frontend # ¿Asi busco los pods?
ports:
- port: 80 # Este es el puerto del cluster
targetPort: 80 # este es el puerto del contenedor
nodePort: 30080 # Este es el puerto externo - Dice que es opcional
# Para hacer funcionar esto hay que hacer un tunel de mi host a minikube, es algo propio de minikube
# minikube service frontendsvc -n exam-ns
Al final tambien se puede agregar como volumen, personalmente siempre he tenido problema con el pensamiento profundo de los volumenes, pero en general es una ruta con un archivo. Aplica mejor en certificados que en ENV.
Pero suficiente con este ejercicio.
❯ kubectl create configmap app-configv2 -n exam-ns --from-literal=LOG_LEVEL=Warning
❯ kubectl get configmap -n exam-ns
❯ kubectl set env --keys=LOG_LEVEL --from=configmap/app-config deployment/frontend -n exam-ns