En aplicaciones de videojuegos y peer-to-peer (P2P), los clientes suelen necesitar acceso directo a los pods. En lugar de asignar una dirección IP elástica (EIP) a cada pod, lo cual está limitado por las cuotas de EIP y complica la gestión de seguridad, asigne endpoints públicos a los pods mediante reglas DNAT de NAT gateway.
Requisitos previos
Antes de empezar, asegúrese de contar con lo siguiente:
Un ACK managed cluster o ACK dedicated cluster que utilice Terway como plugin de red.
Un Internet NAT gateway creado en la VPC del clúster y gestionado por el controlador natgw.
Conocimiento sobre cómo las reglas DNAT asignan cuatro valores: IP pública (una EIP en el NAT gateway), puerto público (asignado automáticamente desde portRangeStart–portRangeEnd y registrado en el CR PodDNAT), puerto privado (el puerto de escucha del pod definido en las anotaciones) e IP privada (la IP del pod). Las reglas DNAT rules asignan una dirección IP y un puerto públicos a una dirección IP y un puerto privados.
Limitaciones
Compatible únicamente con nodos ECS estándar; no admite instancias ECI.
Las entradas DNAT están sujetas a la cuota del NAT gateway. Consulte DNAT feature FAQ.
Funcionamiento
El componente ack-extend-network-controller ejecuta un subcontrolador denominado natgw controller. Cuando se añade una anotación a un pod para habilitar DNAT, el natgw controller realiza las siguientes acciones:
Selecciona una EIP del pool de EIP del NAT gateway.
Asigna un puerto público del rango configurado (
portRangeStart–portRangeEnd).Crea una entrada de reenvío DNAT que asigna la IP y el puerto públicos a la IP y el puerto privados del pod.
Registra la asignación en un Custom Resource (CR)
PodDNATcon el mismo nombre del pod.
Cada regla DNAT asigna cuatro valores: dirección IP pública, puerto público, dirección IP privada y puerto privado.
El natgw controller asigna automáticamente los puertos públicos dentro del rango configurado. Dimensione este rango según la cantidad máxima de pods que necesite exponer de forma simultánea.
Anotaciones de pod
Aplique las siguientes anotaciones en la plantilla del pod para controlar el comportamiento de DNAT.
|
Annotation |
Description |
|
|
Habilita DNAT para el pod. Establezca el valor en |
|
|
Puerto de escucha del pod. Separe varios puertos con comas. Por ejemplo: |
|
|
Protocolo de red. Valores válidos: |
|
|
Habilita la persistencia de configuración para contenedores con estado. |
Agregue una regla de entrada al security group del pod para permitir tráfico en el puerto expuesto. Sin esta regla, el security group descartará el tráfico DNAT.
Habilitación de DNAT en ack-extend-network-controller
El ack-extend-network-controller invoca las OpenAPI de Alibaba Cloud para crear recursos. Otorgue los permisos de RAM necesarios, instale ack-extend-network-controller desde el Marketplace y utilice anotaciones de pod para crear y asociar entradas DNAT.
Paso 1: Configuración de permisos de RAM
El natgw controller llama a las API de Alibaba Cloud para gestionar entradas de reenvío NAT. Otorgue los permisos correspondientes según el tipo de clúster.
ACK managed or dedicated cluster
El natgw controller utiliza el Worker RAM Role del clúster. Agregue una directiva personalizada con los siguientes permisos al Worker RAM Role.
Inicie sesión en la Container Service Management Console. En el panel de navegación izquierdo, haga clic en Clusters.
En la página Clusters, haga clic en el nombre de su clúster. En el panel de navegación izquierdo, haga clic en Cluster Information.
En la pestaña Basic Information, haga clic en el vínculo junto a Worker RAM Role.
-
Cree una directiva personalizada con el siguiente contenido. Consulte Step 1: Create a custom policy.
{ "Effect": "Allow", "Action": [ "ecs:DescribeNetworkInterfaces", "vpc:DescribeNatGateways", "vpc:DescribeForwardTableEntries", "vpc:CreateForwardEntry", "vpc:DescribeEipAddresses", "vpc:DeleteForwardEntry", "vpc:DescribeRouteTableList", "vpc:DescribeRouteEntryList" ], "Resource": ["*"], "Condition": {} } Asocie la directiva al Worker RAM Role. Consulte Step 2: Grant permissions to the Worker RAM Role.
ACK serverless cluster
Cree un par de AccessKey para un usuario de RAM con los permisos equivalentes. Consulte Create a RAM user y Create a custom policy.
Paso 2: Instalación y configuración del natgw controller
Instale ack-extend-network-controller desde Marketplace y habilite el natgw controller.
Configure el natgw controller con los siguientes parámetros:
clusterID: "c11ba338192xxxxxxx" # Your cluster ID
regionID: "cn-hangzhou" # Your region ID
vpcID: "vpc-bp1rkq0zxxxxxx" # Your VPC ID
enableControllers:
- natgw # Enable the natgw controller
networkController:
natGwPool:
- natgwId: "<nat-gateway-id>" # Internet NAT gateway ID
zoneId: "<zone-id>" # Zone of the NAT gateway, e.g., cn-hangzhou-j
portRangeStart: 512 # Start of the public port range
portRangeEnd: 1024 # End of the public port range
eips:
- "<eip-address>" # EIP on the NAT gateway. If omitted, all EIPs on the gateway are used.
credential: # For ACK clusters using the Worker RAM Role, omit this section.
accessKey: ""
accessSecret: ""
Exposición de un pod con DNAT
Una vez que el natgw controller esté en ejecución, añada una anotación al pod para crear automáticamente una entrada DNAT.
-
Aplique un Deployment con anotaciones DNAT. Este ejemplo expone el puerto 80 de un pod nginx.
apiVersion: apps/v1 kind: Deployment metadata: name: example labels: app: example spec: replicas: 1 selector: matchLabels: app: example template: metadata: labels: app: example annotations: k8s.aliyun.com/pod-dnat: "" k8s.aliyun.com/pod-dnat-expose-port: "80" spec: containers: - name: example image: nginx -
Después de que el pod se inicie, el natgw controller crea un CR
PodDNATcon el nombre del pod. Consulte la asignación:Field
Description
spec.externalIPDirección IP pública del NAT gateway. Utilice esta dirección para acceder al pod desde internet.
spec.externalPortPuerto público asignado del rango
portRangeStart–portRangeEnd. En este ejemplo:512.spec.internalIPDirección IP privada del pod.
spec.portMapping[].internalPortPuerto de escucha del pod. En este ejemplo:
80.status.entries[].forwardEntryIdID de la entrada de reenvío DNAT.
kubectl get poddnats -oyamlSalida esperada:
apiVersion: alibabacloud.com/v1 kind: PodDNAT metadata: creationTimestamp: "20**-09-20T03:26:44Z" finalizers: - natgw-controller generation: 2 name: example-6cd498d7b-9**** namespace: default ownerReferences: - apiVersion: v1 blockOwnerDeletion: true kind: Pod name: example-6cd498d7b-9**** uid: 7af54e1c-eeb7-4fd0-b070-ff99ddbd**** resourceVersion: "357150" uid: 2fad9bb7-cc84-46b4-b6eb-5d15f06c**** spec: eni: eni-xxx externalIP: 114.55.**.** internalIP: 172.16.**.** portMapping: - externalPort: "512" internalPort: "80" protocol: tcp tableId: ngw-xxx vswitch: vsw-xxx zoneID: cn-hangzhou-k status: entries: - externalIP: 114.55.**.** externalPort: "512" forwardEntryId: fwd-xxx internalIP: 172.16.**.** internalPort: "80" ipProtocol: tcpEl pod es accesible desde internet en
114.55.**.**:512.
Siguientes pasos
Para exponer varios puertos, establezca
k8s.aliyun.com/pod-dnat-expose-portcomo una lista separada por comas; por ejemplo,"80,443".Para usar UDP en lugar de TCP, configure
k8s.aliyun.com/pod-dnat-expose-protocolcon el valorudp.Para conservar el mismo puerto público tras reiniciar el pod, agregue la anotación
k8s.aliyun.com/pod-dnat-fixed.