搭配 Azure Kubernetes Service (AKS) 使用內部負載平衡器 (部分機器翻譯)

您可以建立和使用內部負載平衡器,以限制存取您在 Azure Kubernetes Service (AKS) 中的應用程式。 內部負載平衡器沒有公用 IP,而且只能讓可連線到私人 IP 的應用程式存取 Kubernetes 服務。 這些應用程式可以在同一個虛擬網路內,或透過虛擬網路對等連線存在於另一個虛擬網路中。 本文說明如何在 AKS 中建立和使用內部負載平衡器。

重要事項

自 2025 年 9 月 30 日起,Azure Kubernetes 服務(AKS)不再支援基本負載平衡器。 為避免潛在服務中斷,我們建議新部署使用標準負載平衡器,並將 現有部署升級為標準負載平衡器。 欲了解更多退休資訊,請參閱 退休 GitHub 問題 及 Azure 更新退休公告。 想隨時掌握公告與更新,請參考 AKS 發布公告。

開始之前

建立內部負載平衡器

  1. 建立名為 internal-lb.yaml 的服務資訊清單,其服務類型為 LoadBalancer,並加入 azure-load-balancer-internal 註解。

    apiVersion: v1
    kind: Service
    metadata:
      name: internal-app
      annotations:
        service.beta.kubernetes.io/azure-load-balancer-internal: "true"
    spec:
      type: LoadBalancer
      ports:
      - port: 80
      selector:
        app: internal-app
    
  2. 使用 kubectl apply 命令部署內部負載平衡器。 此命令會在節點資源群組中建立 Azure 負載平衡器,並將其連線到與 AKS 叢集相同的虛擬網路。

    kubectl apply -f internal-lb.yaml
    
  3. 使用 kubectl get service 命令檢視服務詳細資料。

    kubectl get service internal-app
    

    內部負載平衡器的 IP 位址會顯示在 EXTERNAL-IP 資料行中,如下列範例輸出所示。 在此內容中,外部是指負載平衡器的外部介面。 這並不表示這會接收公用的外部 IP 位址。 此 IP 位址是從與 AKS 叢集相同的子網路中動態指派的。

    NAME           TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
    internal-app   LoadBalancer   10.0.248.59   10.240.0.7    80:30555/TCP   2m
    

指定 IP 位址

當你為負載平衡器指定 IP 位址時,該 IP 位址必須在負載平衡器使用的子網路內可用。 預設情況下,負載平衡器使用與 AKS 叢集相同的子網。 不要使用 Azure 保留的 IP 位址、已分配給其他資源的 IP 位址,或是 Kubernetes 服務 CIDR 的 IP。

您可以使用 az network vnet subnet list Azure CLI 命令或 Get-AzVirtualNetworkSubnetConfig PowerShell cmdlet 取得虛擬網路中的子網路。

如需子網路的詳細資訊,請參閱新增具有唯一子網路的節點集區。

如果您想要搭配負載平衡器使用特定的 IP 位址,您有兩個選項:設定服務註釋 或 將 LoadBalancerIP 屬性新增至負載平衡器 YAML 資訊清單。

重要事項

將 LoadBalancerIP 屬性新增至負載平衡器 YAML 資訊清單的做法,將依照上游 Kubernetes 棄用。 雖然目前的使用量將維持不變,且預期現有服務可繼續運作,不需修改,但我們仍強烈建議設定服務註釋。 欲了解更多服務註解資訊,請參見 Azure Load Balancer supported annotations。

  1. 設定服務註釋,讓 IPv4 位址使用 service.beta.kubernetes.io/azure-load-balancer-ipv4,讓 IPv6 位址使用 service.beta.kubernetes.io/azure-load-balancer-ipv6。

    apiVersion: v1
    kind: Service
    metadata:
      name: internal-app
      annotations:
        service.beta.kubernetes.io/azure-load-balancer-ipv4: 10.240.0.25
        service.beta.kubernetes.io/azure-load-balancer-internal: "true"
    spec:
      type: LoadBalancer
      ports:
      - port: 80
      selector:
        app: internal-app
    
  2. 使用 kubectl get service 命令檢視服務詳細資料。

    kubectl get service internal-app
    

    EXTERNAL-IP 資料列中的 IP 位址應該反映您指定的 IP 位址,如下列範例輸出所示:

    NAME           TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
    internal-app   LoadBalancer   10.0.184.168   10.240.0.25   80:30225/TCP   4m
    

如需在不同子網路中設定負載平衡器的詳細資訊,請參閱 指定不同的子網路。

重要事項

