Freigeben über


Verwenden von Dual-Stack kubenet-Netzwerken in Azure Kubernetes Service (AKS)

Sie können AKS-Cluster Ihre in einem Modus mit dualem Stapel bereitstellen, wenn Sie ein kubenet-Netzwerk und ein virtuelles Azure-Netzwerk mit dualem Stapel verwenden. In dieser Konfiguration erhalten Knoten sowohl eine IPv4- als auch eine IPv6-Adresse aus dem Subnetz des virtuellen Azure-Netzwerks. Pods erhalten sowohl eine IPv4- als auch eine IPv6-Adresse aus einem logisch unterschiedlichen Adressraum für das Subnetz des virtuellen Azure-Netzwerks der Knoten. Die Netzwerkadressübersetzung (NAT, Network Address Translation) wird dann so konfiguriert, dass die Pods Ressourcen im virtuellen Azure-Netzwerk erreichen können. Die Quell-IP-Adresse des Datenverkehrs wird mittels NAT in die primäre IP-Adresse des Knotens innerhalb der gleichen IP-Adressfamilie übersetzt (also IPv4 in IPv4 und IPv6 in IPv6).

In diesem Artikel erfahren Sie, wie Sie Netzwerke mit dualem Stapel mit einem AKS-Cluster verwenden. Weitere Informationen zu Netzwerkoptionen und -überlegungen finden Sie unter Netzwerkkonzepte für Kubernetes und AKS.

Einschränkungen

  • Für Azure-Routingtabellen gilt ein fester Grenzwert von 400 Routen pro Tabelle.
    • Jeder Cluster mit dualem Stapel pro Knoten benötigt zwei Routen (jeweils eine pro IP-Adressfamilie), damit der Grenzwert bei Clustern mit dualem Stapel bei 200 Knoten liegt.
  • In Azure Linux-Knotenpools werden Dienstobjekte nur mit externalTrafficPolicy: Localunterstützt.
  • Netzwerke mit dualem Stapel sind für das virtuelle Azure-Netzwerk und die Pod-CIDR erforderlich.
    • Nur IPv6-Einzelstapel wird für Knoten- oder Pod-IP-Adressen nicht unterstützt. Dienste können IPv4- oder IPv6-basiert bereitgestellt werden.
  • Die folgenden Funktionen werden für Dual-Stack-Kubenet nicht unterstützt:

Voraussetzungen

  • Es gelten die gleichen Voraussetzungen wie beim Konfigurieren von Kubenet-Netzwerken.
  • Für AKS-Cluster mit dualem Stapel wird mindestens die Kubernetes-Version 1.21.2 benötigt. v1.22.2 oder höher wird empfohlen.
  • Bei Verwendung von Azure Resource Manager-Vorlagen wird die Schemaversion 2021-10-01 benötigt.

Übersicht über Netzwerke mit dualem Stapel in Kubernetes

Kubernetes v1.23 bietet stabile Upstreamunterstützung für Cluster mit dualem Stapel (IPv4/IPv6). Dies schließt Pod- und Dienstnetzwerke ein. Knoten und Pods wird immer sowohl eine IPv4- als auch eine IPv6-Adresse zugewiesen. Dienste können dagegen entweder mit einem dualen oder einem einzelnen Stapel in einer der IP-Adressfamilien verwendet werden.

Von AKS werden die erforderlichen unterstützenden Dienste für Netzwerke mit dualem Stapel konfiguriert. Diese Konfiguration umfasst Folgendes:

  • Bei Verwendung eines verwalteten virtuellen Netzwerks, eine Konfiguration eines virtuellen Netzwerks mit dualem Stapel.
  • IPv4- und IPv6-Adressen von Knoten und Pods.
  • Ausgangsregeln für IPv4- und IPv6-Datenverkehr.
  • Einrichtung des Lastenausgleichs für IPv4- und IPv6-Dienste.

Hinweis

Wenn Sie Dualstack mit einem benutzerdefinierten ausgehenden Routingtyp verwenden, können Sie eine Standardroute für IPv6 verwenden, je nachdem, ob Ihr IPv6-Datenverkehr das Internet erreichen soll. Wenn Sie keine Standardroute für IPv6 verwenden, wird beim Erstellen eines Clusters eine Warnung angezeigt, aber die Clustererstellung wird nicht verhindert.

Bereitstellen eines Clusters mit dualem Stapel

