DNAT
Escenario
Un gateway de traducción de direcciones de red de destino (DNAT) está situado entre los nodos de clúster y las redes públicas y se le asigna una EIP. Después de recibir solicitudes entrantes de redes públicas, el gateway de NAT traduce la EIP (dirección de destino en las solicitudes entrantes) en una dirección interna de clúster. A los usuarios de la carga de trabajo les parece que todos los nodos que ejecutan la carga de trabajo comparten la misma EIP.
DNAT proporciona mayor fiabilidad que el NodePort basado en EIP en el que la EIP está vinculada a un único nodo y una vez que el nodo está inactivo, todas las solicitudes entrantes a la carga de trabajo no se distribuirán. La dirección de acceso tiene el formato de <EIP>:<puerto de acceso>, por ejemplo, 10.117.117.117:80.
Notas y restricciones
Tenga en cuenta las siguientes restricciones cuando utilice el servicio de NAT Gateway:
- Los clústeres que utilizan el modelo de red de VPC no permiten que contenedores acceda a los servicios de DNAT cuyo externalTrafficPolicy está establecido en local.
- Múltiples reglas para un gateway de NAT pueden usar la misma EIP, pero las reglas para diferentes gateway de NAT deben usar diferentes EIP.
- Cada VPC puede tener solo un gateway de NAT.
- Los usuarios no pueden agregar manualmente la ruta predeterminada en una VPC.
- Solo se puede agregar una regla de SNAT a una subred en una VPC.
- Las reglas de SNAT y de DNAT están diseñadas para diferentes funciones. Si las reglas de SNAT y de DNAT usan la misma EIP, se producirá una preferencia de recursos. Una regla de SNAT no puede compartir una EIP con una regla de DNAT con Port Type establecida en All ports.
- Las reglas de DNAT no admiten la vinculación de una EIP a una dirección IP virtual.
- Cuando se configuren los servicios EIP y NAT Gateway para un servidor, los datos serán reenviados a través de la EIP.
- El bloque CIDR personalizado debe ser un subconjunto de los bloques CIDR de subred de VPC.
- El bloque CIDR personalizado debe ser un bloque CIDR de Direct Connect y no puede entrar en conflicto con los bloques CIDR de subred existentes de VPC.
- Cuando realiza operaciones en recursos subyacentes de un ECS, por ejemplo, cambiando sus especificaciones, las reglas de gateway de NAT configuradas se vuelven inválidas. Es necesario eliminar las reglas y volver a configurarlas.
- Después de crear un Service, si la configuración de afinidad se cambia del nivel de clúster al nivel de nodo, la tabla de seguimiento de conexiones no se borrará. Se recomienda no modificar la configuración de afinidad del Service después de que se haya creado el Servicio. Si necesita modificarlo, vuelva a crear un Service.
- Si la subred de nodo está asociada con una tabla de ruta personalizada, debe agregar la ruta de NAT a la tabla de ruta personalizada cuando use el Service de DNAT.
Creación de un gateway de NAT y una dirección IP elástica
Ha creado un gateway de NAT y una dirección IP elástica. El procedimiento específico es el siguiente:
- Inicie sesión en la consola de gestión, elija Networking > NAT Gateway en la lista de servicios y haga clic en Buy NAT Gateway en la esquina superior derecha. Configure los parámetros basados en los requisitos del sitio.
Al comprar un gateway de NAT, asegúrese de que el gateway de NAT pertenece a la misma VPC y subred que el clúster de CCE donde se ejecuta la carga de trabajo.
- Inicie sesión en la consola de gestión, elija Networking > Elastic IP en la lista de servicios y haga clic en Buy EIP en la esquina superior derecha. Configure los parámetros según los requisitos del sitio.
Creación de un servicio de gateway de DNAT
- Inicie sesión en la consola de CCE y acceda a la consola del clúster.
- Elija Networking en el panel de navegación y haga clic en Create Service en la esquina superior derecha.
- Configure los parámetros relacionados.
- Service Name: Especifique un nombre de Service, que puede ser el mismo que el nombre de la carga de trabajo.
- Access Type: Seleccione DNAT.
- Namespace: Espacio de nombres al que pertenece la carga de trabajo.
- Service Affinity: Para más información, véase externalTrafficPolicy (afinidad del Service).
- Cluster level: Las direcciones IP y los puertos de acceso de todos los nodos de un clúster se pueden utilizar para acceder a la carga de trabajo asociada con el Service. El acceso al Service causará una pérdida de rendimiento debido a la redirección de la ruta y no se puede obtener la dirección IP de origen del cliente.
- Node level: Solo la dirección IP y el puerto de acceso del nodo donde se encuentra la carga de trabajo pueden acceder a la carga de trabajo asociada con el Service. El acceso al Service no causará pérdida de rendimiento debido a la redirección de la ruta, y se puede obtener la dirección IP de origen del cliente.
- Selector: Agregue una etiqueta y haga clic en Add. Un Service selecciona un pod basado en la etiqueta agregada. También puede hacer clic en Reference Workload Label para hacer referencia a la etiqueta de una carga de trabajo existente. En el cuadro de diálogo que se muestra, seleccione una carga de trabajo y haga clic en OK.
- IPv6: Esta función está deshabilitada por defecto. Una vez habilitada esta función, la dirección IP del clúster del Service cambia a una dirección IPv6. Para obtener más información, consulte ¿Cómo creo un clúster de doble pila IPv4/IPv6? Este parámetro solo está disponible en clústeres de v1.15 o posterior con IPv6 habilitado (establecido durante la creación del clúster).
- DNAT: Seleccione el gateway de DNAT y EIP creados en Creación de un gateway de NAT y una dirección IP elástica.
- Port
- Protocol: protocolo utilizado por el Service.
- Container Port: puerto en el que escucha la carga de trabajo. La carga de trabajo de Nginx escucha en el puerto 80.
- Service Port: un puerto asignado al puerto contenedor en la dirección IP interna del clúster. Se puede acceder a la carga de trabajo desde <cluster-internal IP address>:<access port>. El rango de número de puerto es de 1–65535.
- Haga clic en OK.
Configuración del tipo de acceso con kubectl
Puede establecer el Service al crear una carga de trabajo con kubectl. Esta sección utiliza una carga de trabajo de Nginx como ejemplo para describir cómo implementar el acceso intracluster usando kubectl.
- Utilice kubectl para conectarse al clúster. Para obtener más información, véase Conexión a un clúster con kubectl.
- Cree y edite los archivos nginx-deployment.yaml y nginx-nat-svc.yaml.
Los nombres de archivo están definidos por el usuario. nginx-deployment.yaml y nginx-nat-svc.yaml son simplemente nombres de archivo de ejemplo.
vi nginx-deployment.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: nginx spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - image: nginx:latest name: nginx imagePullSecrets: - name: default-secret
Para ver las descripciones de los campos anteriores, consulte Tabla 1.
vi nginx-nat-svc.yaml
apiVersion: v1 kind: Service metadata: name: nginx annotations: kubernetes.io/elb.class: dnat kubernetes.io/natgateway.id: e4a1cfcf-29df-4ab8-a4ea-c05dc860f554 spec: loadBalancerIP: 10.78.42.242 ports: - name: service0 port: 80 protocol: TCP targetPort: 80 selector: app: nginx type: LoadBalancer
Tabla 1 Parámetros de clave Parámetro
Obligatorio
Tipo
Descripción
kubernetes.io/elb.class
Sí
String
Este parámetro se establece en dnat por lo que CCE puede trabajar con un gateway de NAT y se pueden agregar reglas de DNAT.
kubernetes.io/natgateway.id
Sí
String
ID de un gateway de NAT.
loadBalancerIP
Sí
String
ID de EIP.
port
Sí
Integer
Puerto de acceso establecido en la consola. El valor varía de 1 a 65535.
targetPort
Sí
String
El puerto del contenedor está configurado en la consola. El valor varía de 1 a 65535.
type
Sí
String
El tipo de servicio de gateway de NAT debe establecerse en LoadBalancer.
- Cree una carga de trabajo.
kubectl create -f nginx-deployment.yaml
Si se muestra la información similar a la siguiente, se está creando la carga de trabajo.
deployment "nginx" created
kubectl get po
Si se muestra la información similar a la siguiente, la carga de trabajo se está ejecutando.
NAME READY STATUS RESTARTS AGE nginx-2601814895-sf71t 1/1 Running 0 8s
- Cree un Service.
kubectl create -f nginx-nat-svc.yaml
Si se muestra la información similar a la siguiente, se ha creado el Service.
service "nginx-eip" created
kubectl get svc
Si se muestra la siguiente información, el Service se ha establecido correctamente y se puede acceder a la carga de trabajo.
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.247.0.1 <none> 443/TCP 3d nginx-nat LoadBalancer 10.247.226.2 10.154.74.98 80:30589/TCP 5s
- En la barra de direcciones de su navegador, introduzca 10.154.74.98:80 y pulse Enter.
En este ejemplo, 10.154.74.98 es la dirección IP elástica y 80 es el número de puerto obtenido en el paso anterior.