Använda offentliga IP-adresser på instansnivå i Azure Kubernetes Service (AKS)

AKS-noder kräver inte egna offentliga IP-adresser för kommunikation. Scenarier kan dock kräva att noder i en nodpool tar emot sina egna dedikerade offentliga IP-adresser. Ett vanligt scenario är för spelarbetsbelastningar, där en konsol måste upprätta en direktanslutning till en virtuell molndator för att minimera hopp. Det här scenariot kan uppnås på AKS med hjälp av nodens offentliga IP.

Skapa först en ny resursgrupp.

az group create --name <resourceGroup> --location <region>

Skapa ett nytt AKS-kluster och koppla en offentlig IP-adress för dina noder. Var och en av noderna i nodpoolen får en unik offentlig IP-adress. Du kan kontrollera detta genom att titta på instanserna i skalningsuppsättningar för virtuella maskiner.

az aks create \
    --resource-group <resourceGroup> \
    --name <aksClusterName> \
    --location <region> \
    --enable-node-public-ip \
    --generate-ssh-keys

För befintliga AKS-kluster kan du också lägga till en ny nodpool och koppla en offentlig IP-adress för dina noder.

az aks nodepool add --resource-group <resourceGroup> --cluster-name <aksClusterName> --name <newNodePool> --enable-node-public-ip

Använda ett offentligt IP-prefix

Det finns ett antal fördelar med att använda ett offentligt IP-prefix. AKS stöder användning av adresser från ett befintligt offentligt IP-prefix för dina noder genom att skicka resurs-ID:t med flaggan --node-public-ip-prefix-id när du skapar ett nytt kluster eller lägger till en nodpool.

Skapa först ett offentligt IP-prefix med az network public-ip prefix create:

az network public-ip prefix create --length 28 --location <region> --name <publicIPPrefixName> --resource-group <resourceGroup>

Visa utdata och anteckna id för prefixet:

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

När du skapar ett nytt kluster eller lägger till en ny nodpool använder du slutligen flaggan --node-public-ip-prefix-id och skickar in prefixets resurs-ID:

az aks create \
    --resource-group <resourceGroup> \
    --name <aksClusterName> \
    --location <region> \
    --enable-node-public-ip \
    --node-public-ip-prefix-id /subscriptions/<subscription-id>/resourceGroups/<resourceGroup>/providers/Microsoft.Network/publicIPPrefixes/<publicIPPrefixName> \
    --generate-ssh-keys

Använda ett offentligt IP-prefix med dubbla staplar (förhandsversion)

Du kan tilldela både offentliga IP-adresser för IPv4 och IPv6 till varje nod i en nodpool med hjälp av ett offentligt IP-prefix med dubbla staplar. Med den här metoden kan du ta med dina egna offentliga IP-prefix och se till att varje nod får en IPv4-adress och en IPv6-adress.

Den här funktionen är användbar för arbetsbelastningar som kräver direkt inkommande eller utgående anslutning över både IPv4 och IPv6 eller program som körs i miljöer som kräver IPv6-efterlevnad.

Viktigt!

AKS-förhandsfunktioner är tillgängliga via självbetjäning och frivillig anmälan. Förhandsversioner tillhandahålls "som är" och "som tillgängliga", och de undantas från serviceavtalen och den begränsade garantin. AKS-förhandsversioner omfattas delvis av kundsupport efter bästa förmåga. Därför är dessa funktioner inte avsedda för produktionsanvändning. Mer information finns i följande supportartiklar:

Krav

Om du vill använda offentliga IP-prefix med dubbla staplar med offentliga IP-adresser för noder kontrollerar du att följande krav uppfylls:

  • Klustret är konfigurerat som ett kluster med dubbla staplar med ip-familjer för både IPv4 och IPv6.
  • Klustret använder Azure CNI med överläggsnätverk.
  • Du har ett offentligt IP-prefix för IPv4 och ett offentligt IP-prefix för IPv6 som skapats i samma region som ditt AKS-kluster.
  • Båda offentliga IP-prefixen använder standard-SKU:n.
  • AKS-klusteridentiteten har behörighet att hantera de offentliga IP-prefixen. Om prefixen finns i en annan resursgrupp tilldelar du rollen Nätverksdeltagare för den resursgruppen till klusteridentiteten.

Registrera förhandsgranskningsfunktionerna

Stöd för offentliga IP-prefix med dubbla staplar (IPv4 och IPv6) för offentliga IP-adresser för noder är för närvarande tillgängligt i förhandsversionen. Innan du kan använda den här funktionen måste du installera eller uppdatera Azure CLI-tillägget och registrera funktionsflaggor NodePublicIPv6PrefixPreview i din prenumeration.

Installera eller uppdatera aks-preview-tillägget:

az extension add --name aks-preview --upgrade

Registrera de förhandsversionsfunktioner som krävs:

az feature register --namespace Microsoft.ContainerService --name NodePublicIPv6PrefixPreview