Zur Unterstützung von Clustern mit dualem Stapel werden die folgenden Attribute bereitgestellt:

  • --ip-families: Akzeptiert eine durch Kommas getrennte Liste mit IP-Adressfamilien, die im Cluster aktiviert werden sollen.
    • Nur ipv4 oder ipv4,ipv6 werden unterstützt.
  • --pod-cidrs: Akzeptiert eine durch Kommas getrennte Liste mit IP-Bereichen (in CIDR-Notation), aus denen Pod-IP-Adressen zugewiesen werden sollen.
    • Anzahl und Reihenfolge der Bereiche in dieser Liste müssen dem für --ip-families angegebenen Wert entsprechen.
    • Wenn keine Werte angegeben sind, wird der Standardwert „10.244.0.0/16,fd12:3456:789a::/64“ verwendet.
  • --service-cidrs: Akzeptiert eine durch Kommas getrennte Liste mit IP-Bereichen (in CIDR-Notation), aus denen Dienst-IP-Adressen zugewiesen werden sollen.
    • Anzahl und Reihenfolge der Bereiche in dieser Liste müssen dem für --ip-families angegebenen Wert entsprechen.
    • Wenn keine Werte angegeben sind, wird der Standardwert „10.0.0.0/16,fd12:3456:789a:1::/108“ verwendet.
    • Das IPv6-Subnetz, das --service-cidrs zugewiesen ist, darf nicht größer als /108 sein.

Bereitstellen eines AKS-Clusters mit dualem Stapel

  1. Erstellen Sie mithilfe des Befehls „az group create“ eine Azure-Ressourcengruppe für den Cluster.

    az group create --location <region> --name <resourceGroupName>
    
  2. Erstellen Sie einen AKS-Cluster mit dualem Stapel mit dem Befehl „az aks create“, wobei der --ip-families-Parameter auf „ipv4,ipv6“ festgelegt sein sollte.

    az aks create \
        --location <region> \
        --resource-group <resourceGroupName> \
        --name <clusterName> \
        --ip-families ipv4,ipv6 \
        --generate-ssh-keys
    
  3. Nachdem der Cluster erstellt wurde, rufen Sie die Anmeldeinformationen des Clusteradministrators mit dem Befehl „az aks get-credentials“ ab.

    az aks get-credentials --resource-group <resourceGroupName> --name <clusterName>
    

Untersuchen der Knoten, um beide IP-Adressfamilien zu sehen

  • Vergewissern Sie sich nach der Bereitstellung des Clusters, dass die Knoten mithilfe der kubectl get nodes-Befehls mit einem Netzwerk mit dualem Stapel bereitgestellt werden.

    kubectl get nodes -o=custom-columns="NAME:.metadata.name,ADDRESSES:.status.addresses[?(@.type=='InternalIP')].address,PODCIDRS:.spec.podCIDRs[*]"
    

    Die Ausgabe des Befehls „kubectl get nodes“ zeigt, dass die Knoten über Adressen und einen Pod-IP-Adresszuweisungsbereich mit IPv4 und IPv6 verfügen.

    NAME                                ADDRESSES                           PODCIDRS
    aks-nodepool1-14508455-vmss000000   10.240.0.4,2001:1234:5678:9abc::4   10.244.0.0/24,fd12:3456:789a::/80
    aks-nodepool1-14508455-vmss000001   10.240.0.5,2001:1234:5678:9abc::5   10.244.1.0/24,fd12:3456:789a:0:1::/80
    aks-nodepool1-14508455-vmss000002   10.240.0.6,2001:1234:5678:9abc::6   10.244.2.0/24,fd12:3456:789a:0:2::/80
    

Erstellen einer Beispielworkload

Nachdem der Cluster erstellt wurde, können Sie Ihre Workloads bereitstellen. Dieser Artikel führt Sie durch eine beispielhafte Workloadbereitstellung eines NGINX-Webservers.

Installieren eines NGINX-Webservers

  1. Erstellen Sie mit dem Befehl „kubectl create deployment nginx“ einen NGINX-Webserver.

    kubectl create deployment nginx --image=nginx:latest --replicas=3
    
  2. Zeigen Sie die Podressourcen mithilfe des Befehls „kubectl get pods“ an.

    kubectl get pods -o custom-columns="NAME:.metadata.name,IPs:.status.podIPs[*].ip,NODE:.spec.nodeName,READY:.status.conditions[?(@.type=='Ready')].status"
    

    Die Ausgabe zeigt, dass die Pods sowohl über IPv4- als auch über IPv6-Adressen verfügen. Die Pods zeigen IP-Adressen erst an, wenn sie bereit sind.

    NAME                     IPs                                NODE                                READY
    nginx-55649fd747-9cr7h   10.244.2.2,fd12:3456:789a:0:2::2   aks-nodepool1-14508455-vmss000002   True
    nginx-55649fd747-p5lr9   10.244.0.7,fd12:3456:789a::7       aks-nodepool1-14508455-vmss000000   True
    nginx-55649fd747-r2rqh   10.244.1.2,fd12:3456:789a:0:1::2   aks-nodepool1-14508455-vmss000001   True
    

