Cómo mapear puertos en el servicio 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

Este tutorial proporcionará una comprensión integral de los Servicios de Kubernetes, un concepto fundamental en el ecosistema de Kubernetes. Aprenderá sobre los diferentes tipos de servicios, cómo exponer sus aplicaciones a la red y los conceptos avanzados relacionados con los Servicios de Kubernetes.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL kubernetes(("Kubernetes")) -.-> kubernetes/BasicCommandsGroup(["Basic Commands"]) kubernetes(("Kubernetes")) -.-> kubernetes/AdvancedCommandsGroup(["Advanced Commands"]) kubernetes(("Kubernetes")) -.-> kubernetes/TroubleshootingandDebuggingCommandsGroup(["Troubleshooting and Debugging Commands"]) kubernetes(("Kubernetes")) -.-> kubernetes/ConfigurationandVersioningGroup(["Configuration and Versioning"]) kubernetes/BasicCommandsGroup -.-> kubernetes/get("Get") kubernetes/BasicCommandsGroup -.-> kubernetes/create("Create") kubernetes/BasicCommandsGroup -.-> kubernetes/expose("Expose") kubernetes/AdvancedCommandsGroup -.-> kubernetes/apply("Apply") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/describe("Describe") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/port_forward("Port-Forward") kubernetes/ConfigurationandVersioningGroup -.-> kubernetes/config("Config") subgraph Lab Skills kubernetes/get -.-> lab-418977{{"Cómo mapear puertos en el servicio de Kubernetes"}} kubernetes/create -.-> lab-418977{{"Cómo mapear puertos en el servicio de Kubernetes"}} kubernetes/expose -.-> lab-418977{{"Cómo mapear puertos en el servicio de Kubernetes"}} kubernetes/apply -.-> lab-418977{{"Cómo mapear puertos en el servicio de Kubernetes"}} kubernetes/describe -.-> lab-418977{{"Cómo mapear puertos en el servicio de Kubernetes"}} kubernetes/port_forward -.-> lab-418977{{"Cómo mapear puertos en el servicio de Kubernetes"}} kubernetes/config -.-> lab-418977{{"Cómo mapear puertos en el servicio de Kubernetes"}} end

Comprendiendo los Servicios de Kubernetes

Los Servicios de Kubernetes son un concepto fundamental en el ecosistema de Kubernetes, proporcionando una manera de exponer aplicaciones que se ejecutan en Pods a la red. Los servicios abstraen los Pods subyacentes, permitiendo a los clientes conectarse a la aplicación sin necesidad de conocer los detalles de los Pods.

Tipos de Servicios de Kubernetes

Kubernetes ofrece varios tipos de servicios para satisfacer diferentes requisitos de red:

  1. ClusterIP: Este es el tipo de servicio predeterminado, que expone el servicio en una dirección IP interna del clúster. Este tipo de servicio solo es accesible desde dentro del clúster.
graph LR Client --> ClusterIP ClusterIP --> Pods
  1. NodePort: Este tipo de servicio expone la aplicación en la dirección IP de cada nodo, utilizando un puerto estático. Esto permite a los clientes externos acceder a la aplicación desde fuera del clúster.
graph LR Client --> NodePort NodePort --> Nodes Nodes --> Pods
  1. LoadBalancer: Este tipo de servicio provisiona un equilibrador de carga para la aplicación, generalmente en entornos de nube. El equilibrador de carga distribuye el tráfico a los Pods.
graph LR Client --> LoadBalancer LoadBalancer --> Nodes Nodes --> Pods
  1. ExternalName: Este tipo de servicio mapea el servicio a un nombre DNS, sin ningún Pod o punto final. Esto es útil para integrarse con servicios externos.

Componentes del Servicio

Un servicio de Kubernetes está compuesto por varios componentes clave:

  1. Selector: El selector es un conjunto de etiquetas que determinan qué Pods formarán parte del servicio.
  2. Puerto: El puerto en el que el servicio será accesible.
  3. TargetPort: El puerto en el que los Pods están escuchando.
  4. ClusterIP: La dirección IP interna asignada al servicio.
  5. Tipo: El tipo de servicio, como se describió anteriormente.

A continuación, se muestra una configuración de servicio de ejemplo:

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: my-app
  ports:
    - port: 80
      targetPort: 8080
  type: LoadBalancer

En este ejemplo, el servicio expondrá los Pods con la etiqueta app: my-app en el puerto 80, redirigiendo el tráfico al puerto 8080 de los Pods.

Exponiendo Aplicaciones de Kubernetes

Una vez que se ha definido un servicio de Kubernetes, el siguiente paso es exponer su aplicación al mundo exterior. Kubernetes ofrece varias maneras de lograr esto, cada una con sus propias ventajas y casos de uso.

