Target
- Comprender el servicio de Kubernetes
- Comprender la relación entre Labels y LabelSelector and Service
- En el clúster de kubernetes, publique aplicaciones a través del Servicio
Descripción general del servicio Kubernetes
De hecho, Pod (Container Group) tiene su propio ciclo de vida . Cuando el nodo de trabajo (nodo) falla, el Pod (grupo de contenedores) que se ejecuta en el nodo también desaparecerá. Luego, la implementación puede ajustar dinámicamente el clúster a su estado original creando un nuevo Pod (grupo de contenedores) para mantener la aplicación en funcionamiento.
Por ejemplo, suponga que hay un programa de fondo de procesamiento de imágenes con 3 copias en tiempo de ejecución. Estas 3 copias son reemplazables (aplicaciones sin estado). Incluso si el Pod (grupo de contenedores) desaparece y se recrea, o el número de copias aumenta de 3 a 5, el sistema de front-end no necesita prestar atención a los cambios de las copias de fondo. Dado que cada Pod (grupo de contenedores) en el clúster de Kubernetes tiene una dirección IP única (incluso si es un Pod diferente en el mismo nodo), necesitamos un mecanismo para proteger el Pod (grupo de contenedores) del sistema back-end del sistema front-end. Cambios en la dirección IP durante el proceso de destrucción y creación.
El servicio en Kubernetes proporciona una capa de abstracción que selecciona Pods (grupos de contenedores) con ciertas características y define un método de acceso para ellos. El servicio desacopla la interdependencia entre Pods (grupos de contenedores) (el acceso original a otro Pod desde un Pod requiere conocer la dirección IP de la otra parte) . El PodSelector (grupo de contenedores) seleccionado por un Servicio generalmente lo determina LabelSelector.
Al crear un Servicio, al establecer el valor del campo spec.type en el archivo de configuración, la aplicación puede exponerse al exterior de diferentes maneras:
-
ClusterIP (predeterminado)
Anuncie servicios en IP internas en el clúster, de esta manera solo se puede acceder al Servicio dentro del clúster
-
NodePort
Use NAT para anunciar servicios en el mismo puerto de cada clúster. De esta manera, puede acceder al servicio accediendo a cualquier nodo + número de puerto en el clúster
<NodeIP>:<NodePort>
. En este momento, el método de acceso de ClusterIP todavía está disponible. -
LoadBalancer
En un entorno de nube (requiere soporte del proveedor de la nube), cree un equilibrador de carga fuera del clúster y use la dirección IP del equilibrador de carga como la dirección de acceso al servicio. En este momento, los métodos de acceso de ClusterIP y NodePort todavía están disponibles.
Resumen:
El servicio es una capa de abstracción: selecciona un grupo de pods (grupos de contenedores) a través de LabelSelector, publica los puertos designados de estos pods en el exterior del clúster y admite el equilibrio de carga y el descubrimiento de servicios.
- Anuncie el puerto de Pod para hacerlo accesible
- Balanceo de carga entre múltiples pods
- Usar etiqueta y LabelSelector
Servicios y etiquetas
En la figura siguiente, hay dos servicios, el Servicio A (línea amarilla discontinua) y el Servicio B (línea azul discontinua). El Servicio A reenvía la solicitud al Pod con una IP de 10.10.10.1, y el Servicio B reenvía la solicitud a la IP con 10.10.10.2, 10.10. 10.3, 10.10.10.4 Pod.
El servicio enruta las solicitudes externas a un conjunto de Pods, que proporciona una capa de abstracción que permite a Kubernetes programar dinámicamente grupos de contenedores sin afectar al llamador del servicio (recrear el grupo de contenedores después de que el grupo de contenedores falle y aumentar o disminuir el mismo Una implementación corresponde a la cantidad de grupos de contenedores, etc.) .
El servicio utiliza etiquetas, LabelSelector (etiquetas y selectores) para que coincida con un grupo de pods . Las etiquetas (etiquetas) son pares clave / valor unidos a objetos de Kubernetes y tienen múltiples usos:
- Asigne objetos de Kubernetes (Nodo, Implementación, Pod, Servicio, etc.) para el entorno de desarrollo, el entorno de prueba o el entorno de producción
- Etiquetas de versión integradas, use etiquetas para distinguir diferentes versiones de software de aplicación
- Use etiquetas para clasificar objetos de Kubernetes
La siguiente figura muestra la asociación entre Labels y LabelSelector
- La implementación B contiene LabelSelector para app = B. De esta manera, declare Pod con la etiqueta app = B asociada a ella
- El Pod creado por Deployment B contiene la etiqueta app = B
- El servicio B selecciona Pods que se pueden enrutar a través de la aplicación de selector de etiquetas = B
Se pueden adjuntar etiquetas al crear objetos de Kubernetes, o se pueden adjuntar después de la creación. Puede modificar las etiquetas de un objeto Kubernetes en cualquier momento
Combate real: crear un servicio para la implementación de nginx
Las etiquetas se definen en la implementación que creó nginx, de la siguiente manera:
metadatos: # El nombre traducido son metadatos, es decir, algunos atributos básicos e información del nombre de implementación : nginx-implement # Etiquetas de nombre de implementación : #etiquetas , puede ubicar de manera flexible uno o más recursos, donde la clave y el valor se pueden personalizar y definir Múltiples grupos de aplicaciones: nginx # Establezca la clave para la implementación en la aplicación y el valor para las etiquetas nginx
Crear archivo nginx-service.yaml
vi nginx-service.yaml
El contenido es el siguiente
apiVersion: v1 kind: metadatos del servicio : nombre: nginx-service # Etiquetas del nombre del servicio : #Service propia etiqueta de la aplicación: nginx # Configure la clave para el Servicio como la aplicación y el valor como la especificación de la etiqueta nginx : # Esto se trata del Servicio Definición, describe cómo el Servicio selecciona Pod y cómo acceder al selector: #tag selector de aplicación: nginx #seleccionar puertos Pod con la aplicación de etiqueta: nginx : -name: nginx-port #port nombre protocolo: TCP #protocol tipo TCP / Puerto UDP : 80 # Se puede acceder a otros grupos de contenedores en el clúster a través del puerto 80 Puerto nodo de servicio : 32600 # Acceso a través del puerto 32600 de cualquier nodo Puerto objetivo de servicio : 80 # Reenviar la solicitud al puerto 80 que coincida con el tipo de Pod : NodePort # Tipo de servicio, ClusterIP / NodePort / LoaderBalancer
Comando de ejecución
[root @ guanbin-k8s-master k8s] # kubectl apply -f nginx-service.yaml service / nginx-service created
Verificar el resultado de la ejecución
Puede ver el servicio llamado nginx-service.
[root @ guanbin-k8s-master k8s] # kubectl get service -o wide NOMBRE TIPO CLUSTER-IP EXTERNAL-IP PORT (S) SELECTOR DE EDAD kubernetes ClusterIP 10.96.0.1 <ninguno> 443 / TCP 2d23h <ninguno> kubernetes-bootcamp NodePort 10.96.52.43 <ninguno> 8080: 31393 / TCP 2d run = kubernetes-bootcamp nginx-service NodePort 10.96.10.148 <ninguno> 80: 32600 / TCP 70s app = nginx
Servicio de acceso
rizo <任意节点的 IP>:32600
[root @ guanbin-k8s-master k8s] # curl guanbin-k8s-master: 32600 <! DOCTYPE html> <html> <head> <title> ¡Bienvenido a nginx! </title> <style> body { width: 35em; margen: 0 automático; Familia tipográfica: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1> ¡Bienvenido a nginx! </h1> <p> Si ve esta página, el servidor web nginx se ha instalado y funciona correctamente . Se requiere configuración adicional. </p> <p> Para obtener documentación y asistencia en línea, consulte <a href="http://nginx.org/"> nginx.org </a>. <br/> <p> <em> Gracias por usar nginx. </em> </p> </body> </html>
O visita la página