Estudio de CKAD – Día 22

Nuevo tema, solo habia leido de este


En el Deployment frontend, define probes de liveness y readiness que chequen HTTP en /healthz puerto 80 (suponiendo que la app responde).


Un liveness y readiness son capacidades de kubernetes, para validar endpoints de sitios web y generar acciones segun condiciones.

https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes

Algo que me resulta interesante es que hay varios tipos de livenessProbe, uno para exec, por ejemplo leer datos de un archivo en el contenedor, y uno de httpGet para validar una ruta web.

Esta es una expansion del dia20:

# 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: v1
kind: Secret
metadata:
  name: db-secret2
  namespace: exam-ns
stringData:
  db-secret: s3cr3t
---
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
        - name: DB_SECRET
          valueFrom:
            secretKeyRef:
              name: db-secret2
              key: db-secret
        image: nginx:1.21-alpine
        ports:
        - containerPort: 80
        livenessProbe:
          httpGet:
            path: /healthz
            port: 80
          initialDelaySeconds: 5
          periodSeconds: 3.
---
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

Para validar el livenessProbe se puede hacer en kubectl

En fin estas son las modificaciones.

En ConfigMap una nueva propiedad, ligeramente mas compleja, que crea una ruta en el nginx, normalmente esto no es muy kubernetes, sino mas aplicacion, pero rezare porque en el examen no me pidan algo tan especifico de otros productos.

apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
  labels:
    app: frontend
  namespace: exam-ns
data:
  LOG_LEVEL: "debug"
  default.conf: |
    server {
      listen 80;
      server_name localhost;

      location / {
        try_files $uri $uri/ =404;
      }

      location /healthz {
        access_log off;
        return 200 'ok';
        add_header Content-Type text/plain;
      }
    }

Porque configurar nginx es algo que siempre olvido y tengo que buscar.

Y el deployment se le agregan dos nuevas propiedades. Y aparte de agregue un volumen y volumenMounts para que pueda recbir la configuracion del nginx

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
        - name: DB_SECRET
          valueFrom:
            secretKeyRef:
              name: db-secret2
              key: db-secret
        image: nginx:1.21-alpine
        ports:
        - containerPort: 80
        volumeMounts:
          - name: nginx-config-volume
            mountPath: /etc/nginx/conf.d/default.conf
            subPath: default.conf
        livenessProbe:
            httpGet:
              path: /healthz
              port: 80
            initialDelaySeconds: 5
            periodSeconds: 10
        readinessProbe:
            httpGet:
              path: /healthz
              port: 80
            initialDelaySeconds: 3
            periodSeconds: 5
      volumes:
        - name: nginx-config-volume
          configMap:
            name: app-config

Y una vez esta todo aplicado simplemente es cuestion de monitorear el describe de algun pod, y su estado a nivel general.


Tuve varios problemas durante mi practica, mas que nada sintaxis del mismo nginx. lo cual rompia el Healthz y me mandaba a la deriva pregutando por los errores.

Entonces mis practicas deben incluir ‘Volumes’ , y varios tipos de ‘livenessProbes’ luego debo intentar con la de archivos.

Felizmente esa si esta en la docmentacion de kubernetes.