使用 Azure Kubernetes Fleet Manager 进行基于 DNS 的多群集负载均衡(预览版)

Azure Kubernetes Fleet Manager 可用于为跨成员群集部署的面向公众的工作负荷创建和管理基于 DNS 的多群集负载均衡。

重要

Azure Kubernetes 舰队管理器预览功能可以通过自助服务方式选择性启用。 预览版按“现状”和“视供应情况”提供,它们不包括在服务级别协议和有限保证范围内。 客户支持部门会尽力为 Azure Kubernetes 舰队管理器预览功能提供部分支持。 因此,这些功能并不适合用于生产。

我们的数据平面网络预览版通过 networking.fleet.azure.cn/v1beta1 API 发布。 如果未看到预览对象,请检查是否在与 Fleet Manager 中心群集交互时请求 networking.fleet.azure.com/v1beta1 API。

此图概述了 Fleet Manager 如何使用 Azure Traffic Manager 和 Kubernetes ServiceExport 资源支持跨三个成员群集的 DNS 负载均衡。

为了通过 DNS 提供多群集公共负载均衡,Fleet Manager 使用具有加权路由配置文件Azure 流量管理器充当从成员群集导出的Services前端。 可以将此功能用于第 4 层和第 7 层负载均衡。

机队管理员使用kubectl在 Fleet Manager 中心群集上创建和配置TrafficManagerProfileTrafficManagerBackend资源。 TrafficManagerProfile 定义一个包含终结点运行状况监视配置的 Azure 流量管理器配置文件,关联的 TrafficManagerBackend 定义要进行负载均衡的 Service

成员群集上的服务可以通过在群集上创建 ServiceExport 并配置唯一的 ServiceDNS 主机名来添加到负载均衡中。 可以定义可选权重,以配置群集之间的流量路由行为。 如果使用舰队管理器的群集资源放置部署工作负荷,则可使用 ResourceOverride 在放置上配置 DNS 主机名。

关联的流量管理器的创建和配置由 Fleet Manager 管理,车队管理员能够使用 Kubernetes API 推动端到端体验。

TrafficManagerProfile 属性

TrafficManagerProfile 资源提供标准 Azure 流量管理器配置文件的 Kubernetes 对象表示形式。

apiVersion: networking.fleet.azure.com/v1beta1
kind: TrafficManagerProfile
metadata:
  name: myatm
  namespace: work
spec:
  monitorConfig:
    protocol: HTTP
    path: /api
    port: 8080
    intervalInSeconds: 30
    timeoutInSeconds: 10
    toleratedNumberOfFailures: 3

要了解的重要属性包括:

  • name:用作 trafficmanager.cn DNS 名称的 DNS 前缀。 它必须唯一。 如果名称已在使用中,部署将失败。
  • namespace:必须与相应的TrafficManagerBackendService资源相同。
  • monitorCOnfig:映射到标准 Azure 流量管理器监视配置。 不支持的 Azure 流量管理器终结点监视选项包括:自定义标头设置;预期状态代码。

TrafficManagerBackend 属性

TrafficManagerBackend 资源提供一个 Kubernetes 对象,用于存储流量管理器可以考虑接收流量的后端终结点。 在将流量路由到终结点之前,必须创建一个ServiceExport

apiVersion: networking.fleet.azure.com/v1beta1
kind: TrafficManagerBackend
metadata:
  name: app
  namespace: work
spec:
  profile:
    name: myatm
  backend:
    name: app
  weight: 100

要了解的重要属性包括:

  • spec/profile/name 必须与对应的 TrafficManagerProfile 匹配。
  • spec/backend/name:必须与导出的服务名称匹配才能进行负载均衡。
  • spec/weight:适用于此后端的可选的权重(优先级)。 介于 0 和 1,000 之间的整数值。 如果省略,流量管理器使用默认权重“1”。 设置为“0”可禁用流量路由,而无需删除关联的流量管理器配置文件资源。 有关详细信息,请参阅 Azure 流量管理器加权路由方法

ServiceExport 属性

若要为流量管理器添加 Service 终结点,请在成员群集中创建包含服务的 ServiceExport 资源。 必须在与要导出的 ServiceExport 相同的命名空间中创建 Service 资源。

