Conectar Pods con Servicios de Kubernetes

KubernetesKubernetesBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En Kubernetes, los Pods son efímeros y pueden ser terminados y recreados en cualquier momento. Esto presenta un desafío cuando se trata de redes, ya que es difícil conectarse directamente a un Pod. Para resolver este problema, Kubernetes proporciona una abstracción de nivel superior llamada Servicio (Service). Un Servicio proporciona una dirección IP estáble y un nombre DNS para un conjunto de Pods, lo que permite a otros componentes conectarse a ellos fácilmente. En este laboratorio, aprenderás cómo conectar Pods con Servicios en Kubernetes.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL kubernetes(("Kubernetes")) -.-> kubernetes/ConfigurationandVersioningGroup(["Configuration and Versioning"]) kubernetes(("Kubernetes")) -.-> kubernetes/BasicsGroup(["Basics"]) kubernetes(("Kubernetes")) -.-> kubernetes/BasicCommandsGroup(["Basic Commands"]) kubernetes(("Kubernetes")) -.-> kubernetes/AdvancedCommandsGroup(["Advanced Commands"]) kubernetes(("Kubernetes")) -.-> kubernetes/TroubleshootingandDebuggingCommandsGroup(["Troubleshooting and Debugging Commands"]) kubernetes/BasicsGroup -.-> kubernetes/initialization("Initialization") kubernetes/BasicCommandsGroup -.-> kubernetes/get("Get") kubernetes/BasicCommandsGroup -.-> kubernetes/create("Create") kubernetes/BasicCommandsGroup -.-> kubernetes/set("Set") kubernetes/BasicCommandsGroup -.-> kubernetes/expose("Expose") kubernetes/AdvancedCommandsGroup -.-> kubernetes/apply("Apply") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/describe("Describe") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/exec("Exec") kubernetes/ConfigurationandVersioningGroup -.-> kubernetes/label("Label") subgraph Lab Skills kubernetes/initialization -.-> lab-15815{{"Conectar Pods con Servicios de Kubernetes"}} kubernetes/get -.-> lab-15815{{"Conectar Pods con Servicios de Kubernetes"}} kubernetes/create -.-> lab-15815{{"Conectar Pods con Servicios de Kubernetes"}} kubernetes/set -.-> lab-15815{{"Conectar Pods con Servicios de Kubernetes"}} kubernetes/expose -.-> lab-15815{{"Conectar Pods con Servicios de Kubernetes"}} kubernetes/apply -.-> lab-15815{{"Conectar Pods con Servicios de Kubernetes"}} kubernetes/describe -.-> lab-15815{{"Conectar Pods con Servicios de Kubernetes"}} kubernetes/exec -.-> lab-15815{{"Conectar Pods con Servicios de Kubernetes"}} kubernetes/label -.-> lab-15815{{"Conectar Pods con Servicios de Kubernetes"}} end

Iniciar el clúster de Minikube

Antes de crear recursos, necesitas un clúster de Kubernetes en ejecución. Minikube es un entorno ligero de Kubernetes que se ejecuta en tu máquina local.

  1. Navegar a tu directorio de trabajo:

    Abre la terminal y navega hasta la carpeta de proyecto predeterminada:

    cd /home/labex/project
  2. Iniciar Minikube:

    Inicia Minikube para inicializar un clúster de Kubernetes:

    minikube start
    • Este comando configura un clúster de Kubernetes de un solo nodo en tu máquina local.
    • Minikube puede tardar unos minutos en iniciarse dependiendo del rendimiento de tu sistema.
  3. Verificar que Minikube esté en ejecución:

    Comprueba el estado del clúster de Minikube:

    minikube status
    • Busca componentes como kubelet y apiserver listados como Running (En ejecución).
    • Si el clúster no está en ejecución, vuelve a ejecutar minikube start.

Si encuentras problemas al iniciar Minikube, utiliza minikube delete para restablecer el entorno si es necesario.

Crear un Pod

El primer paso es crear un Pod simple. Crea un archivo llamado /home/labex/project/myapp-pod.yaml con el siguiente contenido:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod-1
  labels:
    app: nginx
spec:
  containers:
    - name: my-container
      image: nginx

Guarda el archivo y crea el Pod ejecutando el siguiente comando:

kubectl apply -f /home/labex/project/myapp-pod.yaml

Esto creará un Pod llamado my-pod-1 con un solo contenedor que ejecuta la imagen de Nginx.

Crear un Servicio (Service)

El segundo paso es crear un Servicio (Service) que apunte al Pod que creaste en el paso anterior. Crea un archivo llamado /home/labex/project/service.yaml con el siguiente contenido:

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: nginx
  ports:
    - name: http
      port: 80
      targetPort: 80

Guarda el archivo y crea el Servicio (Service) ejecutando el siguiente comando:

kubectl apply -f /home/labex/project/service.yaml

Esto creará un Servicio (Service) llamado my-service que apunta a los Pods con la etiqueta app=nginx y expone el puerto 80.

Probar el Servicio (Service)

El tercer paso es probar el Servicio (Service) accediendo a él desde otro Pod. Crea un archivo llamado /home/labex/project/test-pod-1.yaml con el siguiente contenido:

apiVersion: v1
kind: Pod
metadata:
  name: test-pod-1
spec:
  containers:
    - name: my-container
      image: nginx
      command:
        - sleep
        - "3600"

Guarda el archivo y crea el Pod de prueba ejecutando el siguiente comando:

kubectl apply -f /home/labex/project/test-pod-1.yaml

Esto creará un Pod llamado test-pod-1 con un solo contenedor que ejecuta la imagen de Nginx.

A continuación, ejecutarás un comando dentro del contenedor y usarás curl para acceder al Servicio (Service). Ejecuta el siguiente comando para ejecutar un shell dentro del contenedor:

kubectl exec -it test-pod-1 -- sh

Esto abrirá un shell dentro del contenedor. Desde el shell, ejecuta el siguiente comando para acceder al Servicio (Service):

curl http://my-service

Esto devolverá la página predeterminada de Nginx, lo que indica que el Servicio (Service) está funcionando correctamente.

Actualizar el Servicio (Service)

El cuarto paso es actualizar el Servicio (Service) para que apunte a un conjunto diferente de Pods. Actualiza el campo selector en el archivo /home/labex/project/service.yaml con lo siguiente:

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: busybox
  ports:
    - name: http
      port: 80
      targetPort: 8

Guarda el archivo y actualiza el Servicio (Service) ejecutando el siguiente comando:

kubectl apply -f service.yaml

Esto actualizará el Servicio (Service) para que apunte a los Pods con la etiqueta app=busybox.

Probar el Servicio (Service) Actualizado

El quinto paso es probar el Servicio (Service) actualizado accediendo a él desde otro Pod. Crea un nuevo Pod de prueba con el siguiente comando:

kubectl run my-pod-2 --image=nginx --restart=Never

Esto creará un nuevo Pod llamado test-pod-2 con un solo contenedor que ejecuta la imagen de Nginx.

Ejecuta un comando dentro del contenedor y usa curl para acceder al Servicio (Service) como hiciste en el Paso 3. Esta vez, deberías recibir un error que indique que la conexión fue rechazada.

Esto se debe a que el Servicio (Service) ahora apunta a un conjunto diferente de Pods al que está ejecutando el Pod de prueba. Para solucionar esto, puedes actualizar la etiqueta del Pod para que coincida con el nuevo selector en el Servicio (Service).

Ejecuta el siguiente comando para actualizar la etiqueta del Pod de prueba:

kubectl label pod my-pod-2 app=busybox

Esto agregará la etiqueta app=busybox al Pod de prueba.

Ahora, si vuelves a ejecutar el comando curl, deberías obtener la página predeterminada de Nginx, lo que indica que el Servicio (Service) está funcionando correctamente.

Resumen

En este laboratorio, aprendiste cómo conectar Pods con Servicios (Services) en Kubernetes. Creaste un simple Pod que ejecuta la imagen de Nginx, creaste un Servicio (Service) para apuntar al Pod y probaste el Servicio (Service) accediéndole desde otro Pod. También aprendiste cómo actualizar el Servicio (Service) para que apunte a un conjunto diferente de Pods y cómo actualizar la etiqueta de un Pod para que coincida con el nuevo selector en el Servicio (Service). Los Servicios (Services) son un componente esencial de la red en Kubernetes y te permiten conectarte a los Pods de manera confiable y escalable.