Det kan ta flera minuter innan funktionsregistreringarna slutförs. Kontrollera registreringsstatusen genom att köra:

az feature show --namespace Microsoft.ContainerService --name NodePublicIPv6PrefixPreview --query "properties.state"

Vänta tills båda funktionerna rapporterar tillståndet Registrerad innan du fortsätter.

När funktionsflaggor har registrerats uppdaterar du resursprovidern för att säkerställa att ändringarna tillämpas:

az provider register --namespace Microsoft.ContainerService

När registreringen är klar kan du skapa eller uppdatera ett kluster för att använda offentliga IP-prefix med dubbla staplar för offentliga IP-adresser för noder.

Skapa offentliga IP-prefix

Skapa ett offentligt IP-prefix för IPv4 och IPv6 med hjälp av Azure CLI.

För IPv4:

az network public-ip prefix create \
  --resource-group <resourceGroup> \
  --name <ipv4PrefixName> \
  --location <region> \
  --length 28 \
  --sku Standard \
  --version IPv4

För IPv6:

az network public-ip prefix create \
  --resource-group <resourceGroup> \
  --name <ipv6PrefixName> \
  --location <region> \
  --length 124 \
  --sku Standard \
  --version IPv6

När du har skapat prefixen bör du notera resurs-ID:t för båda prefixen.

Skapa ett nytt kluster med offentliga IP-prefix med dubbla stacknoder

När du skapar ett nytt AKS-kluster använder du parametern --node-public-ip-prefix-ids för att ange både de offentliga IP-prefixen IPv4 och IPv6.

az aks create \
  --resource-group <resourceGroup> \
  --name <aksClusterName> \
  --location <region> \
  --enable-node-public-ip \
  --ip-families IPv4,IPv6 \
  --network-plugin azure \
  --network-plugin-mode overlay \
  --node-public-ip-prefix-ids "<ipv4PrefixResourceId>,<ipv6PrefixResourceId>" \
  --generate-ssh-keys

Parametern --node-public-ip-prefix-ids accepterar en kommaavgränsad lista över offentliga IP-prefixresurs-ID:er. Listan måste innehålla ett IPv4-prefix och ett IPv6-prefix.

Lägg till en nodpool med offentliga IP-prefix för noder med dubbel stack

Du kan också lägga till en nodpool med offentliga IP-prefix för noder med dubbla stackar i ett befintligt kluster med dubbla stackar.

az aks nodepool add \
  --resource-group <resourceGroup> \
  --cluster-name <aksClusterName> \
  --name <nodePoolName> \
  --enable-node-public-ip \
  --node-public-ip-prefix-ids "<ipv4PrefixResourceId>,<ipv6PrefixResourceId>"

Limitations

Följande begränsningar gäller för offentliga IP-prefix med dubbla staplar:

  • Du måste ange både ett IPv4- och IPv6-prefix. Konfigurationer med endast IPv6 stöds inte.
  • Nodens offentliga IP-konfiguration är oföränderlig. Om du vill ändra de offentliga IP-prefixen måste du skapa en ny nodpool och migrera arbetsbelastningar.
  • Varje nod tilldelas en enda offentlig IP-adress för IPv6.
  • Den här funktionen stöds inte för AKS Automatic eller automatisk nodetablering.
  • Nodpooler med flera nätverkskort stöds inte.
  • Autoskalning av kluster stöds, men se till att det konfigurerade maximala antalet noder inte överskrider antalet tillgängliga IP-adresser i det offentliga IP-prefixet, eftersom varje nod kräver en IP-adress från prefixet.

Leta upp offentliga IP-adresser för noder

Du kan hitta offentliga IP-adresser för dina noder på olika sätt:

Viktigt!

Nodresursgruppen innehåller noderna och deras offentliga IP-adresser. Använd nodresursgruppen när du kör kommandon för att hitta offentliga IP-adresser för dina noder.

az vmss list-instance-public-ips --resource-group <MC_region_aksClusterName_region> --name <virtualMachineScaleSetName>

Använda offentliga IP-taggar på offentliga IP-adresser för noder

Offentliga IP-taggar kan användas på offentliga IP-adresser för noder för att använda funktionen Azure Routing Preference , som är tillgänglig i angivna regioner.

Krav

  • AKS version 1.29 eller senare krävs.

Skapa ett nytt kluster med routningsinställningen Internet

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

Lägg till en nodpool med internet som routningspreferens

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

Tillåt värdportanslutningar och lägg till nodpooler i programsäkerhetsgrupper

AKS-noder som använder offentliga IP-adresser för noder som är värdar för tjänster på värdadressen måste ha en NSG-regel tillagd för att tillåta trafiken. Om du lägger till önskade portar i nodpoolkonfigurationen skapas lämpliga tillåtna regler i klusternätverkssäkerhetsgruppen.

