您可以建立和使用內部負載平衡器,以限制存取您在 Azure Kubernetes Service (AKS) 中的應用程式。 內部負載平衡器沒有公用 IP,而且只能讓可連線到私人 IP 的應用程式存取 Kubernetes 服務。 這些應用程式可以在同一個虛擬網路內,或透過虛擬網路對等連線存在於另一個虛擬網路中。 本文說明如何在 AKS 中建立和使用內部負載平衡器。
重要事項
自 2025 年 9 月 30 日起,Azure Kubernetes 服務(AKS)不再支援基本負載平衡器。 為避免潛在服務中斷,我們建議新部署使用標準負載平衡器,並將 現有部署升級為標準負載平衡器。 欲了解更多退休資訊,請參閱 退休 GitHub 問題 及 Azure 更新退休公告。 想隨時掌握公告與更新,請參考 AKS 發布公告。
開始之前
- 本文假設您目前具有 AKS 叢集。 如果您需要 AKS 叢集,則可以使用 Azure CLI、Azure PowerShell 或 Azure 入口網站 來建立。
- 您需要 Azure CLI 2.0.59 版或更新版本。 執行
az --version以尋找版本。 如果您需要安裝或升級,請參閱安裝 Azure CLI。 - 如果要使用現有的子網路或資源群組,AKS 叢集身分識別需要權限以管理網路資源。 如需詳細資訊,請參閱 在 AKS 中設定 Azure CNI 網路。 如果你設定負載平衡器使用 不同子網的 IP 位址,請確保 AKS 叢集身份也能
Read存取該子網路。- 如需權限的詳細資訊,請參閱將 AKS 存取權委派給其他 Azure 資源。
建立內部負載平衡器
建立名為
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使用
kubectl apply命令部署內部負載平衡器。 此命令會在節點資源群組中建立 Azure 負載平衡器,並將其連線到與 AKS 叢集相同的虛擬網路。kubectl apply -f internal-lb.yaml使用
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。
設定服務註釋,讓 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使用
kubectl get service命令檢視服務詳細資料。kubectl get service internal-appEXTERNAL-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
如需在不同子網路中設定負載平衡器的詳細資訊,請參閱 指定不同的子網路。
Connect Azure Private Link Service to a AKS internal load balancer
Private Link 服務需求
- 你的叢集必須在 AKS 中執行支援的 Kubernetes 版本。
- 你的 AKS 叢集必須使用 Standard Load Balancer 與
nodeIPConfiguration後端池類型。 Private Link Service 不支援 Basic Load Balancer 或基於nodeIPIP 的後端池類型。 欲了解更多資訊,請參閱 Private Link 服務限制。 - 你需要一個現有的資源群組,包含虛擬網路和子網路。 此資源群組是您建立私人端點的位置。 如果您沒有這些資源,請參閱建立虛擬網路和子網路。
重要事項
Private Link 服務有以下限制:
- Private Link 服務僅支援 IPv4 流量,且僅支援 TCP 和 UDP 傳輸協定。
- 若服務使用
externalTrafficPolicy: Local,則 Private Link Service 子網必須與 pod 子網不同。 若要使用相同的子網路,請設externalTrafficPolicy為Cluster。 - 如果你啟用 PROXY 協定並使用
externalTrafficPolicy: Local,必須設定自訂健康探針,因為預設健康探針會失敗。
欲了解更多資訊,請參閱 Private Link 服務限制與 Azure Private Link 服務整合限制。
建立 Private Link 服務連線
建立名為
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使用
kubectl apply命令部署內部負載平衡器。 此命令會在節點資源群組中建立 Azure 負載平衡器,並將其連線到與 AKS 叢集相同的虛擬網路。 同時也會建立一個 Private Link Service 物件,連接至 Kubernetes 服務物件所關聯的內部負載平衡器的前端 IP 設定。kubectl apply -f internal-lb-pls.yaml使用
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使用
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 服務
私人端點可讓您透過您建立的 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
Private Link 服務透過註解的自訂
您可以使用下列註解來自訂 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/actionMicrosoft.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 服務文件。