跨 Azure Kubernetes 舰队管理器成员群集设置多群集第 4 层负载均衡(预览版)

对于跨多个群集部署的应用程序,管理员通常希望跨群集将传入流量路由到它们。

可以按照本文档操作,为此类多群集应用程序设置第 4 层负载均衡。

重要

Azure Kubernetes 舰队管理器预览功能是可选择启用的自助功能。 预览功能是“按现状”和“按可用”提供的,不包括在服务级别协议和有限保证中。 客户支持部门会尽力为 Azure Kubernetes 舰队管理器预览功能提供部分支持。 因此,这些功能并不适合用于生产。

先决条件

如果没有 Azure 试用版订阅,请在开始前创建一个试用版订阅

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

  • 必须具有包含一个中心群集和多个成员群集的舰队资源。 如果没有此资源,请按照快速入门:创建舰队资源并加入成员群集进行操作。

  • 部署了工作负载的目标 Azure Kubernetes 服务 (AKS) 群集需位于同一虚拟网络对等虚拟网络

  • 必须按照访问舰队资源的 Kubernetes API 中的步骤获取中心群集 Kubernetes API 的访问权限。

  • 设置以下环境变量并获取舰队和所有成员群集的 kubeconfig:

    export GROUP=<resource-group>
    export FLEET=<fleet-name>
    export MEMBER_CLUSTER_1=aks-member-1
    export MEMBER_CLUSTER_2=aks-member-2
    
    az fleet get-credentials --resource-group ${GROUP} --name ${FLEET} --file fleet
    
    az aks get-credentials --resource-group ${GROUP} --name ${MEMBER_CLUSTER_1} --file aks-member-1
    
    az aks get-credentials --resource-group ${GROUP} --name ${MEMBER_CLUSTER_2} --file aks-member-2
    

可以使用本地 Azure CLI。

  • 如果需要,请安装 Azure CLI 来运行 CLI 参考命令。

  • 本地 Azure CLI,请了解如何安装 Azure CLI。 如果在 Windows 或 macOS 上运行,请考虑在 Docker 容器中运行 Azure CLI。 有关详细信息,请参阅如何在 Docker 容器中运行 Azure CLI

    • 通过使用 az login 命令登录到 Azure CLI。 若要完成身份验证过程,请遵循终端中显示的步骤。 有关其他登录选项,请参阅使用 Azure CLI 登录

    • 出现提示时,请在首次使用时安装 Azure CLI 扩展。 有关扩展详细信息,请参阅使用 Azure CLI 的扩展

    • 运行 az version 以查找安装的版本和依赖库。 若要升级到最新版本,请运行 az upgrade

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

注意

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

  • 这些步骤使用 Kubernetes 配置传播将示例工作负载从舰队群集部署到成员群集。 另外,可以选择将这些 Kubernetes 配置分别部署到每个成员群集(一次部署到一个群集)。

  1. 在舰队群集上创建命名空间:

    KUBECONFIG=fleet kubectl create namespace kuard-demo
    

    输出与以下示例类似:

    namespace/kuard-demo created
    
  2. 应用部署对象、服务对象、ServiceExport 对象:

    KUBECONFIG=fleet kubectl apply -f https://raw.githubusercontent.com/Azure/AKS/master/examples/fleet/kuard/kuard-export-service.yaml
    

    上述文件中的 ServiceExport 规范允许将服务从成员群集导出到舰队资源。 成功导出后,服务及其所有终结点会同步到舰队群集,然后用于跨这些终结点设置多群集负载均衡。 输出与以下示例类似:

    deployment.apps/kuard created
    service/kuard created
    serviceexport.networking.fleet.azure.com/kuard created
    
  3. 在名为 crp-2.yaml 的文件中创建以下 ClusterResourcePlacement。 请注意,我们要选择 chinanorth3 区域中的群集:

    apiVersion: placement.kubernetes-fleet.io/v1beta1
    kind: ClusterResourcePlacement
    metadata:
      name: kuard-demo
    spec:
      resourceSelectors:
        - group: ""
          version: v1
          kind: Namespace
          name: kuard-demo
      policy:
        affinity:
          clusterAffinity:
            requiredDuringSchedulingIgnoredDuringExecution:
              clusterSelectorTerms:
                - labelSelector:
                    matchLabels:
                    fleet.azure.cn/location: chinanorth
    
  4. 应用 ClusterResourcePlacement

    KUBECONFIG=fleet kubectl apply -f crp-2.yaml
    

    如果成功,会显示类似于以下示例的输出:

    clusterresourceplacement.placement.kubernetes-fleet.io/kuard-demo created
    
  5. 请检查 ClusterResourcePlacement 的状态:

    KUBECONFIG=fleet kubectl get clusterresourceplacements
    

    如果成功,会显示类似于以下示例的输出:

    NAME            GEN   SCHEDULED   SCHEDULEDGEN   APPLIED   APPLIEDGEN   AGE
    kuard-demo      1     True        1              True      1            20s
    

