你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

跨 Azure Kubernetes Fleet Manager 成员群集设置 DNS 负载均衡(预览版)

Azure Kubernetes Fleet Manager DNS 负载均衡可帮助提高可用性,并将负载分散到跨多个成员群集部署的工作负荷。 由于此功能是通过 DNS 传递的,因此可以根据需要提供第 4 层和第 7 层负载均衡。

按照本文档中的步骤为车队中托管的多群集应用程序设置基于 DNS 的负载均衡。

重要

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

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

先决条件

如果没有 Azure 帐户,请在开始前创建一个免费帐户

  • 阅读此功能的概念概述,其中对本文档中引用的TrafficManagerProfileTrafficManagerBackend对象进行了说明。

  • 具有中心群集和托管标识的 Kubernetes 舰队管理器。 如果没有,请参阅 使用 Azure CLI 创建 Azure Kubernetes Fleet Manager 并加入成员群集

  • 两个成员群集 aks-member-1aks-member-2,你可以使用舰队管理器的群集资源放置 (CRP) 在其上部署同一工作负荷。

  • 完成配置的用户有权执行 Azure 角色分配并访问 Fleet Manager 中心群集 Kubernetes API。 有关详细信息,请参阅 访问 Kubernetes API

  • 将托管预配的 Azure 流量管理器资源的现有 Azure 资源组。

  • 设置以下环境变量:

    export SUBSCRIPTION_ID=<subscription>
    export GROUP=<resource-group>
    export FLEET=<fleet-name>
    export MEMBER_CLUSTER_1=aks-member-1
    export MEMBER_CLUSTER_2=aks-member-2
    export TRAFFIC_MANAGER_GROUP=rg-flt-tm-demo
    export TRAFFIC_MANAGER_RG_ID="/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/${TRAFFIC_MANAGER_GROUP}
    
  • 获取用于访问 Fleet Manager 中心群集 Kubernetes API 的凭据:

    az fleet get-credentials \
        --resource-group ${GROUP} \
        --name ${FLEET}
    

配置 Fleet Manager 权限

在预览期间,需要执行额外的步骤,使 Fleet Manager 能够创建和管理 Azure 流量管理器资源,并获取成员群集上公开的服务的公共 IP 地址。

要完成此步骤,你必须创建启用了托管标识的车队管理器。 用户必须具有 Azure RBAC 角色分配权限。

  • 获取舰队管理器资源的标识信息。

    az fleet show \ 
        --resource-group ${GROUP} \
        --name ${FLEET} \
        --query identity
    

    输出应类似于示例输出:

    {
      "principalId": "<FLEET-PRINCIPAL-ID>",
      "tenantId": "<ENTRA-ID-TENANT>",
      "type": "SystemAssigned",
      "userAssignedIdentities": null
    }
    
  • Traffic Manager Contributor 角色分配给舰队管理器中心群集标识,将范围限制为创建流量管理器资源的现有资源组。

    az role assignment create \
        --assignee "<FLEET-PRINCIPAL-ID>" \
        --role "Traffic Manager Contributor" \
        --scope ${TRAFFIC_MANAGER_RG_ID}
    
  • 舰队管理器中心群集标识还需要任何成员群集的 Azure Reader 角色,这样舰队管理器就可以在通过 TrafficMangerBackend 将成员群集添加到 ServiceExport 时读取成员群集的公共 IP 地址。

    az role assignment create \
        --assignee "<FLEET-PRINCIPAL-ID>" \
        --role "Reader" \
        --scope /full/path/to/member-cluster
    

跨舰队资源的成员群集部署工作负载

