Compartir por


Uso de direcciones IP públicas de nivel de instancia en Azure Kubernetes Service (AKS)

Los nodos de AKS no necesitan sus propias direcciones IP públicas para la comunicación. Sin embargo, los escenarios pueden requerir que los nodos de un grupo de nodos reciban sus propias direcciones IP públicas dedicadas. Un escenario común es para las cargas de trabajo de juegos, en las que se necesita una consola para tener una conexión directa a una máquina virtual en la nube para minimizar los saltos. Este escenario se puede conseguir en AKS mediante el uso de la dirección IP pública del nodo.

En primer lugar, cree un nuevo grupo de recursos.

az group create --name myResourceGroup2 --location eastus

Cree un clúster de AKS y conecte una dirección IP pública para los nodos. Cada uno de los nodos del grupo de nodos recibe una dirección IP pública única. Puede comprobarlo si examina las instancias del conjunto de escalado de máquinas virtuales.

az aks create \
    --resource-group MyResourceGroup2 \
    --name MyManagedCluster \
    --location eastus \
    --enable-node-public-ip \
    --generate-ssh-keys

En el caso de los clústeres de AKS que ya existan, también puede agregar un nuevo grupo de nodos y asociar una dirección IP pública para los nodos.

az aks nodepool add --resource-group MyResourceGroup2 --cluster-name MyManagedCluster --name nodepool2 --enable-node-public-ip

Uso de un prefijo de dirección IP pública

Existen varias ventajas al usar un prefijo de dirección IP pública. AKS admite el uso de direcciones de un prefijo de dirección IP pública existente para los nodos pasando el identificador de recurso con la marca node-public-ip-prefix al crear un nuevo clúster o agregar un grupo de nodos.

En primer lugar, cree un prefijo de dirección IP pública mediante az network public-ip prefix create:

az network public-ip prefix create --length 28 --location eastus --name MyPublicIPPrefix --resource-group MyResourceGroup3

Vea la salida y tome nota de id para el prefijo:

{
  ...
  "id": "/subscriptions/<subscription-id>/resourceGroups/myResourceGroup3/providers/Microsoft.Network/publicIPPrefixes/MyPublicIPPrefix",
  ...
}

Por último, al crear un nuevo clúster o al agregar un nuevo grupo de nodos, use la marca node-public-ip-prefix y pase el identificador de recurso del prefijo:

az aks create \
    --resource-group MyResourceGroup3 \
    --name MyManagedCluster \
    --location eastus \
    --enable-node-public-ip \
    --node-public-ip-prefix /subscriptions/<subscription-id>/resourcegroups/MyResourceGroup3/providers/Microsoft.Network/publicIPPrefixes/MyPublicIPPrefix \
    --generate-ssh-keys

Búsqueda de direcciones IP públicas para nodos

Puede buscar las direcciones IP públicas de los nodos de varias maneras:

Importante

El grupo de recursos de nodo contiene los nodos y sus direcciones IP públicas. Use el grupo de recursos de nodo al ejecutar comandos para buscar las direcciones IP públicas de los nodos.

az vmss list-instance-public-ips --resource-group MC_MyResourceGroup2_MyManagedCluster_eastus --name YourVirtualMachineScaleSetName

Utilizar etiquetas IP públicas en las IP públicas de los nodos

Las etiquetas IP públicas se pueden usar en las direcciones IP públicas del nodo para usar la característica Preferencia de enrutamiento de Azure.

Requisitos

  • Se requiere AKS, versión 1.24 o posterior.

Creación de un clúster con preferencia de enrutamiento de Internet

az aks create \
    --name <clusterName> \
    --location <location> \
    --resource-group <resourceGroup> \
    --enable-node-public-ip \
    --node-public-ip-tags RoutingPreference=Internet \
    --generate-ssh-keys

Adición de un grupo de nodos con preferencia de enrutamiento de Internet

