Kubernetes a fondo¶
Kubernetes en lo Profundo, tres elementos importantes
Introducción¶
En este workshop 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 volúmenes persistentes para poder retener información de los Pods.
Requisitos¶
- Una cuenta gratuita de IBM Cloud. Registrar acá.
- Un Cluster de Kubernetes gratuito en IBM Cloud. Obtener acá.
- Tener habilitados los comandos
ibmcloudykubectl. Configurar CLI.
Tiempo estimado¶
El tiempo estimado que puede llevar este workshop es de 30 a 45 minutos con todos los requerimientos.
Este workshop se divide en tres secciones¶
- Cómo crear un namespace.
- Cómo crear un Pod multi-container
- Cómo crear un Volumen para Almacenamiento persistente
1. Cómo crear un namespace¶
Los namespaces son muy útiles para una mejor gestión de Kubernetes. En este workshop veremos como crear un nuevo namespace e implementar un pod en él.
En Kubernetes, un namespace se puede usar en entornos donde varios usuarios trabajan en diferentes equipos o proyectos. Con el uso de namespaces es posible dividir los recursos entre los usuarios sin que se produzca una colisión de nombres.
Namespaces son una especie de clúster virtual, parecido a tener varias máquinas virtuales y podemos tener varios namespaces en el mismo Clúster.
Al crear un clúster de Kubernetes, se inician al menos tres espacios de nombres básicos:
- default: se utiliza para implementaciones sin namespace asignado
- kube-system: se utiliza para todo lo relacionado con el sistema Kubernetes
- kube-public: reservado solo para uso del sistema
Para ver la lista de namespaces actuales usar el comando:
kubectl get namespaces
$ 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
staging con el siguiente comando:
kubectl run nginx --image=nginx --namespace=staging
kubectl get pods --namespace=staging
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.
2. 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"]
kubectl create -f multi-container-pod.yml
kubectl get pods
kubectl describe pod multi-container-pod
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
kubectl exec -it multi-container-pod /bin/bash
kubectl exec -it multi-container-pod -c container-1 /bin/bash
kubectl delete pod multi-container-pod
3. Configura un Volume para Almacenamiento persistente con un Pod¶
Vamos a ver cómo configurar un Pod para usar un Volúmen 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
kubectl get pods
kubectl exec -it redis -- /bin/bash
$ cd /data/redis/
$ echo Hola > prueba.txt
$ apt-get update
$ apt-get install procps
$ ps aux
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
$ cd /data/redis/
$ ls
kubectl delete pod redis
Resumen / Conclusión¶
En este workshop 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.