Om en nätverkssäkerhetsgrupp finns i undernätet och ett kluster använder ett eget virtuellt nätverk, måste en tillåtande regel läggas till i den nätverkssäkerhetsgruppen. Detta kan begränsas till noderna i en viss nodpool genom att lägga till nodpoolen i en programsäkerhetsgrupp (ASG). En hanterad ASG skapas som standard i den hanterade resursgruppen om tillåtna värdportar anges. Noder kan också läggas till i en eller flera anpassade ASG:er genom att ange resurs-ID för NSG:erna i nodpoolsparametrarna.

Specifikationsformat för värdport

När du anger listan med portar som ska tillåtas använder du en kommaavgränsad lista med poster i formatet port/protocol eller startPort-endPort/protocol.

Exempel:

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

Krav

  • AKS version 1.29 eller senare krävs.

Skapa ett nytt kluster med tillåtna portar och programsäkerhetsgrupper

az aks create \
    --resource-group <resourceGroup> \
    --name <aksClusterName> \
    --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

Lägga till en ny nodpool med tillåtna portar och programsäkerhetsgrupper

az aks nodepool add \
  --resource-group <resourceGroup> \
  --cluster-name <aksClusterName> \
  --name <nodePoolName> \
  --allowed-host-ports 80/tcp,443/tcp,53/udp,40000-60000/tcp,40000-50000/udp \
  --asg-ids "<asgId>,<asgId>"

Uppdatera de tillåtna portarna och programsäkerhetsgrupperna för en nodpool

az aks nodepool update \
  --resource-group <resourceGroup> \
  --cluster-name <aksClusterName> \
  --name <nodePoolName> \
  --allowed-host-ports 80/tcp,443/tcp,53/udp,40000-60000/tcp,40000-50000/udp \
  --asg-ids "<asgId>,<asgId>"

Tilldela automatiskt värdportar för poddarbetsbelastningar (FÖRHANDSVERSION)

När offentliga IP-adresser konfigureras på noder kan värdportar användas för att tillåta poddar att ta emot trafik direkt utan att behöva konfigurera en lastbalanserartjänst. Detta är särskilt användbart i scenarier som spel, där den tillfälliga karaktären hos nodens IP och port inte är ett problem eftersom en matchmaker-tjänst med ett välkänt värdnamn kan ge rätt värd och port att använda vid anslutningstid. Men eftersom endast en process på en värd kan lyssna på samma port kan användning av program med värdportar leda till problem med schemaläggning. För att undvika det här problemet ger AKS möjlighet att låta systemet dynamiskt tilldela en tillgänglig port vid schemaläggningstid, vilket förhindrar konflikter.

Varning

Trafiken till poddens värdport blockeras av de förvalda NSG-reglerna i klustret. Den här funktionen bör kombineras med att tillåta värdportar i nodpoolen så att trafik kan flöda.

Viktigt!

AKS-förhandsfunktioner är tillgängliga via självbetjäning och frivillig anmälan. Förhandsversioner tillhandahålls "som är" och "som tillgängliga", och de undantas från serviceavtalen och den begränsade garantin. AKS-förhandsversioner omfattas delvis av kundsupport efter bästa förmåga. Därför är dessa funktioner inte avsedda för produktionsanvändning. Mer information finns i följande supportartiklar:

Krav

  • AKS version 1.29 eller senare krävs.

Registrera funktionsflaggan PodHostPortAutoAssignPreview

Registrera funktionsflaggan PodHostPortAutoAssignPreview med kommandot az feature register , som du ser i följande exempel:

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

Det tar några minuter för statusen att visa Registrerad. Kontrollera registreringsstatusen med kommandot az feature show :

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

När statusen visar Registrerad uppdaterar du registreringen av Resursprovidern Microsoft.ContainerService med hjälp av kommandot az provider register :

az provider register --namespace Microsoft.ContainerService

Tilldela automatiskt en värdport till en podd

Utlösande av automatisk tilldelning av värdport görs genom att distribuera en arbetsbelastning utan värdportar och tillämpa anteckningen kubernetes.azure.com/assign-hostports-for-containerports med listan över portar som behöver värdporttilldelningar. Värdet för anteckningen ska anges som en kommaavgränsad lista med poster som port/protocol, där porten är ett enskilt portnummer som definieras i poddspecifikationen och protokollet är tcp eller udp.

Portar tilldelas från intervallet 40000-59999 och kommer att vara unika i klustret. De tilldelade portarna läggs också till i miljövariabler i podden så att programmet kan avgöra vilka portar som har tilldelats. Miljövariabelnamnet kommer att ha följande format (exempel nedan): <deployment name>_PORT_<port number>_<protocol>_HOSTPORT, så ett exempel är mydeployment_PORT_8080_TCP_HOSTPORT: 41932.

Här är ett exempel echoserver på en distribution som visar mappningen av värdportar för portarna 8080 och 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

När distributionen tillämpas finns posterna hostPort i YAML för de enskilda poddarna:

$ 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

Nästa steg