az aks nodepool add --cluster-name <clusterName> --name <nodepoolName> --location <location> --resource-group <resourceGroup> \
  --enable-node-public-ip \
  --node-public-ip-tags RoutingPreference=Internet

Permiso para conexiones de puerto de host y adición de grupos de nodos a grupos de seguridad de aplicaciones

Los nodos de AKS que usan direcciones IP públicas de nodo que hospedan servicios en su dirección de host deben tener agregada una regla de NSG para permitir el tráfico. Al agregar los puertos deseados en la configuración del grupo de nodos, se crearán las reglas de permiso adecuadas en el grupo de seguridad de red del clúster.

Si un grupo de seguridad de red está implementado en la subred con un clúster mediante una red virtual de tipo "traiga la suya propia", se debe agregar una regla de permiso a ese grupo de seguridad de red. Esto se puede limitar a los nodos de un grupo de nodos determinado agregando el grupo de nodos a un grupo de seguridad de aplicaciones (ASG). Se creará un ASG administrado de forma predeterminada en el grupo de recursos administrado si se especifican los puertos host permitidos. Los nodos también se pueden agregar a uno o varios ASG personalizados especificando el identificador de recurso del ASG en los parámetros del grupo de nodos.

Formato de especificación del puerto de host

Al especificar la lista de puertos que se van a permitir, use una lista separada por comas con entradas en el formato de port/protocol o startPort-endPort/protocol.

Ejemplos:

  • 80/tcp
  • 80/tcp,443/tcp
  • 53/udp,80/tcp
  • 50000-60000/tcp

Requisitos

  • Se requiere AKS, versión 1.24 o posterior.

Creación de un clúster con puertos permitidos y grupos de seguridad de aplicaciones

az aks create \
    --resource-group <resourceGroup> \
    --name <clusterName> \
    --nodepool-name <nodepoolName> \
    --nodepool-allowed-host-ports 80/tcp,443/tcp,53/udp,40000-60000/tcp,40000-50000/udp\
    --nodepool-asg-ids "<asgId>,<asgId>" \
    --generate-ssh-keys

Adición de un nuevo grupo de nodos con puertos permitidos y grupos de seguridad de aplicaciones

  --resource-group <resourceGroup> \
  --cluster-name <clusterName> \
  --name <nodepoolName> \
  --allowed-host-ports 80/tcp,443/tcp,53/udp,40000-60000/tcp,40000-50000/udp \
  --asg-ids "<asgId>,<asgId>"

Actualización de los puertos permitidos y los grupos de seguridad de aplicaciones para un grupo de nodos

  --resource-group <resourceGroup> \
  --cluster-name <clusterName> \
  --name <nodepoolName> \
  --allowed-host-ports 80/tcp,443/tcp,53/udp,40000-60000/tcp,40000-50000/udp \
  --asg-ids "<asgId>,<asgId>"

Asignación automática de puertos de host para cargas de trabajo de pod (VERSIÓN PRELIMINAR)

Cuando las direcciones IP públicas están configuradas en nodos, se pueden usar los puertos de host para permitir que los pods reciban directamente el tráfico sin tener que configurar un servicio de equilibrador de carga. Esto resulta especialmente útil en escenarios como en los juegos, donde la naturaleza efímera de la dirección IP del nodo y el puerto no es un problema porque un servicio emparejador en un nombre de host conocido puede proporcionar el host y el puerto correctos que se usarán en el momento de la conexión. Sin embargo, dado que solo un proceso de un host puede estar escuchando en el mismo puerto, el uso de aplicaciones con puertos host puede provocar problemas con la programación. Para evitar este problema, AKS proporciona la capacidad de que el sistema asigne dinámicamente un puerto disponible en el momento de la programación, lo que evita conflictos.

Advertencia

El tráfico del puerto de host del pod se bloqueará mediante las reglas de NSG predeterminadas implementadas en el clúster. Esta característica debe combinarse con la autorización para los puertos de host del grupo de nodos para permitir que el tráfico fluya.

Importante