创建 MultiClusterService 以在多个成员群集中跨服务终结点进行负载均衡

  1. 检查是否已为eastus区域中的成员群集成功导出服务:

    KUBECONFIG=aks-member-1 kubectl get serviceexport kuard --namespace kuard-demo
    

    输出与以下示例类似:

    NAME    IS-VALID   IS-CONFLICTED   AGE
    kuard   True       False           25s
    
    KUBECONFIG=aks-member-2 kubectl get serviceexport kuard --namespace kuard-demo
    

    输出与以下示例类似:

    NAME    IS-VALID   IS-CONFLICTED   AGE
    kuard   True       False           55s
    

    你应看到该服务对导出有效(IS-VALID 字段为 true)并且与其他导出没有冲突(IS-CONFLICT 字段为 false)。

    注意

    传播 ServiceExport 可能需要一两分钟。

  2. 在一个成员上创建MultiClusterService,以在这些群集中跨服务终结点进行负载均衡:

    KUBECONFIG=aks-member-1 kubectl apply -f https://raw.githubusercontent.com/Azure/AKS/master/examples/fleet/kuard/kuard-mcs.yaml
    

    注意

    若要通过内部 IP 而不是公共 IP 来公开服务,请将注释添加到 MultiClusterService:

    apiVersion: networking.fleet.azure.com/v1alpha1
    kind: MultiClusterService
    metadata:
      name: kuard
      namespace: kuard-demo
      annotations:
         service.beta.kubernetes.io/azure-load-balancer-internal: "true"
      ...
    

    输出与以下示例类似:

    multiclusterservice.networking.fleet.azure.com/kuard created
    
  3. 运行以下命令,验证 MultiClusterService 是否有效:

    KUBECONFIG=aks-member-1 kubectl get multiclusterservice kuard --namespace kuard-demo
    

    输出应类似于以下示例:

    NAME    SERVICE-IMPORT   EXTERNAL-IP     IS-VALID   AGE
    kuard   kuard            <a.b.c.d>       True       40s
    

    输出中的 IS-VALID 字段应为 true。 查看输出中的外部负载均衡器 IP 地址 (EXTERNAL-IP)。 可能需要一段时间才能完全处理导入并使用 IP 地址。

  4. 使用外部负载均衡器 IP 地址多次运行以下命令:

    curl <a.b.c.d>:8080 | grep addrs 
    

    请注意,为请求提供服务的 pod 的 IP 正在发生变化,并且这些 pod 来自 chinanorth3 区域的成员群集 aks-member-1aks-member-2。 可以通过在 chinanorth 区域的群集上运行以下命令来验证 pod IP:

    KUBECONFIG=aks-member-1 kubectl get pods -n kuard-demo -o wide
    
    KUBECONFIG=aks-member-2 kubectl get pods -n kuard-demo -o wide