Freigeben über


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

  1. Erstellen Sie mithilfe des Befehls az group create eine Azure-Ressourcengruppe.

    az group create --name myNetworkResourceGroup --location eastus
    
  2. 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

  1. Rufen Sie den Namen der Knotenressourcengruppe mithilfe des Befehls und der az aks show Abfrage für die Eigenschaft ab nodeResourceGroup.

    az aks show --name myAKSCluster --resource-group myNetworkResourceGroup --query nodeResourceGroup -o tsv
    
  2. 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.

  3. 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 die ipAddress 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

  1. 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.

  2. 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    
    
  3. 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.

  4. 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 entweder service.beta.kubernetes.io/azure-pip-name für eine öffentliche IP-Adresse oder service.beta.kubernetes.io/azure-load-balancer-ipv4 für eine IPv4-Adresse und service.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.

  5. 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
    
  6. Erstellen Sie den Dienst und die Bereitstellung mit dem Befehl kubectl apply.

    kubectl apply -f load-balancer-service.yaml
    
  7. 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.