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
-
Ingrese al CLI del sistema operativo del servidor usado como Bastion con el usuario y la contraseña proporcionados.
-
Ingresar al cluster de Kubernetes con sus respectivas credenciales
Inicio de laboratorio
-
Crear un nuevo namespace llamado
example-deploymentkubectl create ns example-deployment -
Establecer el nuevo namespace por defecto en el contexto actual:
kubectl config set-context --current --namespace=example-deployment -
Crear un directorio llamado
app-k8s-deploymkdir app-k8s-deploy ; cd app-k8s-deploy -
Cree un archivo llamado
container-hooks.yamlcon el siguiente contenido1 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 -
Agregue un bloque en
spec.template.spec.containers[0]llamadolifecyclecon un bloque llamadopostStart1 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 -
Agregue al bloque
spec.template.spec.containers[0].lifecycle.postStartun bloqueexecdefinido de la siguiente manera1 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 -
Levante los recursos ejecutando
kubectl apply -f container-hooks.yaml -
Revise los deployments en el namespace
kubectl get deploy -
Revise los pods en el namespace
kubectl get pods -
Revise la información del pod
# Cambiar nombre-pod por el nombre real del Pod kubectl describe pod/nombre-pod -
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 -
Agregue un bloque en
spec.template.spec.containers[0].lifecyclellamadopreStopcon el bloqueexecdefinido de la siguiente manera1 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 -
Aplique los cambios
kubectl apply -f container-hooks.yaml -
Revise los eventos del pod
kubectl get pods kubectl describe pod/nombre-pod -
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 -
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.
- Eliminar el namespace llamado example-deployment
kubectl delete ns example-deployment