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

适用于:✔️具有中心群集的 Fleet Manager

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 流量管理器 和 Kubernetes ServiceExport 资源支持跨三个成员群集的 DNS 负载均衡。

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

机队管理员使用kubectl在 Fleet Manager 中心群集上创建和配置TrafficManagerProfile和TrafficManagerBackend资源。 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
    

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

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

若要在选择群集时向流量管理器提供偏好提示,请在 weight 和 TrafficManagerBackend 对象上设置 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。

后续步骤