Servicio NodePort

El tipo de servicio NodePort expone la aplicación en la dirección IP de cada nodo, utilizando un puerto estático. Esto permite a los clientes externos acceder a la aplicación desde fuera del clúster. Aquí hay un ejemplo:

apiVersion: v1
kind: Service
metadata:
  name: my-nodeport-service
spec:
  type: NodePort
  selector:
    app: my-app
  ports:
    - port: 80
      targetPort: 8080

En este ejemplo, el servicio será accesible en la dirección IP de cada nodo, utilizando un puerto asignado aleatoriamente en el rango de 30000 a 32767.

Servicio LoadBalancer

El tipo de servicio LoadBalancer provisiona un equilibrador de carga para la aplicación, generalmente en entornos de nube. El equilibrador de carga distribuye el tráfico a los Pods. Aquí hay un ejemplo:

apiVersion: v1
kind: Service
metadata:
  name: my-loadbalancer-service
spec:
  type: LoadBalancer
  selector:
    app: my-app
  ports:
    - port: 80
      targetPort: 8080

En este ejemplo, el proveedor de nube provisionará un equilibrador de carga y lo configurará para distribuir el tráfico a los Pods.

Ingress

Ingress es un recurso de Kubernetes que proporciona capacidades avanzadas de enrutamiento y equilibrado de carga. Ingress le permite exponer múltiples servicios bajo una sola dirección IP y puede manejar características como la terminación SSL/TLS, el enrutamiento basado en rutas y más. Aquí hay una configuración de Ingress de ejemplo:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
spec:
  rules:
    - host: example.com
      http:
        paths:
          - path: /api
            pathType: Prefix
            backend:
              service:
                name: my-api-service
                port:
                  number: 80
          - path: /web
            pathType: Prefix
            backend:
              service:
                name: my-web-service
                port:
                  number: 80

En este ejemplo, el Ingress expone dos servicios diferentes, /api y /web, bajo el dominio example.com.

Conceptos Avanzados de los Servicios de Kubernetes

Si bien los tipos básicos de servicios de Kubernetes cubren muchos casos de uso, existen algunos conceptos avanzados que pueden proporcionar más flexibilidad y control sobre la red de su aplicación.

Detección de Servicios

Kubernetes proporciona mecanismos de detección de servicios integrados, lo que permite a los Pods encontrarse y comunicarse entre sí. Esto se logra a través del uso de variables de entorno y el servidor DNS de Kubernetes.

Cuando se crea un nuevo servicio, Kubernetes le asigna automáticamente un nombre DNS en el formato <service-name>.<namespace>.svc.cluster.local. Los Pods pueden entonces usar este nombre DNS para conectarse al servicio.

Kubernetes también inyecta variables de entorno para cada servicio, como MY_SERVICE_HOST y MY_SERVICE_PORT, que los Pods pueden usar para conectarse al servicio.

Red de Servicios

Kubernetes utiliza el componente kube-proxy para manejar la red de los servicios. kube-proxy se encarga de configurar las reglas de iptables necesarias y de redirigir el tráfico a los Pods adecuados.

Kubernetes admite múltiples modelos de red, como iptables e ipvs, que se pueden configurar según sus requisitos.

Escalado de Servicios

Los servicios de Kubernetes pueden escalar automáticamente hacia arriba y hacia abajo según el número de Pods disponibles. Cuando escala su aplicación agregando o eliminando Pods, el servicio ajustará automáticamente su equilibrado de carga para distribuir el tráfico en consecuencia.

También puede configurar opciones de escalado avanzadas, como el escalado automático horizontal de pods, para escalar automáticamente su aplicación según métricas como la utilización de CPU o métricas personalizadas.

A continuación, se muestra un ejemplo de un escalador automático horizontal de pods:

apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: my-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-app
  minReplicas: 2
  maxReplicas: 10
  metrics:
    - type: Resource
      resource:
        name: cpu
        targetAverageUtilization: 50

En este ejemplo, el escalador automático horizontal de pods escalará automáticamente la implementación my-app entre 2 y 10 Pods, según la utilización media de CPU de los Pods.

Resumen

En este tutorial, ha aprendido sobre los diferentes tipos de servicios de Kubernetes, incluyendo ClusterIP, NodePort y LoadBalancer, y cómo se pueden utilizar para exponer sus aplicaciones a la red. También ha explorado los componentes clave de un servicio de Kubernetes y cómo configurarlos. Al comprender los servicios de Kubernetes, puede administrar y exponer efectivamente sus aplicaciones que se ejecutan en Pods, lo que permite a los clientes conectarse a su aplicación sin necesidad de conocer los detalles de los Pods subyacentes.