Serie Explorando el Universo de Contenedores: Guía Completa de Kubernetes

Kubernetes se ha convertido en la plataforma líder para la orquestación y gestión de contenedores en el mundo de la infraestructura de aplicaciones. Mediante este blog, explicaré un recorrido de los conceptos más utilizados de Kubernetes, desde los más básicos hasta los casos de uso más complejos con ejemplos y comandos claves a utilizar.

Introducción a Kubernetes

Kubernetes, también conocido como K8s, es una plataforma de código abierto que automatiza la implementación, escalado y operación de aplicaciones en contenedores. Los contenedores son unidades que encapsulan una aplicación y todas sus dependencias. Kubernetes proporciona herramientas para administrar contenedores de manera eficiente, garantizando la alta disponibilidad y escalabilidad de aplicaciones.

Instalación y Configuración

La instalación de Kubernetes puede variar según la plataforma, pero existe algunas herramientas como ‘kubeadm’, ‘minikube’  o soluciones en la nube como son:

  • Google Kubernetes Engine (GKE)  ⇨ Nube de Google Cloud Platform (GCP).
  • Elastic Kubernetes Services (EKS)  ⇨ Nube de Amazon Web Service (AWS).
  • Azure Kubernetes Services (AKS)   ⇨ Nube de Azure (Azure).

Una vez instalado puedes configurar tus herramientas de línea de comandos para acceder al cluster.

Ejemplo de instalación usando la herramienta de ‘minikube’


# Instalación de minikube (Linux)
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
chmod +x minikube-linux-amd64
sudo mv minikube-linux-amd64 /usr/local/bin/minikube

# Iniciar clúster de minikube
minikube start


💡 Nota: Antes de iniciar y ver cuáles son los diferentes componentes que se utilizan en Kubernetes hay que tener claro varias cosas, primero la indentación en los archivos Yaml, sin estos va a generar error, y segundo SIEMPRE, pero SIEMPRE un Yaml file está construido de cuatro (4) niveles indispensables para la creación de una archivo Yaml, y en este orden respectivamente,  los cuales son:

  • apiVersion
  • kind
  • metadata
  • spec

Donde:

Habiendo explicado lo anterior podemos ver cada uno de los componentes que contiene esta herramienta de orquestación llamado kubernetes.

Pods y Contenedores

Un Pod es la unidad más básica de despliegue en Kubernetes. Puede contener uno o más contenedores que comparten recursos y red.

Veamos un ejemplo de como crear un Pod por medio de un archivo Yml.


# pod-example.yaml

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
    - name: my-container
        image: nginx:latest



💡Nota: En el ejemplo anterior vemos un archivo Yaml que se llama ‘pod-example.yaml’, lo primero sería crear el pod, en segundo lugar sería listar los pods a ver si nuestro pod fue creado de manera satisfactoria y si queremos ahondar más acerca de nuestro Pod podemos utilizar la palabra reservada ‘describe’, los comandos serían en este orden y de esta forma:


# Crear el Pod
kubectl apply -f pod-example.yaml

# Listar Pods
kubectl get pods

# Obtener información detallada de un Pod
kubectl describe pod my-pod



Replicación y Escalado

Kubernetes permite replicar y escalar aplicaciones fácilmente por medio de un archivo Yaml o de forma declarativa (terminal), para mejorar la disponibilidad y el rendimiento.

Veamos un ejemplo de como crear un ReplicaSet por medio de un archivo Yml.


# replicaset-example.yaml

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: my-replicaset
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: my-container
          image: nginx:latest



💡 Nota: En el ejemplo anterior vemos un archivo Yaml que se llama ‘replicaset-example.yaml’, lo primero sería crear el replicaset, en segundo lugar sería listar los replicaset a ver si nuestra réplica fue creado de manera satisfactoria y si queremos escalar nuestra réplica si tener que entrar a nuestro archivo Yml serían en este orden y de esta forma:


# Crear ReplicaSet
kubectl apply -f replicaset-example.yaml

# Listar ReplicaSets
kubectl get replicasets
# Escalar ReplicaSet
kubectl scale replicaset my-replicaset --replicas=5



Servicios y Networking

Los Servicios permiten comunicación entre diferentes conjuntos de Contenedores en Kubernetes. Un Service puede ser expuesto interna o externamente.

Veamos un ejemplo de cómo crear un Service por medio de un archivo Yml.


# service-example.yaml

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: ClusterIP


