Skip to content

Lifecycle Hooks

Desarrollo del tema

La presente guía explora la configuracion de Lifecycle Hooks en los Contenedores de un Pod.

Laboratorio: Lifecycle Hooks

Descripción

De manera análoga a muchos frameworks de lenguajes de programación que tienen componentes hooks de lifecycle, como Angular, Kubernetes también proporciona esta funcionalidad para los contenedores. Los hooks permiten a los contenedores conocer los eventos en su gestión de ciclo de vida y ejecutar el código implementado en un controlador cuando el hook de ciclo de vida correspondiente es ejecutado.

Objetivos

  • Crear un Deployment a partir de un archivo YAML
  • Configurar un lifecycle hook desde el template de container

Antes de comenzar

  • Contar con el acceso al ambiente de laboratorio

Conexión hacia cluster

  1. Ingrese al CLI del sistema operativo del servidor usado como Bastion con el usuario y la contraseña proporcionados.

  2. Ingresar al cluster de Kubernetes con sus respectivas credenciales

Inicio de laboratorio

  1. Crear un nuevo namespace llamado example-deployment

    kubectl create ns example-deployment
    

  2. Establecer el nuevo namespace por defecto en el contexto actual:

    kubectl config set-context --current --namespace=example-deployment
    

  3. Crear un directorio llamado app-k8s-deploy

    mkdir app-k8s-deploy ; cd app-k8s-deploy
    

  4. Cree un archivo llamado container-hooks.yaml con el siguiente contenido

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: basic-api
      namespace: example-deployment
      labels:
        app: basic-api
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: basic-api
      template:
        metadata:
          labels:
            app: basic-api
        spec:
          containers:
            - name: basic-api
              image: quay.io/rlam/api-demo:1.0
              ports:
                - containerPort: 8080
    

  5. Agregue un bloque en spec.template.spec.containers[0] llamado lifecycle con un bloque llamado postStart

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: basic-api
      namespace: example-deployment
      labels:
        app: basic-api
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: basic-api
      template:
        metadata:
          labels:
            app: basic-api
        spec:
          containers:
            - name: basic-api
              lifecycle:
                postStart:
              image: quay.io/rlam/api-demo:1.0
              ports:
                - containerPort: 8080
    

  6. Agregue al bloque spec.template.spec.containers[0].lifecycle.postStart un bloque exec definido de la siguiente manera

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: basic-api
      namespace: example-deployment
      labels:
        app: basic-api
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: basic-api
      template:
        metadata:
          labels:
            app: basic-api
        spec:
          containers:
            - name: basic-api
              lifecycle:
                postStart:
                  exec:
                    command: ["/bin/sh", "-c", "sleep 5; curl localhost:8080 > /deployments/first-req.html"]
              image: quay.io/rlam/api-demo:1.0
              ports:
                - containerPort: 8080
    

  7. Levante los recursos ejecutando

    kubectl apply -f container-hooks.yaml
    

  8. Revise los deployments en el namespace

    kubectl get deploy
    

  9. Revise los pods en el namespace

    kubectl get pods
    

  10. Revise la información del pod

    # Cambiar nombre-pod por el nombre real del Pod
    kubectl describe pod/nombre-pod
    

  11. Obtenga el contenido del archivo creado como efecto del Hook postStart

    # Cambiar nombre-pod por el nombre real del Pod
    kubectl exec -it nombre-pod -- bash
    cd /deployments
    ls -l
    cat first-req.html
    exit
    

  12. Agregue un bloque en spec.template.spec.containers[0].lifecycle llamado preStop con el bloque exec definido de la siguiente manera

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: basic-api
      namespace: example-deployment
      labels:
        app: basic-api
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: basic-api
      template:
        metadata:
          labels:
            app: basic-api
        spec:
          containers:
            - name: basic-api
              lifecycle:
                postStart:
                  exec:
                    command: ["/bin/sh", "-c", "sleep 5; curl localhost:8080 > /deployments/first-req.html"]
                preStop:
                  exec:
                    command: ['/bin/sh', '-c', 'echo Shutting down > /deployments/kill.txt; sleep 60']
              image: quay.io/rlam/api-demo:1.0
              ports:
                - containerPort: 8080
    

  13. Aplique los cambios

    kubectl apply -f container-hooks.yaml
    

  14. Revise los eventos del pod

    kubectl get pods
    kubectl describe pod/nombre-pod
    

  15. Abra una segunda terminal SSH y ejecute los siguientes comandos para verificar el preStop

    # Cambiar nombre-pod por el nombre real del Pod
    kubectl exec -it nombre-pod -- bash
    touch /deployments/kill.txt
    tail -f /deployments/kill.txt
    

  16. Regresar a la primera terminal y eliminar el pod

    kubectl delete pod nombre-pod
    

Cuando el pod es eliminado, puede verificar el mensaje creado del preStop en la segunda terminal abierta.

  1. Eliminar el namespace llamado example-deployment
    kubectl delete ns example-deployment