注释

  • 本操作指南中的步骤适用于仅供演示的示例应用程序。 可以将此工作负载替换为自己现有的任何部署对象和服务对象。

  • 这些步骤使用 Fleet Manager 的群集资源放置(CRP)将示例工作负荷从 Fleet Manager 中心群集部署到成员群集。 另外,可以选择将这些 Kubernetes 配置分别部署到每个成员群集(一次部署到一个群集)。

  1. 在 Fleet Manager 中心群集上创建命名空间。

    kubectl create namespace kuard-demo
    

    输出类似于:

    namespace/kuard-demo created
    
  2. 通过将以下内容保存到名为 kuard-export-service.yaml 的文件,将部署、服务、ServiceExport 对象暂存到 Fleet Manager 中心群集:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: kuard
      namespace: kuard-demo
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: kuard
      template:
        metadata:
          labels:
            app: kuard
        spec:
          containers:
            - name: kuard
              image: gcr.io/kuar-demo/kuard-amd64:blue
              resources:
                requests:
                  cpu: 100m
                  memory: 128Mi
                limits:
                  cpu: 250m
                  memory: 256Mi
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: kuard-svc
      namespace: kuard-demo
      labels:
        app: kuard
    spec:
      selector:
        app: kuard
      ports:
        - protocol: TCP
          port: 80
          targetPort: 80
      type: LoadBalancer
    ---
    apiVersion: networking.fleet.azure.com/v1alpha1
    kind: ServiceExport
    metadata:
      name: kuard-export
      namespace: kuard-demo
      annotations:
        networking.fleet.azure.com/weight: "50"
    

    在 Fleet Manager 集群上部署对象:

    kubectl apply -f kuard-export-service.yaml
    

    此示例 ServiceExport 中的规范允许将服务从成员群集导出到 Fleet Manager 中心群集。 我们希望在两个群集之间均匀拆分流量,以便将 ServiceExport 权重批注设置为 50。 成功导出后,服务及其所有终结点将同步到 Fleet Manager 中心群集,然后可用于跨这些终结点设置 DNS 负载均衡。 输出与以下示例类似:

    deployment.apps/kuard created
    service/kuard-svc created
    serviceexport.networking.fleet.azure.com/kuard-export created
    
  3. 每个服务都需要一个唯一的 DNS 标签,以便可以通过 Azure 流量管理器公开它。 使用 Fleet Manager 群集资源放置 ResourceOverride 来修改每个成员群集的服务定义,以基于 Azure 区域和群集名称创建唯一名称。 需要为每个群集选择器(在我们的示例中为每个 Azure 区域)创建一个替代。

    apiVersion: placement.kubernetes-fleet.io/v1alpha1
    kind: ResourceOverride
    metadata:
     name: ro-kuard-demo-eastus
     namespace: kuard-demo
    spec:
     placement:
       name: crp-kuard-demo
     resourceSelectors:
       -  group: ""
          kind: Service
          version: v1
          name: kuard-svc
     policy:
       overrideRules:
         - clusterSelector:
             clusterSelectorTerms:
               - labelSelector:
                   matchLabels:
                     fleet.azure.com/___location: eastus
           jsonPatchOverrides:
             - op: add
               path: /metadata/annotations
               value:
                 {"service.beta.kubernetes.io/azure-dns-label-name":"fleet-${MEMBER-CLUSTER-NAME}-eastus"}
    

    注释

    “${MEMBER-CLUSTER-NAME}”是资源放置替代保留变量,在运行时会替换为成员群集的名称。

    kubectl apply -f ro-kuard-demo-eastus.yaml
    
  4. 在名为 的文件中创建以下 Fleet Manager crp-dns-demo.yaml(CRP)。 请注意,我们在 eastus 区域中选择最多两个群集:

    apiVersion: placement.kubernetes-fleet.io/v1
    kind: ClusterResourcePlacement
    metadata:
      name: crp-dns-demo
    spec:
      resourceSelectors:
        - group: ""
          version: v1
          kind: Namespace
          name: kuard-demo
      policy:
        placementType: PickN
        numberOfClusters: 2
        affinity:
          clusterAffinity:
            requiredDuringSchedulingIgnoredDuringExecution:
              clusterSelectorTerms:
                - labelSelector:
                    matchLabels:
                      fleet.azure.com/___location: eastus
    

    应用 CRP:

    kubectl apply -f crp-dns-demo.yaml
    

    如果成功,输出如下所示:

    clusterresourceplacement.placement.kubernetes-fleet.io/crp-dns-demo created
    

使用 Azure 流量管理器配置 DNS 负载均衡

  1. TrafficManagerProfile定义用于定义流量管理器要使用的参数并将其保存到文件中kuard-atm-demo.yaml

    apiVersion: networking.fleet.azure.com/v1beta1
    kind: TrafficManagerProfile
    metadata:
      name: kuard-atm-demo
      namespace: kuard-demo
    spec:
      resourceGroup: "rg-flt-tm-demo"
      monitorConfig:
        port: 80
    

    应用该配置:

    kubectl apply -f kuard-atm-demo.yaml
    
  2. 定义一个对应的TrafficManagerBackend,该项用于将从成员群集导出的Service条目组合在一起。

    apiVersion: networking.fleet.azure.com/v1beta1
    kind: TrafficManagerBackend
    metadata:
      name: kuard-atm-demo-backend
      namespace: kuard-demo
    spec:
      profile:
        name: "kuard-atm-demo"
      backend:
        name: "kuard-svc"
      weight: 100
    

    应用该配置:

    kubectl apply -f kuard-atm-demo-backend.yaml
    
  3. 运行以下命令,通过 Azure 流量管理器验证该服务是否可用:

    nslookup kuard-atm-demo.trafficmanager.net
    

    输出应类似于以下示例:

    Server:         10.X.X.254
    Address:        10.X.X.254#53
    
    Non-authoritative answer:
    Name:   kuard-atm-demo.trafficmanger.net
    Address: 123.X.X.16
    Name:   kuard-atm-demo.trafficmanger.net
    Address: 74.X.X.78
    Name:   kuard-atm-demo.trafficmanger.net
    Address: 173.X.X.164
    
  4. 使用 Web 浏览器访问 URL 并查看 Kuard 如何响应。 尝试刷新 DNS 并重试,以查看是否从另一个群集为另一个服务实例提供服务。

显示 Kuard 演示应用程序中详细信息的网页的屏幕截图。