本文次要介绍多主集群istio service mesh,每个主集群都有本人的复制管制立体,并应用网关跨集群连贯服务。

在此配置中,每个集群都具备本人的Istio管制立体部署,而不是应用共享的Istio管制立体来治理网格,每个集群治理本人的端点。为了执行策略和确保安全,所有集群都处于共享的管理控制之下。

通过复制共享服务和名称空间并在所有集群中应用公共根CA,能够在集群中实现单个Istio服务网格。跨集群通信在各个集群的Istio网关上进行。

应用Istio Gateway跨多个Kubernetes集群的Istio网格拜访近程Pod

先决条件

  • 两个或多个Kubernetes集群,其反对版本别离为:1.16、1.17、1.18。
  • 在每个Kubernetes集群上部署Istio管制立体的权限。
  • 每个集群中的istio-ingressgateway服务的IP地址必须能够从其余每个集群拜访,最好应用L4网络负载平衡器(NLB)。
  • 根CA。跨集群通信须要服务之间的互相TLS连贯。为了在集群之间实现互相TLS通信,将为每个集群的Istio CA配置为共享根CA生成的两头CA凭据。

在每个集群中部署Istio管制立体

  1. 从组织的根CA为每个集群的Istio CA生成两头CA证书。共享的根CA容许跨不同集群的互相TLS通信。
    为便于阐明,以下阐明将Istio示例目录中的证书用于两个集群。在理论部署中,您可能会为每个集群应用不同的CA证书,所有证书均由公共根CA签名。
  2. 在每个集群中运行以下命令,以在所有集群中部署雷同的Istio管制立体配置。
  • 应用相似于以下命令,为生成的CA证书创立Kubernetes 秘钥。无关更多详细信息,请参见证书颁发机构(CA)证书。
$ kubectl create namespace istio-system$ kubectl create secret generic cacerts -n istio-system     --from-file=samples/certs/ca-cert.pem     --from-file=samples/certs/ca-key.pem     --from-file=samples/certs/root-cert.pem     --from-file=samples/certs/cert-chain.pem 
  • 部署 Istio:
$ istioctl install     -f manifests/examples/multicluster/values-istio-multicluster-gateways.yaml

部署 DNS

为近程集群中的服务提供DNS解析将使现有应用程序可能失常运行,因为应用程序通常心愿通过DNS名称解析服务并拜访生成的IP。 Istio自身不应用DNS在服务之间路由申请。集群本地的服务共享一个通用的DNS后缀(例如svc.cluster.local)。 Kubernetes DNS为这些服务提供DNS解析。

要为近程集群中的服务提供相似的设置,请应用<name>.<namespace>.global格局命名近程集群中的服务。 Istio部署蕴含了CoreDNS服务器,该服务器将为这些服务提供DNS解析。为了利用此DNS,必须将Kubernetes的DNS配置为对.global进行域名存根。

一些云提供商为其Kubernetes服务具备不同的特定DNS域存根性能和过程。请参考云提供商的文档,以确定如何为每个惟一环境存根DNS域。目标是在端口53上为.global增加一个域,以援用或代理Istio服务名称空间中的istiocoredns服务。

在每个集群中,创立以下ConfigMap之一,或更新现有的ConfigMap,比方coredns1.4以上的版本:

kubectl apply -f - <<EOFapiVersion: v1kind: ConfigMapmetadata:  name: coredns  namespace: kube-systemdata:  Corefile: |    .:53 {        errors        health        ready        kubernetes cluster.local in-addr.arpa ip6.arpa {           pods insecure           upstream           fallthrough in-addr.arpa ip6.arpa        }        prometheus :9153        forward . /etc/resolv.conf        cache 30        loop        reload        loadbalance    }    global:53 {        errors        cache 30        forward . $(kubectl get svc -n istio-system istiocoredns -o jsonpath={.spec.clusterIP}):53    }EOF

配置应用服务

给定集群中须要从其余近程集群拜访的每个服务都须要在近程群集中进行ServiceEntry配置。服务条目中应用的主机的格局应为<name>.<namespace>.global,其中名称和名称空间别离对应于服务的名称和名称空间。

为了演示跨集群拜访,请将在一个集群中运行的睡眠服务配置为调用在第二个集群中运行的httpbin服务。在开始之前,咱们须要实现以下工作:

  • 抉择两个Istio集群,别离称为cluster1cluster2
  • 您能够应用kubectl命令通过--context标记拜访cluster1cluster2集群,例如kubectl get pods --context cluster1。应用以下命令列出您的上下文:
$ kubectl config get-contextsCURRENT   NAME       CLUSTER    AUTHINFO       NAMESPACE*         cluster1   cluster1   user@foo.com   default          cluster2   cluster2   user@foo.com   default
  • 将集群的上下文名称存储在环境变量中:
$ export CTX_CLUSTER1=$(kubectl config view -o jsonpath='{.contexts[0].name}')$ export CTX_CLUSTER2=$(kubectl config view -o jsonpath='{.contexts[1].name}')$ echo "CTX_CLUSTER1 = ${CTX_CLUSTER1}, CTX_CLUSTER2 = ${CTX_CLUSTER2}"CTX_CLUSTER1 = cluster1, CTX_CLUSTER2 = cluster2

总结

应用Istio网关,公共根CA和服务条目,您能够在多个Kubernetes集群之间配置单个Istio服务网格。一旦以这种形式配置,流量就能够通明地路由到近程集群,而无需任何应用程序的参加。只管此办法须要肯定数量的手动配置能力进行近程服务拜访,然而服务条目创立过程能够自动化。