💡Nota: En el ejemplo anterior vemos un archivo Yaml que se llama ‘service-example.yaml’, lo primero sería crear el service, en segundo lugar sería listar los services para constatar si fue creado de manera satisfactoria, los comandos serían en este orden y de esta forma:


# Crear Service
kubectl apply -f service-example.yaml

# Listar Services
kubectl get services



Configuración y Secretos

Los Secretos en Kubernetes permiten almacenar información sensible, como contraseñas, de manera segura.

Veamos un ejemplo de cómo crear un Secret por medio de un archivo Yml.


# secret-example.yaml

apiVersion: v1
kind: Secret
metadata:
  name: my-secret
type: Opaque
data:
  username: YWRtaW4=  # Base64-encoded "admin"
  password: cGFzc3dvcmQ=  # Base64-encoded "password"

💡Nota: En el ejemplo anterior vemos un archivo Yaml que se llama ‘secret-example.yaml’, lo primero sería crear el secret, en segundo lugar sería listar los secrets para constatar si fue creado de manera satisfactoria, los comandos serían en este orden y de esta forma:


# Crear Secret
kubectl apply -f secret-example.yaml

# Listar Secretos
kubectl get secrets




Monitoreo

La observabilidad es fundamental en Kubernetes, ya que ayuda a los equipos identificar problemas y gestionar de forma proactiva clusters de Kubernetes que. Se puede utilizar Herramientas como Prometheus.

Ejemplo de instalación usando la herramienta de ‘Prometheus’


# Instalar Prometheus usando Helm
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm install prometheus prometheus-community/prometheus

# Acceder a la interfaz web de Prometheus
kubectl port-forward svc/prometheus-server 9090:80


Deployments

Un Deployment es un objeto que se puede representar una aplicación del cluster. Cuando se crea el Deployment, se puede especificar en el spec del Deployment cuantas réplicas de la aplicación se desea correr.

Veamos un ejemplo de cómo crear un Deployment por medio de un archivo Yml.


# deployment-example.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deployment
  labels: 
    app: myapp
    type: front-end
spec:
  template:
    metadata:
      name: myapp-pod
      labels:
        app: my-app
        type: front-end
    spec:
      containers:
        - name: my-container
          image: nginx:latest
  replicas: 3
  selector:
    matchlabels:
      type: front-end


💡Nota: En el ejemplo anterior vemos un archivo Yaml que se llama ‘deployment-example.yaml’, lo primero sería crear el deployment, en segundo lugar sería listar los secrets para constatar si fue creado de manera satisfactoria, los comandos serían en este orden y de esta forma:


# Crear Deployment
kubectl create -f deployment-example.yaml

# Listar Deployments
kubectl get deployments

#Listar replicasets
kubectl get replicaset

#Listar Pods
kubectl get pods



Actualizaciones y Rollbacks

Los Rolling Updates permiten actualizar aplicaciones de manera gradual para evitar interrupciones.

Ejemplo de actualización de un ‘Deployment’



# Actualizar la imagen del contenedor
kubectl set image deployment/my-deployment my-container=nginx:1.21.1

# Realizar un rollback a la versión anterior
kubectl rollout undo deployment/my-deployment



Caso de uso Avanzado

Kubernetes se puede utilizar en diversos casos de uso, como despliegues multiclusters, almacenamiento persistente, ejecución de tareas batch, entre otros.

Veamos un ejemplo de cómo crear una TareaBatch por medio de un archivo Yml.



# job-example.yaml

apiVersion: batch/v1
kind: Job
metadata:
  name: my-job
spec:
  template:
    spec:
      containers:
        - name: my-container
          image: busybox:1.33.1
          command: ["echo", "Hello from the job!"]
      restartPolicy: Never


💡Nota: En el ejemplo anterior vemos un archivo Yaml que se llama ‘job-example.yaml’, lo primero sería crear el job, en segundo lugar sería listar los jobs para constatar si fue creado de manera satisfactoria, los comandos serían en este orden y de esta forma:


# Crear Job
kubectl apply -f job-example.yaml

# Listar Jobs
kubectl get jobs



Conclusión

Con esto hemos explorado una amplia gama de conceptos que se utilizan en Kubernetes desde los conceptos más básicos como la creación de un Pod hasta los más avanzados. Este es una herramienta muy poderosa que te permite orquestar aplicaciones de manera eficiente y escalable en entornos de contenedores.

Roberto Palacios

September 20, 2023