Private Link 服務有以下限制:

  • Private Link 服務僅支援 IPv4 流量,且僅支援 TCP 和 UDP 傳輸協定。
  • 若服務使用 externalTrafficPolicy: Local,則 Private Link Service 子網必須與 pod 子網不同。 若要使用相同的子網路,請設 externalTrafficPolicy 為 Cluster。
  • 如果你啟用 PROXY 協定並使用 externalTrafficPolicy: Local,必須設定自訂健康探針,因為預設健康探針會失敗。

欲了解更多資訊,請參閱 Private Link 服務限制與 Azure Private Link 服務整合限制。

  1. 建立名為 internal-lb-pls.yaml 的服務資訊清單,其服務類型為 LoadBalancer,並加入 azure-load-balancer-internal 與 azure-pls-create 註解。 如需其他選項,請參閱 Azure Private Link 服務整合設計文件。

    apiVersion: v1
    kind: Service
    metadata:
      name: internal-app
      annotations:
        service.beta.kubernetes.io/azure-load-balancer-internal: "true"
        service.beta.kubernetes.io/azure-pls-create: "true"
    spec:
      type: LoadBalancer
      ports:
      - port: 80
      selector:
        app: internal-app
    
  2. 使用 kubectl apply 命令部署內部負載平衡器。 此命令會在節點資源群組中建立 Azure 負載平衡器,並將其連線到與 AKS 叢集相同的虛擬網路。 同時也會建立一個 Private Link Service 物件,連接至 Kubernetes 服務物件所關聯的內部負載平衡器的前端 IP 設定。

    kubectl apply -f internal-lb-pls.yaml
    
  3. 使用 kubectl get service 命令檢視服務詳細資料。

    kubectl get service internal-app
    

    內部負載平衡器的 IP 位址會顯示在 EXTERNAL-IP 資料行中,如下列範例輸出所示。 在此內容中,外部是指負載平衡器的外部介面。 這並不表示這會接收公用的外部 IP 位址。

    NAME           TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
    internal-app   LoadBalancer   10.125.17.53  10.125.0.66   80:30430/TCP   64m
    
  4. 使用 az network private-link-service list 命令檢視 Private Link 服務物件的詳細資料。

    # Create a variable for the node resource group
    
    AKS_MC_RG=$(az aks show -g myResourceGroup --name myAKSCluster --query nodeResourceGroup -o tsv)
    
    # View the details of the Private Link Service object
    
    az network private-link-service list -g $AKS_MC_RG --query "[].{Name:name,Alias:alias}" -o table
    

    您的輸出看起來應該類似下列範例輸出:

    Name      Alias
    --------  -------------------------------------------------------------------------
    pls-xyz   pls-xyz.abc123-defg-4hij-56kl-789mnop.eastus2.azure.privatelinkservice
    

私人端點可讓您透過您建立的 Private Link 服務,以私人方式連線到 Kubernetes 服務物件。

使用 az network private-endpoint create 命令建立私人端點。 請替換pls-xyz為前一步回傳的 Private Link Service 名稱。

設定 --resource-group 到你想建立私有端點的目標資源群組。 設定 --vnet-name 和 --subnet 到包含私有端點的虛擬網路和子網。 設定--private-connection-resource-id為在 中取得AKS_PLS_ID的 Private Link Service 資源 ID 。

# Create variables for the Private Link Service

AKS_PLS_NAME=pls-xyz
AKS_PLS_ID=$(az network private-link-service show -g $AKS_MC_RG --name $AKS_PLS_NAME --query id -o tsv)

# Create the private endpoint

az network private-endpoint create \
    -g myOtherResourceGroup \
    --name myAKSServicePE \
    --vnet-name myOtherVNET \
    --subnet pe-subnet \
    --private-connection-resource-id $AKS_PLS_ID \
    --connection-name connectToMyK8sService

您可以使用下列註解來自訂 PLS 資源:

Annotation 值 描述 必要 預設
service.beta.kubernetes.io/azure-pls-create "true" 布林值,指出是否需要建立 PLS。 必要
service.beta.kubernetes.io/azure-pls-name <PLS name> 字串,指定要建立的 PLS 資源的名稱。 選用 "pls-<LB frontend config name>"
service.beta.kubernetes.io/azure-pls-resource-group Resource Group name 字串指定建立 PLS 資源的資源群組名稱 選用 MC_resource
service.beta.kubernetes.io/azure-pls-ip-configuration-subnet <Subnet name> 字串表示 PLS 部署到的子網。 此子網必須與後端池存在於同一個虛擬網路中。 PLS NAT IP 會配置在此子網路內。 選用 如果是 service.beta.kubernetes.io/azure-load-balancer-internal-subnet,則會使用這個 ILB 子網路。 否則,會使用設定檔的預設子網路。
service.beta.kubernetes.io/azure-pls-ip-configuration-ip-address-count [1-8] 要配置的私人 NAT IP 總數。 選用 1
service.beta.kubernetes.io/azure-pls-ip-configuration-ip-address "10.0.0.7 ... 10.0.0.10" 要配置的靜態 IPv4 IP,以空格分隔列表。 (目前不支援 IPv6。)IP 總數不應超過該 IP 數量。service.beta.kubernetes.io/azure-pls-ip-configuration-ip-address-count 如果指定的 IP 較少,則會動態配置其餘的 IP。 清單中的第一個 IP 會設定為 Primary。 選用 全部 IP 都是動態配置的。
service.beta.kubernetes.io/azure-pls-fqdns "fqdn1 fqdn2" 一份與PLS相關的完全限定網域名稱的空格分隔清單。 選用 []
service.beta.kubernetes.io/azure-pls-proxy-protocol "true" 或 "false" 布林值,指出是否應該在 PLS 上啟用 TCP PROXY 通訊協定,以傳遞連線資訊,包括連結識別碼和來源 IP 位址。 後端服務必須支援 PROXY 協定,否則連線會失敗。 選用 false
service.beta.kubernetes.io/azure-pls-visibility "sub1 sub2 sub3 … subN" 或 "*" 一個空間分隔的 Azure 訂閱 ID 清單,其中 Private Link 服務可見。 使用 "*" 向全部子項目公開 PLS (限制最少)。 選用 僅有角色基礎存取控制的空清單[]:此 Private Link 服務僅對擁有必要 Azure RBAC 權限的使用者開放,包括跨租戶的授權使用者。 (限制最多)
service.beta.kubernetes.io/azure-pls-auto-approval "sub1 sub2 sub3 … subN" 一份空格分隔的 Azure 訂閱 ID 清單,其 PE 連線請求會自動核准給 PLS。 自動核准清單必須是可見性清單的子集。 選用 []

使用內部負載平衡器搭配私有網路

當您建立 AKS 叢集時,可以指定進階網路設定。 這些設定可讓您將叢集部署到現有的 Azure 虛擬網路和子網路。 例如,您可以將 AKS 叢集部署到已連線到內部部署環境的私人網路,並執行只能在內部存取的服務。

如需詳細資訊,請參閱 使用 Kubenet 或 Azure CNI 設定您自己的虛擬網路子網路。

要在 AKS 叢集中部署使用私有網路的內部負載平衡器,您無需對前述步驟進行任何變更。 負載平衡器是在你的 AKS 叢集節點資源群組中建立,並連接到你的私人虛擬網路和子網,如下範例所示:

kubectl get service internal-app

NAME           TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
internal-app   LoadBalancer   10.1.15.188   10.0.0.35     80:31669/TCP   1m

附註

AKS 叢集使用的叢集身分識別至少必須在虛擬網路資源上具有網路參與者角色。 您可以使用 az aks show 命令來檢視叢集身分識別,例如 az aks show --resource-group <resource-group-name> --name <cluster-name> --query "identity"。 您可以使用 az role assignment create 命令來指派網路參與者角色,例如 az role assignment create --assignee <identity-resource-id> --scope <virtual-network-resource-id> --role "Network Contributor"。

如果您想要改為定義自訂角色,則需要下列權限:

  • Microsoft.Network/virtualNetworks/subnets/join/action
  • Microsoft.Network/virtualNetworks/subnets/read

如需詳細資訊,請參閱新增、變更或刪除虛擬網路子網路。

指定不同的子網路

新增 azure-load-balancer-internal-subnet 註釋至您的服務,以指定負載平衡器的子網路。 指定的子網路必須位於與您的 AKS 叢集相同的虛擬網路中。 部署後,負載平衡器 EXTERNAL-IP 位址會是所指定子網路的一部分。

apiVersion: v1
kind: Service
metadata:
  name: internal-app
  annotations:
    service.beta.kubernetes.io/azure-load-balancer-internal: "true"
    service.beta.kubernetes.io/azure-load-balancer-internal-subnet: "apps-subnet"
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: internal-app

將註解值設 service.beta.kubernetes.io/azure-load-balancer-internal-subnet 為子網名稱串,例如 "apps-subnet"。

刪除負載平衡器

當你刪除所有 Kubernetes 服務時,負載平衡器也會被刪除。

您也可以如同刪除任何 Kubernetes 資源 (例如 kubectl delete service internal-app) 一樣,直接刪除該服務,這也會刪除基礎的 Azure 負載平衡器。

後續步驟

如需深入了解 Kubernetes 服務,請參閱 Kubernetes 服務文件。