分享方式:


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

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

注意

Azure Load Balancer 有兩種 SKU -「基本」和「標準」。 建立 AKS 叢集時,預設使用標準 SKU。 您建立 LoadBalancer 服務類型時,您會取得與佈建叢集時相同的負載平衡器類型。 如需詳細資訊,請參閱 Azure Load Balancer SKU 比較

開始之前

建立內部負載平衡器

  1. 使用服務類型 LoadBalancerazure-load-balancer-internal 註釋建立名為 internal-lb.yaml 的服務資訊清單。

    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 叢集相同的虛擬網路,但不可已指派給虛擬網路中的另一個資源。 例如,不應使用為 AKS 叢集內 Kube 子網路所指定範圍內的 IP 位址。 使用已指派給相同虛擬網路中另一個資源的 IP 位址,可能導致負載平衡器發生問題。

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

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

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

重要

LoadBalancerIP 屬性新增至負載平衡器 YAML 資訊清單即將淘汰下列上游 Kube。 雖然目前的使用量將維持不變,且現有服務繼續運作,不需修改,但我們仍強烈建議設定服務註釋

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

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

開始之前

  1. 使用服務類型 LoadBalancer 以及 azure-load-balancer-internalazure-pls-create 註釋,建立名為 internal-lb-pls.yaml 的服務資訊清單。 如需其他選項,請參閱 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 服務物件,連線到與 Kube 服務相關聯的 Load Balancer 前端 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 Service 物件的詳細資料。

    # 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 服務,以私人方式連線到 Kube 服務物件。

  • 使用 az network private-endpoint create 命令建立私人端點。

    # Create a variable for the private link service
    
    AKS_PLS_ID=$(az network private-link-service list -g $AKS_MC_RG --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 自訂

以下是可用來自訂 PLS 資源的註釋。

註釋 Description 是必要欄位 預設
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 的子網路。 此子網路必須存在於與後端集區相同的 VNet 中。 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 總數不應大於 service.beta.kubernetes.io/azure-pls-ip-configuration-ip-address-count 中指定的 IP 計數。 如果指定的 IP 較少,則會動態配置其餘的 IP。 清單中的第一個 IP 會設定為 Primary 選擇性 全部 IP 都會動態配置。
service.beta.kubernetes.io/azure-pls-fqdns "fqdn1 fqdn2" 將與 fqdns 相關聯的 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 訂用帳戶識別碼列出的空格分隔清單。 使用 "*" 向全部子項目公開 PLS (限制最少)。 選擇性 空清單 [] 僅指出角色型存取控制:只有您目錄中具備角色型存取控制權限的人,才能使用此私人連結服務。 (限制最多)
service.beta.kubernetes.io/azure-pls-auto-approval "sub1 sub2 sub3 … subN" Azure 訂用帳戶識別碼的空格分隔清單。 因此從列出的訂用帳戶到 PLS 的 PE 連線要求能夠自動核准。 只有在可見性設定為「*」時,才能運作。 選擇性 []

使用私人網路

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

如需詳細資訊,請參閱使用 KubenetAzure 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
    

刪除負載平衡器

刪除全部服務時,會刪除負載平衡器。

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

下一步

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