Verfügbarmachen der Workload über einen Dienst vom Typ „LoadBalancer

Wichtig

Ab AKS v1.27 können Sie einen Dual-Stack LoadBalancer-Dienst erstellen, der mit einer öffentlichen IPv4-IP und einer öffentlichen IPv6-IP bereitgestellt wird. In älteren Versionen wird allerdings nur die erste IP-Adresse eines Dienstes für den Load Balancer bereitgestellt; somit erhält ein Dienst mit dualem Stapel nur eine öffentliche IP-Adresse für die erste aufgeführte IP-Adressfamilie. Wenn Sie für eine einzelne Bereitstellung einen Dienst mit dualem Stapel bereitstellen möchten, müssen zwei auf den gleichen Selektor ausgerichtete Dienste erstellt werden: einer für IPv4 und einer für IPv6.

AKS ab v1.27

  1. Machen Sie die NGINX-Bereitstellung mit dem Befehl „kubectl expose deployment nginx“ verfügbar.

    kubectl expose deployment nginx --name=nginx --port=80 --type=LoadBalancer --overrides='{"spec":{"ipFamilyPolicy": "PreferDualStack", "ipFamilies": ["IPv4", "IPv6"]}}'
    

    Ihnen wir eine Ausgabe angezeigt, die besagt, dass die Dienste verfügbar gemacht wurden.

    service/nginx exposed
    
  2. Nachdem die Bereitstellung verfügbar gemacht wurde und die LoadBalancer-Dienste vollständig bereitgestellt wurden, rufen Sie die IP-Adressen der Dienste mithilfe des Befehls „kubectl get services“ ab.

    kubectl get services
    
    NAME         TYPE           CLUSTER-IP               EXTERNAL-IP         PORT(S)        AGE
    nginx        LoadBalancer   10.0.223.73   2603:1030:20c:9::22d,4.156.88.133   80:30664/TCP   2m11s
    
    kubectl get services nginx -ojsonpath='{.spec.clusterIPs}'
    
    ["10.0.223.73","fd17:d93e:db1f:f771::54e"]
    
  3. Überprüfen Sie die Funktionalität über eine Befehlszeilenwebanforderung von einem IPv6-fähigen Host. Azure Cloud Shell ist nicht IPv6-fähig.

    SERVICE_IP=$(kubectl get services nginx -o jsonpath='{.status.loadBalancer.ingress[1].ip}')
    curl -s "http://[${SERVICE_IP}]" | head -n5
    
    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    <style>
    

AKS älter als v1.27

  1. Machen Sie die NGINX-Bereitstellung mit dem Befehl „kubectl expose deployment nginx“ verfügbar.

    kubectl expose deployment nginx --name=nginx-ipv4 --port=80 --type=LoadBalancer'
    kubectl expose deployment nginx --name=nginx-ipv6 --port=80 --type=LoadBalancer --overrides='{"spec":{"ipFamilies": ["IPv6"]}}'
    

    Ihnen wir eine Ausgabe angezeigt, die besagt, dass die Dienste verfügbar gemacht wurden.

    service/nginx-ipv4 exposed
    service/nginx-ipv6 exposed
    
  2. Nachdem die Bereitstellung verfügbar gemacht wurde und die LoadBalancer-Dienste vollständig bereitgestellt wurden, rufen Sie die IP-Adressen der Dienste mithilfe des Befehls „kubectl get services“ ab.

    kubectl get services
    
    NAME         TYPE           CLUSTER-IP               EXTERNAL-IP         PORT(S)        AGE
    nginx-ipv4   LoadBalancer   10.0.88.78               20.46.24.24         80:30652/TCP   97s
    nginx-ipv6   LoadBalancer   fd12:3456:789a:1::981a   2603:1030:8:5::2d   80:32002/TCP   63s
    
  3. Überprüfen Sie die Funktionalität über eine Befehlszeilenwebanforderung von einem IPv6-fähigen Host. Azure Cloud Shell ist nicht IPv6-fähig.

    SERVICE_IP=$(kubectl get services nginx-ipv6 -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
    curl -s "http://[${SERVICE_IP}]" | head -n5
    
    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    <style>