Freigeben über


Verwenden von öffentlichen IP-Adressen auf Instanzebene in Azure Kubernetes Service (AKS)

AKS-Knoten benötigen keine eigene öffentliche IP-Adresse für die Kommunikation. In einigen Szenarien müssen Knoten in einem Knotenpool jedoch möglicherweise jeweils eine eigene dedizierte öffentliche IP-Adresse erhalten. Ein häufiges Szenario hierfür sind Gamingworkloads, bei denen eine Konsole eine direkte Verbindung mit einem virtuellen Cloudcomputer herstellen muss, um Hops zu minimieren. Dieses Szenario kann in AKS durch öffentliche IP-Adressen für Knoten erzielt werden.

Erstellen Sie zunächst eine neue Ressourcengruppe.

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

Erstellen Sie einen neuen AKS-Cluster, und fügen Sie an Ihre Knoten eine öffentliche IP-Adresse an. Jeder Knoten im Knotenpool erhält eine eindeutige öffentliche IP-Adresse. Sie können dies überprüfen, indem Sie sich die VM-Skalierungsgruppeninstanzen ansehen.

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

Bei vorhandenen AKS-Clustern können Sie auch einen neuen Knotenpool hinzufügen und eine öffentliche IP-Adresse an Ihre Knoten anfügen.

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

Präfix für öffentliche IP-Adressen verwenden

Es gibt viele Vorteile bei der Verwendung eines öffentlichen IP-Präfixes. AKS unterstützt die Verwendung von Adressen aus einem vorhandenen öffentlichen IP-Präfix für Ihre Knoten durch das Übergeben der Ressourcen-ID mit dem Flag --node-public-ip-prefix-id Erstellen eines neuen Clusters oder durch Hinzufügen eines Knoten-Pools.

Erstellen Sie zunächst mit AZ Network Public-IP Prefixein öffentliches IP-Präfix:

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

Sehen Sie sich die Ausgabe an, und notieren Sie sich die id für das Präfix:

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

Wenn Sie einen neuen Cluster erstellen oder einen neuen Knoten-Pool hinzufügen, verwenden Sie schließlich das --node-public-ip-prefix-id-Flag und übergeben Sie die Ressourcen-ID des Präfixes:

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

Öffentliche IPS für Knoten suchen

Sie können die öffentlichen IP-Adressen Ihrer Knoten auf verschiedene Weise ermitteln:

Wichtig

Die Knotenressourcengruppe enthält die Knoten und deren öffentlichen IP-Adressen. Verwenden Sie die Knotenressourcengruppe, wenn Sie Befehle ausführen, um die öffentlichen IP-Adressen Ihrer Knoten zu ermitteln.

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

Verwenden von Tags öffentlicher IP-Adressen für öffentliche IP-Adressen von Knoten

Tags öffentlicher IP-Adressen können für öffentliche IP-Adressen von Knoten verwendet werden, um die Für Azure-Routingeinstellung zu nutzen.

Anforderungen

  • AKS-Version 1.29 oder höher ist erforderlich.

Erstellen eines neuen Clusters mithilfe der Routingeinstellung „Internet“

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

Hinzufügen eines Knotenpools mit Routingeinstellung „Internet“

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

Zulassen von Hostportverbindungen und Hinzufügen von Knotenpools zu Anwendungssicherheitsgruppen

AKS-Knoten, die öffentliche IP-Adressen von Knoten verwenden, die Dienste mit ihrer Hostadresse hosten, muss eine NSG-Regel hinzugefügt werden, um den Datenverkehr zuzulassen. Durch das Hinzufügen der gewünschten Ports in der Knotenpoolkonfiguration werden die entsprechenden Zulassungsregeln in der Clusternetzwerk-Sicherheitsgruppe erstellt.

Wenn im Subnetz eine Netzwerksicherheitsgruppe mit einem Cluster unter Verwendung eines virtuellen Bring-Your-Own-Netzwerks vorhanden ist, muss dieser Netzwerksicherheitsgruppe eine Zulassungsregel hinzugefügt werden. Dies kann durch Hinzufügen des Knotenpools zu einer Anwendungssicherheitsgruppe (ASG) auf die Knoten in einem bestimmten Knotenpool beschränkt werden. Eine verwaltete ASG wird standardmäßig in der verwalteten Ressourcengruppe erstellt, wenn zulässige Hostports angegeben werden. Knoten können auch mindestens einer benutzerdefinierten ASG hinzugefügt werden, indem die Ressourcen-ID der NSG in den Knotenpoolparametern angegeben wird.

Format der Hostportspezifikation

Wenn Sie die Liste der zuzulassenden Ports angeben, verwenden Sie eine durch Trennzeichen getrennte Liste mit Einträgen im Format port/protocol oder startPort-endPort/protocol.

