Cómo funcionan los servicios de Kubernetes

Cómo funcionan los servicios de Kubernetes

  • ITOps y DevOps
6 min de lectura Actualizado Jun 4, 2021

Puntos clave: Los servicios Kubernetes son esenciales para exponer aplicaciones y gestionar el balanceo de carga dentro de clústeres, proporcionando puntos finales estables a pesar de los cambios dinámicos de IP en pods. Admiten varios tipos de servicios, incluyendo ClusterIP, NodePort, LoadBalander y ExternalName.

  • Los servicios pueden crearse con o sin selectores para una gestión flexible de pods.
  • Simplifican el descubrimiento de servicios, eliminando la necesidad de mecanismos separados.

Un servicio Kubernetes están una colección lógica de pods en un clúster Kubernetes. Podemos Define un servicio K8s como una forma abstracta de balancear la carga entre los pods y exponer una aplicación desplegada en un conjunto de pods. Además, usar el mecanismo de servicio incorporado en Kubernetes elimina la necesidad de implementar un mecanismo separado de descubrimiento de servicios.

En este artículo, hablaremos sobre la estructura de un servicio Kubernetes y cómo utilizarlo.

¿Qué son los servicios de Kubernetes?

Un servicio Kubernetes puede usarse para exponer fácilmente una aplicación desplegada en un conjunto de pods usando un único punto final. Un servicio están tanto un objeto REST como una abstracción que define:

  • Un conjunto de cápsulas
  • Una política para acceder a ellos

Los pods en un despliegue de Kubernetes son creados y destruidos regularmente, lo que provoca que sus direcciones IP cambien constantemente. Esto Crea problemas de descubrimiento para el desplegado, lo que dificulta que el frontend de la aplicación identifique qué pods conectar.

Aquí están donde entran en juego las fortalezas de los servicios Kubernetes: los servicios llevan un registro de los cambios en las direcciones IP y los nombres DNS de los pods y los exponen al usuario final como una única IP o DNS.

Los servicios de Kubernetes utilizan selectores para dirigir un conjunto de pods:

  • Para aplicaciones nativas de Kubernetes (que utilizan APIs de Kubernetes para el descubrimiento de servicios), la API de endpoint se actualizará siempre que son cambios en los pods del servicio.
  • Las aplicaciones no nativas pueden utilizar métodos de implementación de puentes o balanceadores de carga basados en IP virtuales ofrecidos por Kubernetes para dirigir el tráfico a los pods del backend.

Atributos de un servicio Kubernetes

Aquí son los atributos generales de un servicio:

  • A un servicio se le está asignada una dirección IP ("IP de clúster"), que utilizan los proxies del servicio.
  • Un servicio puede asignar un puerto entrante a cualquier puerto destino. (Por defecto, el puerto destino se está asignado al mismo valor del campo puerto, y puede definirse como una cadena.)
  • El número de puerto asignado a cada nombre puede variar en cada pod backend. (Por ejemplo, te puede cambiar el número de puerto que exponen los pods en la siguiente versión de tu software backend sin romper a los clientes.)
  • Los servicios soportan TCP (por defecto), UDP y SCTP para protocolos.
  • Los servicios pueden definirse con o sin un selector.
  • Los servicios soportan una variedad de definiciones de puertos

Ahora vamos a Ve cómo funcionan los servicios.

Definición de un servicio Kubernetes

Como se mencionó antes, podemos Define servicios Kubernetes con o sin selectores—¡hagamos ambas cosas!

Definición de un servicio con un selector

En el siguiente ejemplo, hemos definido un servicio sencillo que expone el puerto 80 del servicio mientras se dirige al puerto 8080 en los Pods con la etiqueta selectora "app=webserver-nginx".

    apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: webserver-nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080

Kubernetes asignará automáticamente una dirección IP ("IP del clúster") que será utilizada por los proxies de servicio para enrutar el tráfico. El controlador del selector supervisa consistentemente si los Pods coinciden con la etiqueta definida.

Algunas aplicaciones requerirán que se expongan múltiples puertos a través del servicio. Kubernetes facilita esto utilizando servicios multipuerto donde un usuario puede Define múltiples puertos en un solo objeto de servicio. Al definir un servicio multipuerto, el requisito principal están proporcionar nombres para cada puerto expuesto para que son inequívocos. Estos nombres de puertos pueden:

  • Solo contienen caracteres alfanuméricos y el símbolo de guion
  • Debería Comienza y terminar con un carácter alfanumérico.