apiVersion: networking.fleet.azure.com/v1alpha1
kind: ServiceExport
metadata:
  name: kuard-export
  namespace: kuard-demo
  annotations:
    networking.fleet.azure.com/weight: "50"

要了解的重要属性包括:

  • metadata/namespace:必须与要导出的 Service 命名空间匹配。
  • metadata/annotations/networking.fleet.azure.com/weight:应用于此服务导出时可选的权重或优先级。 介于 0 和 1,000 之间的整数值。 如果省略,流量管理器使用默认权重“1”。 设置为“0”可禁用流量路由,而无需删除关联的服务终结点。 有关详细信息,请参阅 Azure 流量管理器加权路由方法

通过服务标注获取唯一的 DNS 主机名

若要向流量管理器添加 a Service ,它必须具有唯一的 DNS 主机名。 可以按照 AKS 推荐的方法使用如图所示的 service.beta.kubernetes.io/azure-dns-label-name 注释来设置 DNS 主机名。

apiVersion: v1
kind: Service
metadata:
  name: kuard-svc
  namespace: kuard-demo
  labels:
    app: kuard
  annotations:
    service.beta.kubernetes.io/azure-dns-label-name: kuard-demo-cluster-01
spec:
  selector:
    app: kuard
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: LoadBalancer

可以使用 Fleet Manager 功能中的 ResourceOverride 来重写 DNS 标签注释,从而能够在多个群集上部署唯一的主机名。 有关详细信息,请参阅 DNS 负载均衡作指南

控制流量路由

在本部分中,我们将介绍控制群集之间的流量路由的常见方案。

在群集之间分配流量

若要允许流量管理器考虑接收流量的任何群集,请使用所示的定义。

  1. 创建 TrafficManagerBackend 资源并省略 weight 属性。

    apiVersion: networking.fleet.azure.com/v1beta1
    kind: TrafficManagerBackend
    metadata:
      name: app
      namespace: work
    spec:
      profile:
        name: myatm
      backend:
        name: app
    
  2. 在每个群集上,创建ServiceExport并省略weight属性。

    apiVersion: networking.fleet.azure.com/v1alpha1
    kind: ServiceExport
    metadata:
      name: kuard-export
      namespace: kuard-demo
    

部署后,流量管理器会随机选取一个群集,考虑到权重相等的所有群集。

在不同权重的群集之间分配流量

若要在选择群集时向流量管理器提供偏好提示,请在 weightTrafficManagerBackend 对象上设置 ServiceExport 属性。

  1. 创建 TrafficManagerBackend 资源并将属性设置为 weight100.

    apiVersion: networking.fleet.azure.com/v1beta1
    kind: TrafficManagerBackend
    metadata:
      name: app
      namespace: work
    spec:
      profile:
        name: myatm
      backend:
        name: app
      weight: 100
    
  2. 创建一个 ServiceExport 并将 weight 属性设置为一个值,该值代表流量管理器在考虑群集接受流量时应使用的优先级。

    apiVersion: networking.fleet.azure.com/v1alpha1
    kind: ServiceExport
    metadata:
      name: kuard-export
      namespace: kuard-demo
      annotations:
        networking.fleet.azure.com/weight: "40"
    

部署后,流量管理器将优先选择权重较高的群集。 无需在每个群集上设置权重值。 如果在多个群集上设置权重值相同,流量管理器将同样考虑这些群集。

从流量路由中排除集群

若要从流量路由中排除群集,请在weight资源上将0属性设置为ServiceExport。 此权重会将端点从流量管理器配置中删除。

apiVersion: networking.fleet.azure.com/v1alpha1
kind: ServiceExport
metadata:
  name: kuard-export
  namespace: kuard-demo
  annotations:
    networking.fleet.azure.com/weight: "0"

TrafficManagerProfile 删除行为

TrafficManagerProfile删除 Kubernetes 资源时,也会删除关联的 Azure 流量管理器及其终结点,并且不再将请求路由到群集。

如果想要停止流量路由,但保留 Azure 流量管理器及其终结点,请在weight资源上将0属性设置为TrafficManagerBackend

后续步骤