Beispiele:

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

Anforderungen

  • AKS-Version 1.29 oder höher ist erforderlich.

Erstellen eines neuen Clusters mit zulässigen Ports und Anwendungssicherheitsgruppen

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

Hinzufügen eines neuen Knotenpools mit zulässigen Ports und Anwendungssicherheitsgruppen

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>"

Aktualisieren der zulässigen Ports und Anwendungssicherheitsgruppen für einen Knotenpool

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>"

Automatisches Zuweisen von Hostports für Podworkloads (VORSCHAU)

Wenn öffentliche IP-Adressen für Knoten konfiguriert sind, können Hostports verwendet werden, um Pods das direkte Empfangen von Datenverkehr zu ermöglichen, ohne einen Lastenausgleichsdienst konfigurieren zu müssen. Dies ist besonders nützlich in Szenarien wie Gaming, in denen die kurzlebige Natur der IP-Adresse des Knotens und des Ports kein Problem darstellt, da ein Matchmakerdienst unter einem bekannten Hostnamen den richtigen Host und Port bereitstellen kann, die zur Verbindungszeit verwendet werden sollen. Da jedoch nur ein Prozess auf einem Host am gleichen Port lauschen kann, kann die Verwendung von Anwendungen mit Hostports zu Problemen bei der Zeitplanung führen. Um dieses Problem zu vermeiden, bietet AKS die Möglichkeit, dass das System zur Planungszeit dynamisch einen verfügbaren Port zuweisen kann, um Konflikte zu vermeiden.

Warnung

Der Portdatenverkehr des Podhosts wird durch die im Cluster geltenden NSG-Standardregeln blockiert. Diese Funktion sollte mit dem Zulassen von Hostports für den Knotenpool kombiniert werden, damit der Datenverkehr fließen kann.

Wichtig

AKS-Previewfunktionen stehen gemäß dem Self-Service- und Aktivierungsprinzip zur Verfügung. Vorschauversionen werden „wie besehen“ und „wie verfügbar“ bereitgestellt und sind von Service Level Agreements und der Herstellergarantie ausgeschlossen. AKS-Vorschauversionen werden teilweise vom Kundensupport auf Grundlage der bestmöglichen Leistung abgedeckt. Daher sind diese Funktionen nicht für die Verwendung in der Produktion vorgesehen. Weitere Informationen finden Sie in den folgenden Supportartikeln:

Anforderungen

  • AKS-Version 1.29 oder höher ist erforderlich.

Registrieren des PodHostPortAutoAssignPreview-Featureflags

Registrieren Sie das Featureflag PodHostPortAutoAssignPreview mithilfe des Befehls PodHostPortAutoAssignPreview, wie im folgenden Beispiel gezeigt:

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

Es dauert einige Minuten, bis der Status Registered (Registriert) angezeigt wird. Überprüfen Sie den Registrierungsstatus mithilfe des Befehls az feature show:

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

Wenn der Zustand Registered (Registriert) lautet, aktualisieren Sie die Registrierung des Ressourcenanbieters Microsoft.ContainerService mithilfe des Befehls az provider register:

az provider register --namespace Microsoft.ContainerService

Automatisches Zuweisen eines Hostports zu einem Pod

Das Auslösen der automatischen Hostportzuweisung erfolgt durch Bereitstellen einer Workload ohne Hostports und Anwenden der kubernetes.azure.com/assign-hostports-for-containerports-Anmerkung mit der Liste der Ports, die Hostportzuweisungen benötigen. Der Wert der Anmerkung sollte als durch Trennzeichen getrennte Liste von Einträgen wie port/protocol angegeben werden, wobei der Port eine einzelne Portnummer ist, die in der Podspezifikation definiert ist, und das Protokoll ist tcp oder udp.

Ports werden aus dem Bereich 40000-59999 zugewiesen und sind im gesamten Cluster eindeutig. Die zugewiesenen Ports werden auch Umgebungsvariablen innerhalb des Pods hinzugefügt, damit die Anwendung bestimmen kann, welche Ports zugewiesen wurden. Der Name der Umgebungsvariablen weist das folgende Format auf (Beispiel unten): <deployment name>_PORT_<port number>_<protocol>_HOSTPORT, ein Beispiel wäre also mydeployment_PORT_8080_TCP_HOSTPORT: 41932.

Hier sehen Sie eine echoserver-Beispielbereitstellung, die die Zuordnung der Hostports für die Ports 8080 und 8443 zeigt:

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

Wenn die Bereitstellung angewendet wird, befinden sich die hostPort-Einträge im YAML der einzelnen Pods:

$ 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ächste Schritte