¡Participa de la Maratón Behind the Code, la competencia de programación más desafiante! Inscríbete aqui

Kubernetes en lo Profundo, tres elementos importantes

Introducción

En este tutorial vamos a ver tres elementos que son muy importantes para ir profundizando en el uso de Kubernetes, más allá de su uso para pruebas de laboratorio, pensando en un uso productivo y el aprovechamiento del potencial de esta herramienta. Vamos a ver cómo configurar namespaces y poder ordernar proyectos, configurar entornos multi-containers y crear colúmenes persistentes para poder retener información de los Pods.

Módulos de esta ruta de aprendizaje

Completa estos tutoriales para obtener las habilidades prácticas y el conocimiento.

Título Tiempo Descripción
1 Desplegar WordPress en Kubernetes en IBM Cloud 30 minutos Aprender a desplegar uno de los más conocidos frameworks de sitios webs como lo es WordPress
2 Desplegar una aplicación desde una imagen propia de Docker en Kubernetes en IBM Cloud 30 – 60 minutos Aprenderemos a crear y modificar una imágen de Docker, subirla al repositorio en Docker Hub y actualizarla
3 Ubuntu Lab: Como crear un único Pod en un Clúster de Kubernetes Menos de 30 minutos Vamos a ver cómo implementar un Pod de Ubuntu en Kubernetes en IBM Cloud, con el objetivo de tener un Laboratorio para pruebas.
4 Monitoreo en Kubernetes: Crear una instacia de Grafana en Kubernetes y acceder externamente 30 minutos Vamos a ver cómo configurar un panel de Grafana en un Clúster de Kubernetes en IBM Cloud, usando Prometheus como herramienta de análisis de datos.
5 Aplicación PHP con MongoDB en Kubernetes 30 minutos Vamos a ver cómo implementar una aplicación PHP tipo Libro de Visitas con varios niveles utilizando Kubernetes y Docker, con una instancia única de MongoDB para almacenar las entradas del libro de visitas y varias instancias de frontend web.
6 Kubernetes en lo Profundo, tres elementos importantes 30 minutos Vamos a ver tres elementos que son muy importantes para ir profundizando en el uso de Kubernetes.

Requisitos

  • Una cuenta gratuita de IBM Cloud. Registrar acá.
  • Un Cluster de Kubernetes gratuito en IBM Cloud. Obtener acá.
  • Tener habilitados los comandos ibmcloud y kubectl. Configurar CLI.
  • Puedes encontrar el repositorio con los archivos necesarios y ejemplificativos aquí

Tiempo estimado

El tiempo estimado que puede llevar este tutorial es de 30 a 45 minutos con todos los requerimientos.

Este tutorial se divide en tres secciones

$ kubectl get namespaces
NAME              STATUS   AGE
default           Active   18d
ibm-cert-store    Active   18d
ibm-operators     Active   18d
ibm-system        Active   18d
kube-node-lease   Active   18d
kube-public       Active   18d
kube-system       Active   18d

Vamos a crear un namespace llamado staging corriendo el siguiente comando:

kubectl create namespace staging

Vamos a implementar un Pod NGINX en el nuevo namespace staging con el siguiente comando:

kubectl run nginx --image=nginx --namespace=staging

Para ver si el Pod se ha implementado correctamente vamos a correr el siguiente comando:

kubectl get pods --namespace=staging

Nuestro Pod NGINX se está ejecutando.

EXTRA: Cómo configurar el namespace predeterminado

Para usar un namespace específico como predeterminado, para no tener que usar la opción –amespace=NAMESPACE en los comandos de implementación, usar el siguiente comando:

kubectl config set-context --current --namespace=NAMESPACE

Nota: NAMESPACE es el nombre del namespace que va a utilizar como predeterminado.


Cómo crear un Pod multi-container

Para crear un Pod multi-container vamos a utilizar el siguiente archivo multi-container-pod.yml con el siguietne contenido:

apiVersion: v1
kind: Pod
metadata:
  name: multi-container-pod
spec:
  containers:
  - name: container-1
    image: nginx
    ports:
    - containerPort: 80  
  - name: container-2
    image: alpine
    command: ["watch", "wget", "-qO-", "localhost"]

