使用包含 Azure Kubernetes 服务 (AKS) 的内部负载均衡器

可以创建和使用内部负载均衡器来限制访问 Azure Kubernetes 服务 (AKS) 中的应用程序。 内部负载均衡器没有公共 IP,这使得 Kubernetes 服务只能由可以访问专用 IP 的应用程序访问。 这些应用程序可以位于同一 VNET 中,也可以在另一个 VNET 中(通过 VNET 对等互连实现)。 本文介绍如何通过 AKS 创建和使用内部负载均衡器。

注意

Azure 负载均衡器以两种 SKU 提供:“基本”和“标准”。 默认情况下,创建 AKS 群集时将使用标准 SKU。 创建 LoadBalancer 服务类型时,你将获得与预配群集时相同的负载均衡器类型。 有关详细信息,请参阅 Azure 负载均衡器 SKU 比较

准备阶段

创建内部负载均衡器

  1. 创建名为 internal-lb.yaml 的服务清单,具有服务类型 LoadBalancerazure-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 群集位于同一虚拟网络中,但不能已经将其分配给虚拟网络中的另一个资源。 例如,不应使用为 AKS 群集中 Kubernetes 子网指定的范围内的 IP 地址。 使用已分配给同一虚拟网络中另一资源的 IP 地址可能会导致负载均衡器出现问题。

可以使用 az network vnet subnet list Azure CLI 命令或 Get-AzVirtualNetworkSubnetConfig PowerShell cmdlet 获取虚拟网络中的子网。

有关子网的详细信息,请参阅添加具有唯一子网的节点池

若要对内部负载均衡器使用特定的 IP 地址,有两个选项:设置服务注释或添加 loadBalancerIP 属性到负载均衡器 YAML 清单。

重要

将 LoadBalancerIP 属性添加到负载均衡器 YAML 清单将弃用以下上游 Kubernetes。 虽然当前使用情况保持不变,并且现有服务无需修改即可正常工作,但我们强烈建议改为设置服务注释。

  1. service.beta.kubernetes.io/azure-load-balancer-ipv4service.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
    
  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. 创建名为 internal-lb-pls.yaml 的服务清单,具有服务类型 LoadBalancerazure-load-balancer-internalazure-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
    
  2. 使用 kubectl apply 命令部署内部负载均衡器。 此命令在节点资源组中创建了一个 Azure 负载均衡器,该资源组连接到与 AKS 群集相同的虚拟网络。 它还创建了专用链接服务对象,连接到与 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 命令查看 专用链接服务对象的详细信息。

    # 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 自定义

以下是可用于自定义 PLS 资源的注释。

Annotation 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 群集部署到连接到本地环境的专用网络,并运行仅在内部可访问的服务。

有关详细信息,请参阅使用 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 服务文档