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

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

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

開始之前

  • 您必須安裝並設定 Azure CLI 2.0.59 版或更新版本。 執行 az --version 以尋找版本。 如果您需要安裝或升級,請參閱安裝 Azure CLI
  • 本文說明如何搭配使用標準 SKU IP 與標準 SKU 負載平衡器。 如需詳細資訊,請參閱 Azure 中的 IP 位址類型及配置方法

建立 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 network public ip create 命令建立靜態公用 IP 位址。

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

    注意

    如果您在 AKS 叢集中使用 基本 SKU 負載平衡器,請在定義公用 IP 時,將 Basic 用於 --sku 參數。 只有基本 SKU IP 可用於基本 SKU 負載平衡器,且只有標準 SKU IP 可用於標準 SKU 負載平衡器。

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

    az aks show --name myAKSCluster --resource-group myNetworkResourceGroup --query nodeResourceGroup -o tsv
    
  3. 使用 az network public-ip list 命令取得靜態公用 IP 位址。 指定您建立的節點資源群組和公用 IP 位址的名稱,並查詢 ipAddress

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

使用靜態 IP 位址建立服務

  1. 請確定 AKS 叢集所使用的叢集身分識別具有使用 命令委派給節點資源群組 az role assignment create 的許可權。

    CLIENT_ID=$(az aks show --name myAKSCluster --resource-group myNetworkResourceGroup --query identity.principalId -o tsv)
    RG_SCOPE=$(az group show --name <node resource group> --query id -o tsv)
    az role assignment create \
        --assignee ${CLIENT_ID} \
        --role "Network Contributor" \
        --scope ${RG_SCOPE}
    

    重要

    如果您自訂輸出 IP,請確定您的叢集身分識別具有輸出公用 IP 和輸入公用 IP 的許可權。

  2. 建立名為 load-balancer-service.yaml 的檔案,並在下列 YAML 檔案的內容中複製,並提供您在上一個步驟中建立的您自己的公用 IP 位址和節點資源組名。

    重要

    loadBalancerIP 屬性新增至負載平衡器 YAML 資訊清單在 上游 Kubernetes之後已被取代。 雖然目前的使用量維持不變,而且現有的服務預期會在不修改的情況下運作,但 強烈建議改為設定服務批註 。 若要設定服務批註,您可以針對 IPv4 位址和 service.beta.kubernetes.io/azure-load-balancer-ipv6 IPv6 位址使用 service.beta.kubernetes.io/azure-load-balancer-ipv4 ,如範例 YAML 所示。

    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/azure-load-balancer-resource-group: <node resource group>
        service.beta.kubernetes.io/azure-load-balancer-ipv4: <public IP address>
        service.beta.kubernetes.io/azure-pip-name: <public IP Name>
      name: azure-load-balancer
    spec:
      type: LoadBalancer
      ports:
      - port: 80
      selector:
        app: azure-load-balancer
    

    注意

    service.beta.kubernetes.io/azure-pip-name新增注釋可確保最有效率的 LoadBalancer 建立,強烈建議您避免潛在的節流。

  3. 使用 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>
        service.beta.kubernetes.io/azure-load-balancer-ipv4: <public IP address>
        service.beta.kubernetes.io/azure-pip-name: <public IP Name>
        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
    
  4. 使用 命令建立 kubectl apply 服務和部署。

    kubectl apply -f load-balancer-service.yaml
    
  5. 若要查看負載平衡器的 DNS 標籤,請使用 kubectl describe service 命令。

    kubectl describe service azure-load-balancer
    

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

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

疑難排解

如果 Kubernetes 服務資訊清單的 屬性中 loadBalancerIP 定義的靜態 IP 位址不存在或尚未在節點資源群組中建立,而且沒有設定其他委派,則負載平衡器服務建立會失敗。 若要進行疑難排解,請使用 kubectl describe 命令檢閱服務建立事件。 提供 YAML 資訊清單中指定的服務名稱,如下列範例所示:

kubectl describe service azure-load-balancer

輸出會顯示 Kubernetes 服務資源的相關資訊。 下列範例輸出顯示 WarningEvents : 「 user supplied IP address was not found .在此案例中,請確定您已在節點資源群組中建立靜態公用 IP 位址,而且 Kubernetes 服務資訊清單中指定的 IP 位址正確無誤。

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

下一步

若要進一步控制應用程式的網路流量,您可能會想要 建立輸入控制器。 您也可以使用靜態公用 IP 位址建立輸入控制器