在 Azure Kubernetes Service (AKS) 負載平衡器中使用靜態公用 IP 位址和 DNS 標籤

您在 Azure Kubernetes Service (AKS) 叢集中建立負載平衡器資源時,指派給這個資源的公用 IP 位址僅適用於該資源的生命週期。 如果您刪除 Kubernetes 服務,相關聯的負載平衡器和 IP 位址也會一併刪除。 如果您想要針對已重新部署的 Kubernetes 服務指派特定的 IP 位址或保留 IP 位址,您可以建立並使用靜態公用 IP 位址。

此文章示範如何建立靜態公用 IP 位址,並將它指派給您的 Kubernetes 服務。

開始之前

建立 AKS 叢集

  1. 使用 az group create 命令建立 Azure 資源群組。

    az group create --name myNetworkResourceGroup --location eastus
    
  2. 請使用指令 az aks create 建立 AKS 叢集。

    az aks create --name myAKSCluster --resource-group myNetworkResourceGroup --generate-ssh-keys
    

建立靜態 IP 位址

  1. 使用 az aks show 命令取得節點資源群組的名稱,並查詢 nodeResourceGroup 屬性。

    az aks show --name myAKSCluster --resource-group myNetworkResourceGroup --query nodeResourceGroup -o tsv
    
  2. 在節點資源群組中使用 az network public-ip create 指令建立靜態公共 IP 位址。

    az network public-ip create \
        --resource-group <node resource group name> \
        --name myAKSPublicIP \
        --sku Standard \
        --allocation-method static
    

    重要

    AKS 不再支援 Basic Load Balancer。 如果你的叢集使用 Basic Load Balancer,設定靜態公共 IP 位址前,請先升級到 Standard Load Balancer

  3. 用指令 az network public-ip show 取得靜態的公共 IP 位址。 請指定節點資源群組名稱及你建立的公開 IP 位址,並查詢 ipAddress

    az network public-ip show --resource-group <node resource group name> --name myAKSPublicIP --query ipAddress --output tsv
    

建立一個帶有靜態 IP 位址的 Kubernetes 服務

  1. 建立一個名為 load-balancer-service.yaml YAML 檔案的檔案,並將內容複製到以下 YAML 檔案中。 請提供您在「建立靜態 IP 位址」區塊中建立的公共 IP 資源名稱myAKSPublicIP()以及節點資源群組名稱。

    AKS 控制平面身份預設擁有節點資源群組的貢獻者權限,因此你在本文中建立的公開 IP 不需要其他角色指派。 如果您在不同的資源群組中使用輸入或輸出的公用 IP,請在該資源群組上將所需權限授與控制平面身分識別。 欲了解更多資訊,請參閱 AKS 中的受管理身份

    重要

    Kubernetes 服務清單中的這個 loadBalancerIP 屬性在 上游 Kubernetes 之後會被棄用。 現有服務無需修改即可繼續正常運作,但請改用服務註解。

    Annotation Purpose
    service.beta.kubernetes.io/azure-pip-name 指定公共 IP 資源名稱。
    service.beta.kubernetes.io/azure-load-balancer-ipv4 指定一個 IPv4 位址。
    service.beta.kubernetes.io/azure-load-balancer-ipv6 指定一個 IPv6 位址。
    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
    

    注意

    新增service.beta.kubernetes.io/azure-pip-name註釋可確保以最高效率建立 LoadBalancer,且強烈建議您這麼做,以避免可能發生的節流。

  2. 使用 service.beta.kubernetes.io/azure-dns-label-name 服務註解,為該服務設定對外公開的 DNS 標籤。 這會使用 Azure 的公用 DNS 伺服器和頂層網域,為您的服務發佈完整網域名稱 (FQDN)。 註釋值在 Azure 位置中必須是唯一值,因此建議使用足夠合格的標籤。 Azure 會自動將所選位置中的預設尾碼 (例如 <location>.cloudapp.azure.com) 附加至您提供的名稱,以建立 FQDN。

    注意

    如果要在您自己的網域上發佈服務,請參閱 Azure DNSexternal-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
    
  3. 在建立服務之前,請確認您的叢集中有一個工作負載,其 Pod 使用了 app: azure-load-balancer 標籤。 服務清單會選擇帶有此標籤的 pods,但不會建立部署。

  4. 請使用指令 kubectl apply 建立服務。

    kubectl apply -f load-balancer-service.yaml
    
  5. 確認服務至少選擇了一個運作中且已準備好的艙體。

    kubectl get pods -l app=azure-load-balancer
    
  6. 若要查看負載平衡器的 DNS 標籤,請使用 kubectl describe 命令。

    kubectl describe service azure-load-balancer
    

    DNS 標籤會列在 Annotations 下方,如下列緊縮範例輸出所示:

    Name:                    azure-load-balancer
    Namespace:               default
    Labels:                  <none>
    Annotations:             service.beta.kubernetes.io/azure-dns-label-name: <unique-service-label>
    

疑難排解

這部分假設你完成了 建立靜態 IP 位址,嘗試了 建立 Kubernetes 服務的步驟,並且有運行中的 AKS 叢集。 要取得節點資源群組名稱,請使用 az aks show --name myAKSCluster --resource-group myNetworkResourceGroup --query nodeResourceGroup -o tsv

如果註解中 service.beta.kubernetes.io/azure-pip-name 指定的公共 IP 資源不存在於由 所 service.beta.kubernetes.io/azure-load-balancer-resource-group指定的資源群組中,或 AKS 控制平面身份無法存取該資源群組,負載平衡器服務建立將失敗。 為了排除故障,請使用 kubectl describe 指令來檢視服務註解與建立事件。 提供 YAML 資訊清單中所指定的服務名稱,如下列範例所示:

kubectl describe service azure-load-balancer

輸出會顯示 Kubernetes 服務資源的相關資訊。 以下範例輸出顯示 a WarningEvents: “user supplied IP address was not found.”在此情境中,請確保 azure-pip-name 註解與靜態公共 IP 資源名稱相符,且 azure-load-balancer-resource-group 註解與包含該資源的資源群組相符。

Name:                     azure-load-balancer
Namespace:                default
Labels:                   <none>
Annotations:              service.beta.kubernetes.io/azure-load-balancer-resource-group: <node resource group name>
                          service.beta.kubernetes.io/azure-pip-name: myAKSPublicIP
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:                <pod-ip>:80
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

下一步

為了更好地控制應用程式的網路流量,可以使用 AKS 的應用程式路由外掛。 欲了解更多關於應用程式路由外掛的資訊,請參閱 「受管理的 NGINX 入口與應用程式路由外掛」。