我已使用 Anthos Service Mesh 在 GKE 上部署了多集群应用程序,但我对可用选项及其优缺点有一些疑问。我都已经测试过并正在工作,但需要帮助才能走得更远。我们需要对不同集群服务之间的流量进行一些额外的控制,因为我们希望仅在一个集群中部署某些服务,因为它们更接近部署在两个区域之一的主数据库。 理想配置示例(简化):
这是我尝试过的:
第一个解决方案(简单):部署 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 无效,我不知道为什么。
在花费大量时间寻找有效或无效的方法之前,我的问题是:
我读过有关 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
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 上创建特定于集群的 子集 或虚拟服务匹配