Las características en versión preliminar de AKS están disponibles como opción de participación y autoservicio. Las versiones preliminares se proporcionan "tal cual" y "como están disponibles", y están excluidas de los Acuerdos de nivel de servicio y garantía limitada. Las versiones preliminares de AKS reciben cobertura parcial del soporte al cliente en la medida de lo posible. Por lo tanto, estas características no están diseñadas para su uso en producción. Para más información, consulte los siguientes artículos de soporte:

Requisitos

  • Se requiere AKS, versión 1.24 o posterior.

Registro de la marca de características "PodHostPortAutoAssignPreview"

Registre la marca de la característica PodHostPortAutoAssignPreview con el comando PodHostPortAutoAssignPreview, como se muestra en el siguiente ejemplo:

az feature register --namespace "Microsoft.ContainerService" --name "PodHostPortAutoAssignPreview"

Tarda unos minutos en que el estado muestre Registrado. Para comprobar el estado de registro se usa el comandoaz feature show:

az feature show --namespace "Microsoft.ContainerService" --name "PodHostPortAutoAssignPreview"

Cuando aparezca el estado Registrado, actualice el registro del proveedor de recursos Microsoft.ContainerService mediante el comando az provider register:

az provider register --namespace Microsoft.ContainerService

Asignación automática de un puerto de host a un pod

El desencadenamiento de la asignación automática de puertos de host se realiza mediante la implementación de una carga de trabajo sin ningún puerto de host y la aplicación de la anotación kubernetes.azure.com/assign-hostports-for-containerports con la lista de puertos que necesitan asignaciones de puertos de host. El valor de la anotación debe especificarse como una lista separada por comas de entradas como port/protocol, donde el puerto es un número de puerto individual definido en la especificación de pod y el protocolo es tcp o udp.

Los puertos se asignarán desde el intervalo 40000-59999 y serán únicos en todo el clúster. Los puertos asignados también se agregarán a las variables de entorno dentro del pod para que la aplicación pueda determinar qué puertos se asignaron. El nombre de la variable de entorno tendrá el siguiente formato (ejemplo a continuación): <deployment name>_PORT_<port number>_<protocol>_HOSTPORT. Así, un ejemplo sería mydeployment_PORT_8080_TCP_HOSTPORT: 41932.

Esta es una implementación echoserver de ejemplo que muestra la asignación de puertos de host para los puertos 8080 y 8443:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: echoserver-hostport
  labels:
    app: echoserver-hostport
spec:
  replicas: 3
  selector:
    matchLabels:
      app: echoserver-hostport
  template:
    metadata:
      annotations:
        kubernetes.azure.com/assign-hostports-for-containerports: 8080/tcp,8443/tcp
      labels:
        app: echoserver-hostport
    spec:
      nodeSelector:
        kubernetes.io/os: linux
      containers:
        - name: echoserver-hostport
          image: k8s.gcr.io/echoserver:1.10
          ports:
            - name: http
              containerPort: 8080
              protocol: TCP
            - name: https
              containerPort: 8443
              protocol: TCP

Cuando se aplica la implementación, las entradas hostPort estarán en el archivo YAML de los pods individuales:

$ kubectl describe pod echoserver-hostport-75dc8d8855-4gjfc
<cut for brevity>
Containers:
  echoserver-hostport:
    Container ID:   containerd://d0b75198afe0612091f412ee7cf7473f26c80660143a96b459b3e699ebaee54c
    Image:          k8s.gcr.io/echoserver:1.10
    Image ID:       k8s.gcr.io/echoserver@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229                                                                                                      Ports:          8080/TCP, 8443/TCP
    Host Ports:     46645/TCP, 49482/TCP
    State:          Running
      Started:      Thu, 12 Jan 2023 18:02:50 +0000
    Ready:          True
    Restart Count:  0
    Environment:
      echoserver-hostport_PORT_8443_TCP_HOSTPORT:  49482
      echoserver-hostport_PORT_8080_TCP_HOSTPORT:  46645

Pasos siguientes