Verwenden einer statischen öffentlichen IP-Adresse und einer DNS-Bezeichnung mit dem Lastenausgleich von Azure Kubernetes Service (AKS)
Wenn Sie eine Lastenausgleichsressource in einem Azure Kubernetes Service (AKS)-Cluster erstellen, ist die ihr zugewiesene öffentliche IP-Adresse nur für die Lebensdauer dieser Ressource gültig. Wenn Sie den Kubernetes-Dienst löschen, werden auch der zugehörige Lastenausgleich und die zugehörige IP-Adresse gelöscht. Wenn Sie eine bestimmte IP-Adresse für einen Kubernetes-Dienst zuweisen oder beibehalten möchten, können Sie eine statische öffentliche IP-Adresse erstellen und verwenden.
In diesem Artikel wird erläutert, wie Sie eine statische öffentliche IP-Adresse erstellen und Ihrem Kubernetes-Dienst zuweisen.
Voraussetzungen
- Azure CLI-Version 2.0.59 oder höher muss installiert und konfiguriert sein. Führen Sie
az --version
aus, um die Version zu ermitteln. Informationen zum Durchführen einer Installation oder eines Upgrades finden Sei bei Bedarf unter Installieren der Azure CLI. - In diesem Artikel wird die Verwendung einer IP-Adresse der SKU Standard mit einem Lastenausgleich der SKU Standard behandelt. Weitere Informationen finden Sie unter IP-Adresstypen und Zuordnungsmethoden in Azure.
Erstellen eines AKS-Clusters
Erstellen Sie mithilfe des Befehls
az group create
eine Azure-Ressourcengruppe.az group create --name myNetworkResourceGroup --location eastus
Erstellen Sie mit dem Befehl
az aks create
einen AKS-Cluster.az aks create --name myAKSCluster --resource-group myNetworkResourceGroup --generate-ssh-keys
Erstellen einer statischen IP-Adresse
Rufen Sie den Namen der Knotenressourcengruppe mithilfe des Befehls und der
az aks show
Abfrage für die Eigenschaft abnodeResourceGroup
.az aks show --name myAKSCluster --resource-group myNetworkResourceGroup --query nodeResourceGroup -o tsv
Erstellen Sie mithilfe des Befehls
az network public ip create
eine statische öffentliche IP-Adresse in der Knotenressourcengruppe.az network public-ip create \ --resource-group <node resource group name> \ --name myAKSPublicIP \ --sku Standard \ --allocation-method static
Hinweis
Wenn Sie in Ihrem AKS-Cluster einen Lastenausgleich der SKU Basic verwenden, verwenden Sie die Option Basic für den Parameter
--sku
, wenn Sie eine öffentliche IP-Adresse definieren. Mit dem Lastenausgleich der SKU Basic können nur IP-Adressen der SKU Basic verwendet werden. Analog dazu können mit einem Lastenausgleich der SKU Standard nur IP-Adressen der SKU Standard verwendet werden.Verwenden Sie den Befehl
az network public-ip list
, um eine statische öffentliche IP-Adresse zu erstellen. Geben Sie den Namen der Knotenressourcengruppe und die öffentliche IP-Adresse an, die Sie erstellt haben, und fragen Sie dieipAddress
ab.az network public-ip show --resource-group <node resource group name> --name myAKSPublicIP --query ipAddress --output tsv
Erstellen eines Diensts mithilfe der statischen IP-Adresse
Ermitteln Sie zunächst, welche Art von verwalteter Identität Ihr AKS-Cluster verwendet: systemseitig zugewiesen oder benutzerseitig zugewiesen. Wenn Sie nicht sicher sind, rufen Sie den Befehl az aks show auf, und fragen Sie die Eigenschaft type der Identität ab.
az aks show \ --name myAKSCluster \ --resource-group myResourceGroup \ --query identity.type \ --output tsv
Wenn der Cluster eine verwaltete Identität verwendet, ist der Wert der type-Eigenschaft entweder SystemAssigned oder UserAssigned.
Wenn der Cluster einen Dienstprinzipal verwendet, ist der Wert der type-Eigenschaft NULL. Aktualisieren Sie ggf. Ihren Cluster, um eine verwaltete Identität zu verwenden.
Wenn Ihr AKS-Cluster eine systemseitig zugewiesene verwaltete Identität verwendet, fragen Sie die Prinzipal-ID der verwalteten Identität wie folgt ab:
# Get the principal ID for a system-assigned managed identity. CLIENT_ID=$(az aks show \ --name myAKSCluster \ --resource-group myNetworkResourceGroup \ --query identity.principalId \ --output tsv)
Wenn Ihr AKS-Cluster eine benutzerseitig zugewiesene verwaltete Identität verwendet, ist die Prinzipal-ID NULL. Fragen Sie stattdessen die Client-ID der benutzerseitig zugewiesenen verwalteten Identität ab:
# Get the client ID for a user-assigned managed identity. CLIENT_ID=$(az aks show \ --name myAKSCluster \ --resource-group myNetworkResourceGroup \ --query identity.userAssignedIdentities.*.clientId \ --output tsv
Weisen Sie delegierte Berechtigungen für die vom AKS-Cluster verwendete verwaltete Identität für die Ressourcengruppe der öffentlichen IP-Adresse zu, indem Sie den Befehl
az role assignment create
aufrufen.# Get the resource ID for the node resource group. RG_SCOPE=$(az group show \ --name <node resource group> \ --query id \ --output tsv) # Assign the Network Contributor role to the managed identity, # scoped to the node resource group. az role assignment create \ --assignee ${CLIENT_ID} \ --role "Network Contributor" \ --scope ${RG_SCOPE}
Wichtig
Wenn Sie Ihre ausgehende IP-Adresse angepasst haben, stellen Sie sicher, dass Ihre Clusteridentität über Berechtigungen für sowohl die ausgehende öffentliche IP-Adresse als auch die eingehende öffentliche IP-Adresse verfügt.
Erstellen Sie eine Datei mit dem Namen
load-balancer-service.yaml
, und kopieren Sie den Inhalt der folgenden YAML-Datei hinein, und geben Sie dabei Ihre eigene öffentliche IP-Adresse an, die im vorherigen Schritt erstellt wurde, und den Namen der Knotenressourcengruppe.Wichtig
Das Hinzufügen der
loadBalancerIP
-Eigenschaft zum YAML-Manifest des Lastenausgleichs ist nach der Upstreamversion von Kubernetes veraltet. Auch wenn der aktuelle Verbrauch unverändert bleibt und von vorhandenen Diensten erwartet wird, dass sie ohne Änderungen funktionieren, wird dringend empfohlen, stattdessen Dienstanmerkungen festzulegen. Zum Festlegen von Dienstanmerkungen können Sie entwederservice.beta.kubernetes.io/azure-pip-name
für eine öffentliche IP-Adresse oderservice.beta.kubernetes.io/azure-load-balancer-ipv4
für eine IPv4-Adresse undservice.beta.kubernetes.io/azure-load-balancer-ipv6
für eine IPv6-Adresse verwenden, wie im YAML-Beispielcode gezeigt.apiVersion: v1 kind: Service metadata: annotations: service.beta.kubernetes.io/azure-load-balancer-resource-group: <node resource group name> service.beta.kubernetes.io/azure-pip-name: myAKSPublicIP name: azure-load-balancer spec: type: LoadBalancer ports: - port: 80 selector: app: azure-load-balancer
Hinweis
Das Hinzufügen der
service.beta.kubernetes.io/azure-pip-name
Anmerkung gewährleistet die effizienteste LoadBalancer-Erstellung und wird dringend empfohlen, um eine potenzielle Drosselung zu vermeiden.Legen Sie mithilfe der Dienstanmerkung eine öffentlich zugängliche DNS-Bezeichnung auf den
service.beta.kubernetes.io/azure-dns-label-name
Dienst fest. Damit wird ein vollqualifizierter Domänenname (Fully Qualified Domain Name, FQDN) für Ihren Dienst veröffentlicht, der die öffentlichen DNS-Server und die Domäne der obersten Ebene von Azure verwendet. Der Anmerkungswert muss innerhalb des Azure-Standorts eindeutig sein, daher wird die Verwendung einer ausreichend qualifizierten Bezeichnung empfohlen. Azure fügt dem von Ihnen angegebenen Namen automatisch ein Standardsuffix an dem von Ihnen gewählten Speicherort hinzu, z. B.<location>.cloudapp.azure.com
, und erstellt so den FQDN.Hinweis
Informationen zum Veröffentlichen des Diensts in Ihrer eigenen Domäne finden Sie unter Azure DNS und dem Projekt external-dns.
apiVersion: v1 kind: Service metadata: annotations: service.beta.kubernetes.io/azure-load-balancer-resource-group: <node resource group name> service.beta.kubernetes.io/azure-pip-name: myAKSPublicIP service.beta.kubernetes.io/azure-dns-label-name: <unique-service-label> name: azure-load-balancer spec: type: LoadBalancer ports: - port: 80 selector: app: azure-load-balancer
Erstellen Sie den Dienst und die Bereitstellung mit dem Befehl
kubectl apply
.kubectl apply -f load-balancer-service.yaml
Um die DNS-Bezeichnung für Ihren Lastenausgleich anzuzeigen, führen Sie den folgenden Befehl aus:
kubectl describe service
kubectl describe service azure-load-balancer
Die DNS-Bezeichnung wird unter den
Annotations
aufgeführt, wie in der folgenden verdichteten Beispielausgabe gezeigt:Name: azure-load-balancer Namespace: default Labels: <none> Annotations: service.beta.kuberenetes.io/azure-dns-label-name: <unique-service-label>
Problembehandlung
Wenn die in der Eigenschaft loadBalancerIP
des Dienstmanifests für Kubernetes definierte statische IP-Adresse nicht vorhanden ist oder nicht in der Knotenressourcengruppe erstellt wurde und keine zusätzlichen Delegierungen konfiguriert sind, schlägt die Erstellung des Lastenausgleichsdienst fehl. Prüfen Sie zur Problembehandlung mithilfe des Befehls kubectl describe
die Diensterstellungsereignisse. Geben Sie den im YAML-Manifest angegebenen Namen des Diensts ein, wie im folgenden Beispiel dargestellt:
kubectl describe service azure-load-balancer
In der Ausgabe werden Informationen zur Kubernetes-Dienstressource angezeigt. Die folgende Beispielausgabe zeigt eine Warning
in Events
: „user supplied IP address was not found
“. Stellen Sie in diesem Szenario sicher, dass Sie die statische öffentliche IP-Adresse in der Knotenressourcengruppe erstellt haben, und dass die im Kubernetes-Dienstmanifest angegebene IP-Adresse korrekt ist.
Name: azure-load-balancer
Namespace: default
Labels: <none>
Annotations: <none>
Selector: app=azure-load-balancer
Type: LoadBalancer
IP: 10.0.18.125
IP: 40.121.183.52
Port: <unset> 80/TCP
TargetPort: 80/TCP
NodePort: <unset> 32582/TCP
Endpoints: <none>
Session Affinity: None
External Traffic Policy: Cluster
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal CreatingLoadBalancer 7s (x2 over 22s) service-controller Creating load balancer
Warning CreatingLoadBalancerFailed 6s (x2 over 12s) service-controller Error creating load balancer (will retry): Failed to create load balancer for service default/azure-load-balancer: user supplied IP Address 40.121.183.52 was not found
Nächste Schritte
Um den Netzwerkdatenverkehr für Ihre Anwendungen besser zu steuern, verwenden Sie das Anwendungsrouting-Add-On für AKS. Weitere Informationen zum App-Routing-Add-On finden Sie unter Verwalteter NGINX-Eingang mit der Anwendungsrouting-Add-On.
Azure Kubernetes Service