En este ejemplo, hemos expuesto tanto los puertos 80 como 443 a los puertos objetivo 8080 y 8090 para enrutar tráfico HTTP y HTTPS a pods subyacentes usando el selector "app=webserver-nginx-multiport"

    apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: webserver-nginx-multiport
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 8080
    - name: https
      protocol: TCP
      port: 443
      targetPort: 8090

Definición de un servicio sin selector

Al definir un servicio sin selector, te necesario asignar manualmente el servicio a la dirección IP y puerto correspondientes añadiendo un objeto endpoints. La razón están que los objetos endpoint no se crean automáticamente como son con un selector, ya que Kubernetes no sabe a qué pods debe estar conectado el servicio. Servicio:

    apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080

Punto final:

    apiVersion: v1
kind: Endpoints
metadata:
  name: nginx-service
subsets:
  - addresses:
      - ip: 192.10.0.1
    ports:
      - port: 8080

Al definir un servicio y el punto final, la consideración principal están que tanto el nombre del servicio como el del punto final deben coincidir exactamente.

Algunos casos de utiliza para servicios sin selectores incluyen:

  • Conectarse a un servicio diferente en otro Namespace o en otro clúster
  • Comunicación con servicios externos, migración de datos, servicios de prueba, despliegues, etc.

Creación de un servicio Kubernetes

Ahora que conocemos la estructura básica de un servicio Kubernetes, utilizemos un ejemplo práctico para entender mejor cómo Crea un servicio. Primero, Crea un pequeño despliegue con cuatro réplicas de un servidor web Apache.

apache-deployment.yaml

    apiVersion: apps/v1
kind: Deployment
metadata:
  name: apache-deployment
  labels:
    app: webserver
spec:
  replicas: 4
  selector:
    matchLabels:
      app: webserver
  template:
    metadata:
      labels:
        app: webserver
    spec:
      containers: 
      - name: apache
        image: bitnami/apache:latest
        ports:
        - containerPort: 80

Crea el despliegue.

    kubectl apply -f apache-deployment.yaml

Resultado:

Despliegue de apache

Comprueba el estado del despliegue.

    kubectl get deployment apache-deployment

Resultado:

Obtén Despliegue

Ahora hemos desplegado la aplicación en el servidor Apache.

A continuación, Crea un servicio para acceder a nuestra aplicación desplegada. Ambos son métodos para hacerlo:

  1. Crea un manifiesto YAML para un servicio
  2. Utiliza el comando "kubectl expose"

El comando expose permite a los usuarios Crea el servicio directamente desde la línea de comandos.

Podemos utilizar el siguiente comando para exponer el "apache-deployment" con el tipo de servicio ClusterIP. Apuntaremos el servicio al puerto 8080 ya que la imagen "bitnami/apache" usa el puerto 8080 como puerto HTTP.

    kubectl expose deployment apache-deployment --name=apache-http-service --type=ClusterIP --port=8080 --target-port=8080

Resultado:

Despliegue de Expose

Comprueba si el servicio está creado correctamente.

    kubectl get service apache-http-service

Resultado:

Servicio HTTP

Ahora necesitamos reenviar el tráfico al servicio que creamos, y podemos utilizar el comando "kubectl port-forward" para eso. Dirigiremos el tráfico desde el puerto host 8090 al puerto de servicio 8080.

    kubectl port-forward service/apache-http-service 8090:8080

Resultado:

Adelante

Cuando naveguemos a la "http://localhost:8090", nos dirigirán a una página de aterrizaje de Nginx como la siguiente.

Trabajo local

También podríamos haber definido un servicio usando un archivo YAML para el escenario anterior, como se muestra a continuación. Allí hemos configurado el selector como "app=webserver."

    apiVersion: v1
kind: Service
metadata:
  name: apache-http-service
spec:
  selector:
    app: webserver
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 8080

Tipos de servicios Kubernetes

Son cuatro tipos de servicios Kubernetes:

Kubernates-Servicios

Este es el tipo predeterminado que expone el servicio en una IP interna del clúster. Estos servicios solo son accesibles dentro del clúster. Por tanto, los usuarios deben implementar reenvío de puertos o un proxy para exponer un ClusterIP a una entrada más amplia de tráfico.

Un servicio NodePort expone el servicio en la IP de cada nodo en un puerto estático. Se está creado automáticamente un servicio ClusterIP para enrutar el tráfico al servicio NordPort. Los usuarios pueden comunicarse con el servicio desde fuera solicitando:

