使用包含 Azure Kubernetes 服务 (AKS) 的内部负载均衡器
可以创建和使用内部负载均衡器来限制访问 Azure Kubernetes 服务 (AKS) 中的应用程序。 内部负载均衡器没有公共 IP,这使得 Kubernetes 服务只能由可以访问专用 IP 的应用程序访问。 这些应用程序可以位于同一 VNET 中,也可以在另一个 VNET 中(通过 VNET 对等互连实现)。 本文介绍如何通过 AKS 创建和使用内部负载均衡器。
重要
2025 年 9 月 30 日,基本负载均衡器将停用。
- 本文假定你拥有现有的 AKS 群集。 如果需要 AKS 群集,可以使用 Azure CLI、Azure PowerShell 或 Azure 门户创建一个。
- 需要 Azure CLI 版本 2.0.59 或更高版本。 运行
az --version
即可查找版本。 如果需要进行安装或升级,请参阅安装 Azure CLI。 - 如果你要使用现有的子网或资源组,则 AKS 群集的群集标识需要管理网络资源的权限。 有关信息,请参阅在 AKS 中将 kubenet 网络与你自己的 IP 地址范围配合使用或在 AKS 中配置 Azure CNI 网络。 若要将负载均衡器配置为使用不同子网中的 IP 地址,请确保 AKS 群集标识也具有对该子网的读取访问权限。
- 有关权限的详细信息,请参阅委派 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 地址必须与 AKS 群集位于同一虚拟网络中,但不能已经将其分配给虚拟网络中的另一个资源。 例如,不应使用为 AKS 群集中 Kubernetes 子网指定的范围内的 IP 地址。 使用已分配给同一虚拟网络中另一资源的 IP 地址可能会导致负载均衡器出现问题。
可以使用 az network vnet subnet list
Azure CLI 命令或 Get-AzVirtualNetworkSubnetConfig
PowerShell cmdlet 获取虚拟网络中的子网。
有关子网的详细信息,请参阅添加具有唯一子网的节点池。
若要对内部负载均衡器使用特定的 IP 地址,有两个选项:设置服务注释或添加 loadBalancerIP 属性到负载均衡器 YAML 清单。
重要
将 LoadBalancerIP 属性添加到负载均衡器 YAML 清单将弃用以下上游 Kubernetes。 虽然当前使用情况保持不变,并且现有服务无需修改即可正常工作,但我们强烈建议改为设置服务注释。
将
service.beta.kubernetes.io/azure-load-balancer-ipv4
和service.beta.kubernetes.io/azure-load-balancer-ipv6
分别用于 IPv4 地址和 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-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
若要详细了解如何在不同的子网中配置负载均衡器,请参阅指定不同的子网。
创建名为
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
命令创建专用终结点。# 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 资源:
注释 | Value | 说明 | 需要 | 默认 |
---|---|---|---|---|
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" |
与 PLS 关联的 fqdn 的空格分隔列表。 | 可选 | [] |
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(限制最少)。 |
可选 | 空列表 [] ,指示仅限基于角色的访问控制:只有在目录中具有基于角色的访问控制权限的个人才可以使用此专用链接服务。 (限制最大) |
service.beta.kubernetes.io/azure-pls-auto-approval |
"sub1 sub2 sub3 … subN" |
Azure 订阅 ID 的空格分隔列表。 这样就可以自动批准从列出的订阅到 PLS 的 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 群集使用的群集标识在虚拟网络中上必须至少具有网络参与者角色。 可以使用 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 服务文档。