在 Azure Kubernetes 服务 (AKS) 中使用公共标准负载均衡器

Azure 负载均衡器在开放系统互连(OSI)模型的第 4 层运行,该模型同时支持入站和出站方案。 它将抵达负载均衡器前端的入站流量分配到后端池实例。

与 AKS 集成的公共负载均衡器有两个用途:

  • 为了为 AKS 虚拟网络(VNet)中的群集节点提供出站连接,可以通过将专用 IP 地址转换为其 出站池中的公共 IP 地址来实现。
  • 通过类型的 LoadBalancerKubernetes 服务提供对应用程序的访问,使你能够轻松缩放应用程序并创建高度可用的服务。

本文介绍与 AKS 上的公共负载均衡器的集成。 有关内部负载均衡器集成,请参阅 在 AKS 中使用内部负载均衡器

先决条件

  • Azure 负载均衡器以两种 SKU 提供:“基本”和“标准”。 默认情况下,创建 AKS 群集时将使用标准 SKU。 标准 SKU 允许你访问添加的功能,例如更大的后端池、多个节点池可用性区域并且默认是安全的。 这是推荐的 AKS 的负载均衡器 SKU。 有关 基本 SKU 和 标准 SKU 的详细信息,请参阅 Azure 负载均衡器 SKU 比较
  • 有关类型为 LoadBalancer 的 Kubernetes 服务支持的注释的完整列表,请参阅 LoadBalancer 注释
  • 本文假设已有一个 AKS 群集,其中包含标准 SKU Azure 负载均衡器。 如果需要 AKS 群集,可以使用 Azure CLIAzure PowerShellAzure 门户创建群集。

重要

如果想要使用自己的网关、防火墙或代理提供出站连接,则可以跳过创建负载均衡器出站池和相应的前端 IP,方法是使用出站类型作为 UserDefinedRouting (UDR)。 出站类型定义群集的出口方法,它默认为 LoadBalancer 类型。

限制

创建和管理支持标准 SKU 负载均衡器的 AKS 群集时存在以下限制:

  • AKS 管理代理节点的生命周期和操作。 不支持修改与代理节点关联的 IaaS 资源。 不支持的操作示例是对负载均衡器资源组进行手动更改。

  • 至少需要指定一个公共 IP 或 IP 前缀来允许 AKS 群集的出口流量。 此外,需要使用公共 IP 或 IP 前缀来保持控制平面与代理节点之间的连接,以及保持与旧版 AKS 的兼容性。 可以使用以下选项来指定 标准 SKU 负载均衡器的公共 IP 或 IP 前缀:

    • 提供自己的公共 IP。
    • 提供自己的公共 IP 前缀。
    • 指定一个数字,最大可以为 100,使 AKS 群集可以在其所在的资源组中创建该数量的标准 SKU 公共 IP。 此资源组通常以 MC_ 开头命名。 AKS 会将公共 IP 分配到标准 SKU 负载均衡器。 默认情况下,如果未指定公共 IP、公共 IP 前缀或 IP 数量,则会在 AKS 群集所在的资源组中自动创建一个公共 IP。 还必须允许公共地址,并避免创建任何禁止创建 IP 的 Azure 策略。
  • AKS 创建的公共 IP 不能作为自定义自带公共 IP 地址重复使用。 必须创建和管理所有自定义 IP 地址。

  • 只能在创建 AKS 群集时定义负载均衡器 SKU。 创建 AKS 群集后,无法更改负载均衡器 SKU。

  • 在单个群集中只能使用一种类型的负载均衡器 SKU (基本或标准)。

  • 标准 SKU 负载均衡器仅支持标准 SKU IP 地址。

  • 当负载均衡器后端池类型设置为 时,不支持nodeIP

在 AKS 中创建负载均衡器服务

创建出站类型为 LoadBalancer(默认)的 AKS 群集后,群集可以使用负载均衡器公开服务。

  • 创建名为 public-svc.yaml 的服务清单,用于创建类型为 LoadBalancer 的公共服务。

    apiVersion: v1
    kind: Service
    metadata:
      name: public-svc
    spec:
      type: LoadBalancer
      ports:
      - port: 80
      selector:
        app: public-app
    

指定负载均衡器 IP 地址

如果要将特定 IP 地址与负载均衡器一起使用,可以使用两个选项来指定 IP 地址:

  • 设置服务注解(推荐):service.beta.kubernetes.io/azure-load-balancer-ipv4 用于 IPv4 地址,service.beta.kubernetes.io/azure-load-balancer-ipv6 用于 IPv6 地址。
  • LoadBalancerIP 属性添加到负载均衡器 YAML 清单:将 Service.Spec.LoadBalancerIP 属性添加到负载均衡器 YAML 清单。 此字段因上游 Kubernetes 的最新变动被弃用,且不支持双堆栈。 当前使用情况保持不变,现有服务无需修改即可正常工作。

部署负载均衡器服务清单

  1. 使用 kubectl apply 部署公共服务清单,并指定 YAML 清单的名称。

    kubectl apply -f public-svc.yaml
    

    Azure 负载均衡器配置有一个面向新服务的新公共 IP。 由于 Azure 负载均衡器可以有多个前端 IP,因此部署的每个新服务都会获得唯一的专用前端 IP。

  2. 确认已创建服务,并使用命令配置 kubectl get service 负载均衡器。

    kubectl get service public-svc
    

    查看服务详细信息时,负载均衡器上为此服务创建的公共 IP 地址将显示在输出的 EXTERNAL-IP 列中。 将 IP 地址从 <待定> 更改为实际公共 IP 地址可能需要几分钟时间。 以下示例输出显示成功创建服务:

    NAMESPACE     NAME          TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)         AGE
    default       public-svc    LoadBalancer   10.0.39.110    203.0.113.187   80:32068/TCP    52s
    
  3. 使用 kubectl describe service 命令获取有关服务的详细信息。

    kubectl describe service public-svc
    

    以下示例输出是运行 kubectl describe service 后的精简版输出。 LoadBalancer 入口显示服务公开的外部 IP 地址。 IP 显示内部地址。

    Name:                        public-svc
    Namespace:                   default
    Labels:                      <none>
    Annotations:                 <none>
    Selector:                    app=public-app
    ...
    IP:                          10.0.39.110
    ...
    LoadBalancer Ingress:        203.0.113.187
    ...
    TargetPort:                  80/TCP
    NodePort:                    32068/TCP
    ...
    Session Affinity:            None
    External Traffic Policy:     Cluster
    ...
    

后续步骤