Esta es la solución preferida para exponer el clúster a internet más amplio. El tipo de servicio LoadBalancer Crea un balanceador de carga (el tipo de balanceador depende del proveedor de la nube) y expondrá el servicio externamente.

También Crea automáticamente los servicios ClusterIP y NodePort y enrutará el tráfico en consecuencia.

Este tipo de servicio mapea el servicio al contenido del campo externalName (Ex: app.test.com). Esto lo hace devolviendo un valor para el registro CNAME.

Implementaciones de proxy de servicio

El proceso kube-proxy implementa una forma de IPs virtuales para todos los tipos de servicio, excluyendo el tipo ExternalName. El uso de proxy para servicios permite a los usuarios mitigar algunos problemas de resolución DNS.

Por ejemplo, si un registro DNS está caducado, puede haber casos en los que consultas DNS anteriores son aún almacenadas en caché con el registro caducado, lo que puede causar problemas de resolución. De manera similar, que los registros DNS no se propaguen correctamente también puede provocar problemas de resolución.

Los siguientes tres métodos pueden ser utilizados por el proxy kube para enrutar el tráfico:

  • Modo proxy: espacio de usuario
  • Modo proxy: iptables
  • Modo proxy: ipvs

Modo proxy: espacio de usuario

En este modo, kube-proxy monitoriza el maestro Kubernetes y, cada vez que se crea o elimina un servicio o un punto final, asigna o desasigna un puerto aleatorio en el nodo local.

Todas las conexiones a este "puerto proxy" son proxiadas al servicio y a los endpoints necesarios.

Modo proxy: iptables

Este modo también monitoriza el maestro Kubernetes para servicios y endpoints. Sin embargo, también instala reglas iptable para capturar el tráfico al ClusterIP del servicio y el puerto y luego redirigir el tráfico.

Además, instala reglas iptable para que los objetos del endpoint seleccionen el Pod del backend, mientras que el comportamiento por defecto están seleccionar un backend aleatorio. (Pod)

En este modo, el kube-proxy vigila los servicios y endpoints y luego llama a la interfaz Netlink para Crea las reglas IPvs (IP Virtual Server) apropiadas. Este modo sincronizará periódicamente las reglas ipvs con los servicios y el endpoint para mantener todo actualizado.

Descubriendo los servicios de Kubernetes

te puede utiliza dos métodos para descubrir un servicio: DNS o Variable de Entorno.

Este es el método preferido para el descubrimiento de servicios. Aquí, el servidor DNS se está añadido al clúster Kubernetes que vigila la API de Kubernetes y crea registros DNS para cada nuevo servicio. Cuando el DNS está habilitado, a nivel de clúster todos los Pods podrán realizar la resolución de nombres de servicios.

Variables ambientales

En este método, kubelet añade variables de entorno a los Pods para cada servicio activo. Al usar este método, debe crearse el servicio deseado antes de crear los Pods que utilizarán ese servicio. De lo contrario, los Pods no Obtén las variables de entorno necesarias para el servicio deseado.

Cuando no se son necesarios el balanceo de carga ni la IP de un solo servicio, los usuarios pueden Crea un servicio headless especificando explícitamente "none" para el campo IP del clúster (.spec.clusterIP). Estos servicios headless no tienen IPs de Clúster asociadas, y la plataforma no les está proporcionado balanceo de carga ni proxy. El proxy de Kube también ignora estos servicios.

La configuración DNS de estos servicios depende de los selectores definidos en los servicios.

  • Servicio headless con selectores. El controlador del endpoint Crea los registros del endpoint en la API, modificando el registro DNS para devolver un registro A que apunta a los Pods necesarios.
  • Servicio headless sin selectores. El controlador del endpoint no Crea ningún registro endpoint sin tener los selectores configurados.

Resumen de los servicios K8s

Con esto, hemos cubierto todos los conceptos básicos de los servicios de Kubernetes. Ahora conocemos los servicios, incluyendo los diferentes tipos, el descubrimiento de servicios y los usos de proxy de servicio. Los servicios son una parte integral de Kubernetes y proporcionan medios para facilitar la comunicación entre pods, servicios externos y usuarios.

Estas publicaciones son mías y no representan necesariamente la posición, estrategias u opinión de BMC.

Más de ITOps y DevOps

Suscríbete al Informe

Al registrarse para esta oferta te son confirmar que te leído y aceptado la Política de Privacidad de BMC.

Gracias te

Tú te has suscrito a The Brief
El Brief abarca la orquestación de mainframe y empresa—BMC AMI y Control-M—y la investigación de analistas, despliegues de clientes y eventos en ambas áreas.