GKE 上的 Anthos Service Mesh 和 Istio Ingress Gateway - 这是多集群服务的正确解决方案吗?

问题描述 投票:0回答:1

我已使用 Anthos Service Mesh 在 GKE 上部署了多集群应用程序,但我对可用选项及其优缺点有一些疑问。我都已经测试过并正在工作,但需要帮助才能走得更远。我们需要对不同集群服务之间的流量进行一些额外的控制,因为我们希望仅在一个集群中部署某些服务,因为它们更接近部署在两个区域之一的主数据库。 理想配置示例(简化):

  • 两个集群中都部署了前端服务
  • Api服务仅部署在一个集群中
  • 来自外部负载均衡器的流量路由到最近的集群前端服务
  • 两个前端都连接到单个 Api 实例

这是我尝试过的:

  • 第一个解决方案(简单):部署 MultiClusterService 和 MultiClusterIngress 以公开两个 GKE 集群中部署的服务,以获得全局负载平衡,并将流量自动路由到最近的集群。 Api服务必须部署在两个集群中。该解决方案遵循此示例

  • 第二种解决方案(更难):使用部署在两个集群中的 istio-ingressgateway 来公开使用 VirtualService 和 DestinationRule Istio 配置的服务,然后公开全局 MultiClusterService 和 MultiClusterIngress 背后的网关。这种配置来自这个sample

第一个解决方案,不允许基于源、http 标头等管理细粒度的集群间服务流量,我的解决方案是在两个集群中部署所有服务,并且不知道如何管理服务的路由一个集群中的一个集群到另一个集群中的一个集群(前端 -> Api)(对此有什么建议吗?)

第二个解决方案允许服务间路由(使用 DestinationRule),但似乎缺少自动路由到最近集群的流量负载平衡,只有循环、最少连接和其他选项可用(请参阅Istio LB 选项)。 LocalityLBSetting 似乎可以工作,但配置两个区域和 6 个区域确实很困难并且是样板,而且同样缺少到最近集群的自动路由。 GKE 不接受源集群标签选项(Istio Partitioning Service),因为 topology.istio.io/cluster 无效,我不知道为什么。

在花费大量时间寻找有效或无效的方法之前,我的问题是:

  • 用于 Istio 网关、虚拟服务等的“apiVersion:networking.istio.io/v1alpha3”配置文件是否仍然有效,或者将来会从 GKE 中弃用(请参阅GKE 上的 Istio 在 2022 年 9 月后弃用
  • 是否有其他选项不使用基本 Istio 配置来仅使用全局 MultiClusterIngress 作为外部 LB 和全局路由来管理服务间/集群间通信?

我读过有关 Traffic Director 的内容,这似乎是一种管理服务流量的新方法,但无法理解它如何与 Anthos、MCS、MCI 和我的配置相适应。

任何帮助将不胜感激。 谢谢你

附录:这是我当前的 DestinationRule 配置

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: web-front-v2-multi-cluster
  namespace: staging
spec:
  host: my-front-v2-multi-cluster.staging.cluster.local
  trafficPolicy:
      loadBalancer:
        simple: ROUND_ROBIN
        localityLbSetting:
          enabled: true
          failoverPriority:
          - "topology.kubernetes.io/region"
          - "topology.kubernetes.io/zone"
          - "topology.istio.io/cluster"
      outlierDetection:
        consecutive5xxErrors: 5
        interval: 15s
        baseEjectionTime: 30s
        maxEjectionPercent: 100
  subsets:
  - name: europe
    labels:
      location: cluster-1
      topology.istio.io/cluster: cn-my-project-europe-west2-cluster-1
  - name: america
    labels:
      location: cluster-2
      topology.istio.io/cluster: cn-my-project-northamerica-northeast1-cluster-2
google-kubernetes-engine istio istio-gateway google-anthos
1个回答
1
投票

ASM 支持使用故障转移或 failoverPriority 设置的位置感知路由的 多集群故障转移

apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: whereami-app-1-dr
  namespace: app-1
spec:
  host: whereami.app-1.svc.cluster.local
  trafficPolicy:
    connectionPool:
      http:
        maxRequestsPerConnection: 1
    loadBalancer:
      simple: ROUND_ROBIN
      localityLbSetting:
        enabled: true
        # If more than 2 targets you can specify explicit failover options
        # failover:
        #  - from: us-west1
        #    to: us-west3
        # or you can specify label priority for failover https://istio.io/latest/docs/reference/config/networking/destination-rule/#LocalityLoadBalancerSetting
        failoverPriority:
        - "topology.kubernetes.io/region"
        - "topology.kubernetes.io/zone"
        - "topology.istio.io/cluster"
    outlierDetection:        # Required for locality aware routing
      consecutive5xxErrors: 1
      interval: 1s
      baseEjectionTime: 1m
  subsets:
  - name: primary
    labels:
      # cluster named gke-oregon in us-west1 region of project my-vpc
      topology.istio.io/cluster: cn-my-vpc-us-west1-gke-oregon
  - name: secondary
    labels:
      # cluster named gke-slc in us-west3 region of project my-vpc
      topology.istio.io/cluster: cn-my-vpc-us-west3-gke-slc

此外,与 GKE clusterID 匹配的特殊 label

topology.istio.io/cluster: cn-<Project Name>-<Region/Zone>-<Cluster Name>
,它可用于在 sourceLabels 上创建特定于集群的 子集

或虚拟服务匹配
© www.soinside.com 2019 - 2024. All rights reserved.