Estudio de CKAD – Día 19

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:

  1. Argumento en la linea de comandos como entrypoint de un contenedor
  2. Variable de entorno de un contenedor
  3. Como fichero en un volumen de solo lectura, para que lo lea la aplicación
  4. 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