Este archivo tiene una definición para 2 contenedores que compartirán la misma red, recursos y volumen.
Para crear un Pod de contenedores múltiples usar el siguiente comando:

kubectl create -f multi-container-pod.yml

Para ver los pods que estan corriendo, usar el siguiente comando:

kubectl get pods

Para ver el detalle del Pod:

kubectl describe pod multi-container-pod

Acá vamos a poder ver los detalles de los dos contenedores que contiene. Los contenedores contenedor-1 y contenedor-2. Ambos pertenecen al mismo grupo.

Para verificar los registros de un contenedor en particular, puede agregar el nombre del contenedor al comando:

kubectl logs multi-container-pod container-1

Si el nombre del contenedor no se proporciona en el comando, aparece un error en el que se le indica que especifique el nombre del contenedor. Se puede especificar el nombre de un único contenedor y no se pueden especificar varios contenedores en el comando para obtener los registros, los siguientes dos comandos fallan:

kubectl logs multi-container-pod
kubectl logs multi-container-pod container-1 container-2

El comando para iniciar sesión en el pod no funciona cuando hay varios contenedores dentro de un solo pod, el siguiente comando falla:

kubectl exec -it multi-container-pod /bin/bash

Para iniciar sesión en el contenedor en particular, necesitamos especificar el nombre del contenedor en el comando, además de que no se puede iniciar sesión en 2 pods al mismo tiempo:

kubectl exec -it multi-container-pod -c container-1 /bin/bash

Cuando el Pod ya no sea necesario, se puede eliminar y limpiar con el siguiente comando:

kubectl delete pod multi-container-pod

Configura un Volume para Almacenamiento persistente con un Pod

Vamos a ver cómo configurar un Pod para usar un Volumen como almacenamiento. Los archivos de un contenedor existen mientras el Contenedor exista. Cuando un Contenedor es destruido o reiniciado, los cambios realizados se pierden. Para preservar datos se puede usar un Volume.

Va a ser un Pod que ejecuta un único Contenedor. El Volume es de tipo emptyDir y se va a mantener incluso cuando el Contenedor sea destruido y reiniciado. volumen.yaml:

apiVersion: v1
kind: Pod
metadata:
  name: redis
spec:
  containers:
  - name: redis
    image: redis
    volumeMounts:
    - name: redis-storage
      mountPath: /data/redis
  volumes:
  - name: redis-storage
    emptyDir: {}

Implementar el Pod:

kubectl apply -f volumen.yaml

Ver los Pods que están corriendo:

kubectl get pods

Vamos a inicar sesión en el Contenedor:

kubectl exec -it redis -- /bin/bash

Vamos a crear un archivo de prueba en /data/redis:

$ cd /data/redis/
$ echo Hola > prueba.txt

Vamos a listar los procesos en ejecución:

$ apt-get update
$ apt-get install procps
$ ps aux

Ahora debemos matar el proceso de Redis redis-server:

$ kill <pid>

Donde es el ID de proceso (PID) de Redis.

Viendo los Pods con kubectl get pods podemos observar los cambios en el Pod de Redis. RESTARTS cuenta 1. El Contenedor ha sido destruido y reiniciado.

Vamos a inicar sesión en el Contenedor nuevamente:

kubectl exec -it redis -- /bin/bash

Vamos a ir a /data/redis para verifica que el archivo de prueba aun existe:

$ cd /data/redis/
$ ls

Cuando el Pod ya no sea necesario, se puede eliminar y limpiar con el siguiente comando:

kubectl delete pod redis

Resumen / Conclusión

En este tutorial vimos como ordenar el trabajo en proyectos con el uso de namespaces, aprendimos cómo crear un pod de contenedores múltiples, obtener registros de un contenedor en particular e iniciar sesión en un solo contenedor. Además vimos como crear un almacenamiento local proporcionado por emptyDir, Kubernetes soporta diferentes tipos de soluciones de almacenamiento por red y se encarga de todos los detalles, tal como montar y desmontar los dispositivos en los nodos del clúster.

Enlaces Interesantes