Servicio
Tabla de contenido
3 Relación entre Servicio y Pod
1 ¿Qué es el servicio?
1.1 Definición
Dirección del sitio web oficial: Servicio | Kubernetes
Un método para exponer una aplicación de red que se ejecuta en un Pod o un grupo de Pods como un servicio de red.
Definición popular: el servicio es una forma de proporcionar servicios de red para pods.
1.2 Por qué se necesita el servicio
Pregunta: Si un conjunto de Pods (llamado "backend") proporciona funcionalidad a otros Pods dentro del clúster (llamado "frontend"), ¿cómo averigua el frontend y realiza un seguimiento de la dirección IP a la que conectarse para que el frontend ¿Puedo usarlo para atender la carga de trabajo de la parte backend?
Si se trata de un backend de procesamiento de imágenes, ejecuta 3 copias. Estas copias son intercambiables: los frontends no necesitan preocuparse a qué copia de backend llaman. Sin embargo, los Pods que componen este grupo de programas backend pueden cambiar. El cliente front-end no debe ni necesita saberlo, y no es necesario realizar un seguimiento del estado de este grupo de backends. La abstracción definida por Servicio puede desacoplar esta conexión .
2 características
-
El servicio asocia el Pod correspondiente mediante etiqueta
-
El ciclo de vida del Servicio no está vinculado al Pod y la IP no cambiará debido a la recreación del Pod.
-
Proporciona función de equilibrio de carga para reenviar automáticamente el tráfico a diferentes Pods
-
Proporciona puertos de acceso fuera del clúster.
-
Se puede acceder al clúster a través del nombre del servicio.
3 Relación entre Servicio y Pod
4 Utilice el servicio
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
labels:
app: nginx
spec:
replicas: 1
template:
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.19
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
restartPolicy: Always
selector:
matchLabels:
app: nginx
---
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
selector:
app: nginx
ports:
- port: 8080 #service 端口
targetPort: 80 #容器端口
nodePort: 31001 #node 节点端口 固定在 30000-32767 之间
type: NodePort
注意:节点端口固定在 30000-32767 之间
5 multipuerto
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
labels:
app: nginx
spec:
replicas: 1
template:
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.19
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
restartPolicy: Always
selector:
matchLabels:
app: nginx
---
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
selector:
app: nginx
ports:
- port: 8080 #service 端口
name: write
targetPort: 80 #容器端口
nodePort: 31001 #node 节点端口 固定在 30000-32767 之间
- port: 8081
name: read
targetPort: 80
nodePort: 31002
type: NodePort
6 tipostipo
Para determinadas partes de algunas aplicaciones (como el front-end), es posible que desee exponerlas a direcciones IP fuera del clúster de Kubernetes.
Kubernetes ServiceTypes
le permite especificar el tipo de Servicio que necesita.
-
ClusterIP
: El servicio está expuesto dentro del clúster y solo otros objetos dentro del clúster pueden acceder a él. Generalmente se usa para el descubrimiento de servicios internos y no se expondrá fuera del clúster. -
NodePort
: Exponer el Servicio en un determinado puerto del Nodo, para que se pueda acceder al Servicio a través de la dirección IP y el número de puerto del Nodo, generalmente se usa en entornos de desarrollo y prueba. -
LoadBalancer
: Exponer el Servicio a la red pública a través del balanceador de carga proporcionado por el proveedor de servicios en la nube, para que los usuarios externos puedan acceder al Servicio. -
ExternalName
: Asigne el Servicio a un nombre DNS, de modo que se pueda acceder al Servicio a través del nombre DNS, que generalmente se usa para acceder a servicios externos.
6.1 Tipo de IP del clúster
-
这是最常用的 Service 类型之一
. Cree una dirección IP virtual dentro del clúster, a la que puedan acceder otros Pods en el mismo clúster, pero no mediante solicitudes fuera del clúster. Este tipo de servicio se suele utilizar para exponer servicios internos, como servicios de base de datos o caché. Por ejemplo, en una aplicación web, es posible que necesite conectarse a una base de datos, pero no es necesario que la base de datos esté expuesta fuera de la aplicación. En este momento, puede utilizar el servicio de tipo ClusterIP para permitir que la aplicación acceda a la base de datos.
6.2 Tipo de puerto de nodo
-
Este tipo de Servicio creará un puerto y lo vinculará a cada nodo del clúster, permitiendo que el tráfico externo acceda al Servicio. Este tipo se utiliza normalmente para exponer servicios públicos, como aplicaciones web o API. Por ejemplo, si necesita acceder a una aplicación web que se ejecuta en el clúster desde fuera del clúster, puede crear un Servicio de tipo NodePort y exponer el Servicio al exterior
nodePort
del clúster especificando el campo Servicio. -
Si
type
configura el campo enNodePort
, el plano de control de Kubernetes--service-node-port-range
asignará puertos en el rango especificado por la bandera (predeterminado: 30000-32767).
6.3 Tipo de equilibrador de carga
-
Este tipo de Servicio es similar a NodePort, pero crea un equilibrador de carga en el proveedor de la nube. Este tipo se suele utilizar para implementar aplicaciones en plataformas en la nube. El equilibrador de carga de la plataforma en la nube distribuye el tráfico a los nodos del clúster. Este tipo de Servicio solo se puede utilizar en plataformas en la nube y requiere soporte de los proveedores de la nube.
6.4 Tipo de nombre externo
-
Este tipo de Servicio permite el reenvío del Servicio a cualquier entrada DNS CNAME a la que deba accederse. A diferencia de otros tipos de Servicios, no envía solicitudes a ningún Pod. En cambio, reenvía la solicitud a la dirección externa configurada. Este tipo de servicio se utiliza normalmente para enviar servicios a otros servicios fuera del clúster. Por ejemplo, si tiene un servicio ejecutándose en la red externa y desea utilizar el servicio en el clúster de Kubernetes, puede crear un Servicio de tipo NombreExterno para resolver el DNS del servicio en el clúster de Kubernetes.
7 Comunicación interna
7.1 Crear grupo
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
labels:
app: mysql
spec:
selector:
matchLabels:
app: mysql
replicas: 1
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql/mysql-server:8.0
env:
- name: MYSQL_ROOT_PASSWORD
value: root
ports:
- name: mysql
containerPort: 3306
---
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
selector:
app: mysql
ports:
- name: mysql
port: 3306
targetPort: 3306
type: ClusterIP
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
labels:
app: nginx
spec:
selector:
matchLabels:
app: nginx
replicas: 1
template:
metadata:
labels:
app: nginx
spec:
hostNetwork: true
containers:
- name: nginx
image: nginx:latest
#command: ["/bin/sh", "-c"]
#args:
#- apt-get update && apt-get install -y mysql-client && nginx -g 'daemon off;'
ports:
- name: http
containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
selector:
app: nginx
ports:
- name: http
port: 8081
targetPort: 80
type: ClusterIP
7.2 Acceso mutuo
# Ingrese nginx para acceder a mysql $ mysql -h mysql -uroot -ppassword # Nota: mysql aquí es el nombre del servicio MySQL, no el nombre del Pod.