可以创建和使用内部负载均衡器来限制访问 Azure Kubernetes 服务 (AKS) 中的应用程序。 内部负载均衡器没有公共 IP,这使得 Kubernetes 服务只能由可以访问专用 IP 的应用程序访问。 这些应用程序可以位于同一虚拟网络中,也可以通过虚拟网络对等连接在另一个虚拟网络中。 本文介绍如何通过 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 地址,您有两个选项:设置服务注释,或在负载均衡器 YAML 清单中添加 LoadBalancerIP 属性。
重要
遵循LoadBalancerIP 的做法,向负载均衡器 YAML 清单中添加 属性这一做法将被弃用。 虽然当前使用情况保持不变,并且现有服务无需修改即可正常工作,但我们强烈建议改为设置服务注释。 有关服务注释的详细信息,请参阅Azure 负载均衡器支持的批注。
使用
service.beta.kubernetes.io/azure-load-balancer-ipv4为 IPv4 地址设置服务注释,使用service.beta.kubernetes.io/azure-load-balancer-ipv6为 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
若要详细了解如何在不同的子网中配置负载均衡器,请参阅指定不同的子网。
将Azure 专用链接服务连接到 AKS 内部负载均衡器
专用链接服务要求
- 群集必须在 AKS 中运行受支持的 Kubernetes 版本。
- AKS 群集必须使用采用
nodeIPConfiguration后端池类型的标准负载均衡器。 专用链接 服务不支持 Basic 负载均衡器 或基于 IP 的nodeIP后端池类型。 有关详细信息,请参阅专用链接服务限制。 - 需要具有虚拟网络和子网的现有资源组。 将在该资源组中创建专用终结点。 如果没有这些资源,请参阅创建虚拟网络和子网。
重要
专用链接服务具有以下限制:
- 专用链接服务仅支持 IPv4 流量,并且仅支持 TCP 和 UDP 传输协议。
- 如果服务使用
externalTrafficPolicy: Local,专用链接服务子网必须与 Pod 子网不同。 若要使用相同的子网,请设置为externalTrafficPolicyCluster. - 如果启用 PROXY 协议并使用
externalTrafficPolicy: Local,则必须配置自定义运行状况探测,因为默认运行状况探测失败。
有关详细信息,请参阅专用链接服务限制和Azure 专用链接服务集成限制。
创建专用链接服务连接
创建名为
internal-lb-pls.yaml的服务清单,具有服务类型LoadBalancer和azure-load-balancer-internal及azure-pls-create注释。 有关更多选项,请参阅 Azure 专用链接服务集成设计文档。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 群集相同的虚拟网络。 它还创建一个专用链接服务对象,该对象连接到与 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命令查看 专用链接服务对象的详细信息。# 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
为专用链接服务创建专用终结点
使用专用终结点,你能够通过创建的专用链接服务以专用方式连接到你的 Kubernetes 服务对象。
使用 az network private-endpoint create 命令创建专用终结点。 将 pls-xyz 替换为上一步中返回的专用链接服务名称。
将 --resource-group 设置为要在其中创建专用终结点的目标资源组。 将 --vnet-name 和 --subnet 设置为包含专用终结点的虚拟网络和子网。 将 --private-connection-resource-id 设置为在 AKS_PLS_ID 中检索到的 专用链接 服务资源 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 资源进行自定义:
| 注释 | 价值 | 说明 | 必填 | 默认 |
|---|---|---|---|---|
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 总数不应大于 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" |
与 PLS 关联的完全限定域名列表,以空格分隔。 | 可选 | [] |
service.beta.kubernetes.io/azure-pls-proxy-protocol |
"true" 或 "false" |
布尔值,指示是否应在 PLS 上启用 TCP PROXY 协议来传递连接信息(包括链接 ID 和源 IP 地址)。 后端服务必须支持 PROXY 协议或连接失败。 | 可选 | false |
service.beta.kubernetes.io/azure-pls-visibility |
"sub1 sub2 sub3 … subN" 或 "*" |
可看到该 专用链接 服务的 Azure 订阅 ID 的空格分隔列表。 使用 "*" 将 PLS 向所有订阅开放(限制最宽松)。 |
可选 | 表示仅使用基于角色的访问控制的空列表 []:此专用链接服务仅对具有所需 Azure RBAC 权限的用户可用,包括跨租户的授权用户。 (限制最大) |
service.beta.kubernetes.io/azure-pls-auto-approval |
"sub1 sub2 sub3 … subN" |
Azure订阅 ID 的空格分隔列表,这些 ID 的 PE 连接请求会自动获得批准。 自动审批列表必须是可见性列表的子集。 | 可选 | [] |
将内部负载均衡器与专用网络配合使用
创建 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 群集使用的群集标识必须至少对虚拟网络资源具有 Network Contributor 角色。 可以使用 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 服务文档。