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: Local
unterstü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
oderipv4,ipv6
werden unterstützt.
- Nur
--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.
- Anzahl und Reihenfolge der Bereiche in dieser Liste müssen dem für
--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.
- Anzahl und Reihenfolge der Bereiche in dieser Liste müssen dem für
Bereitstellen eines AKS-Clusters mit dualem Stapel
Erstellen Sie mithilfe des Befehls „
az group create
“ eine Azure-Ressourcengruppe für den Cluster.az group create --location <region> --name <resourceGroupName>
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
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
Erstellen Sie mit dem Befehl „
kubectl create deployment nginx
“ einen NGINX-Webserver.kubectl create deployment nginx --image=nginx:latest --replicas=3
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
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
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"]
Ü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
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
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
Ü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>
Azure Kubernetes Service