如何使用Istio 1.6管理多集群中的微服务?

网友投稿 226 2022-10-11

如何使用Istio 1.6管理多集群中的微服务?

假如你正在一家典型的企业里工作,需要与多个团队一起工作,并为客户提供一个独立的软件,组成一个应用程序。你的团队遵循微服务架构,并拥有由多个Kubernetes集群组成的广泛基础设施。

由于微服务分布在多个集群中,你需要设计一个解决方案来集中管理所有微服务。幸运的是,你正在使用Istio,提供这个解决方案只不过是另一个配置的变化。

像Istio这样的服务网格技术可以帮助你安全地发现和连接分布在多个集群和环境中的微服务。今天我们来讨论一下使用Istio管理托管在多个Kubernetes集群中的微服务。

架构说明

Istio使用以下组件提供跨集群服务发现:

Istio CoreDNS:每个Istio控制平面都有一个CoreDNS。Istio使用它来发现全局范围上定义的服务。例如,如果一个托管在集群1上的微服务需要连接到另一个托管在集群2上的微服务,你需要为运行在集群2上的微服务在Istio CoreDNS上做一个全局条目。

Root CA:由于Istio需要在不同集群上运行的服务之间建立mTLS连接,因此需要使用共享的Root CA为两个集群生成中间CA证书。这就在不同集群上运行的微服务之间建立了信任,因为中间CA共享同一个Root CA。

Istio使用以下步骤来促进服务发现:

集群上都有相同的控制平面,以促进高可用性。 Kube DNS与Istio CoreDNS为支点,以提供全局服务发现。 用户通过Istio CoreDNS中的ServiceEntries定义远程服务的路由,格式为name.namespace.global。 源sidecar使用全局CoreDNS条目将流量路由到目标Istio Ingress网关。 目标 Istio Ingress 网关将流量路由到正确的微服务 pod。   前期准备

你有至少两个Kubernetes集群,Kubernetes的版本为1.14、1.15或1.16 你拥有在集群内安装和配置Istio的权限 你在两个Kubernetes集群上都有集群管理权限。 Ingress网关可通过网络负载均衡器或类似配置连接到其他集群。扁平网络是不必要的。   安装Istio

在两个集群上,使用以下命令安装Istio 1.6.1:

curl -L | ISTIO_VERSION=1.6.1 sh - cd istio-1.6.1 export PATH=$PWD/bin:$PATH

由于我们需要用共享的根证书生成的中间证书来启动我们的Istio服务网格,所以使用中间证书创建一个secret。

在这个例子中,我们使用提供的样本证书。但是,我不建议你在生产中使用这些证书,因为它们一般都是可轻松获取的,而且是众所周知的。最好是使用你的组织的Root CA来生成中间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 secret/cacerts created

由于我们需要安装Istio进行多集群设置,所以在两个集群上使用提供的Istio多集群网关manifest文件。

$ istioctl manifest apply -f install/kubernetes/operator/examples/multicluster/values-istio-multicluster-gateways.yaml - Applying manifest for component Base... ✔ Finished applying manifest for component Base. - Applying manifest for component Pilot... ✔ Finished applying manifest for component Pilot. Waiting for resources to become ready... - Applying manifest for component AddonComponents... - Applying manifest for component IngressGateways... - Applying manifest for component EgressGateways... ✔ Finished applying manifest for component EgressGateways. ✔ Finished applying manifest for component IngressGateways. ✔ Finished applying manifest for component AddonComponents. ✔ Installation complete

配置KubeDNS

下一步是将DNS解析从Kube DNS联邦到Istio CoreDNS。让我们通过为kube-dns定义一个ConfigMap来配置一个存根域。在两个集群上应用以下manifest:

$ kubectl apply -f - <

设置上下文(context)

由于我们需要为不同得活动连接两个集群,因此获取上下文并将其存储在环境变量中会很有意义。有了这些,我们只要在kubectl命令中加入上下文,就可以在我们选择得集群中运行kubectl命令。

获取上下文:

$ kubectl config get-contexts CURRENT NAME CLUSTER AUTHINFO NAMESPACE cluster-1 cluster-1 cluster-1 * cluster-2 cluster-2 cluster-2

设置环境变量以使用上下文:

$ 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 = cluster-1, CTX_CLUSTER2 = cluster-2

部署示例微服务

我们先在集群1的foo命名空间上部署sleep微服务。

$ kubectl create --context=$CTX_CLUSTER1 namespace foo namespace/foo created $ kubectl label --context=$CTX_CLUSTER1 namespace foo istio-injection=enabled namespace/foo labeled $ kubectl apply --context=$CTX_CLUSTER1 -n foo -f samples/sleep/sleep.yaml serviceaccount/sleep created service/sleep created deployment.apps/sleep created $ export SLEEP_POD=$(kubectl get --context=$CTX_CLUSTER1 -n foo pod -l app=sleep -o jsonpath={.items..metadata.name})

现在我们在集群2的bar命名空间上部署kubectl create --context=$CTX_CLUSTER2 namespace bar namespace/bar created $ kubectl label --context=$CTX_CLUSTER2 namespace bar istio-injection=enabled namespace/bar labeled $ kubectl apply --context=$CTX_CLUSTER2 -n bar -f samples/httpbin/httpbin.yaml serviceaccount/created service/created deployment.apps/created

创建服务条目

现在我们需要在Istio CoreDNS上创建一个服务条目以便于我们可以从集群1中发现集群2上的服务。由于所有的通信都会通过Ingress 网关,导出集群2 Ingress网关地址。

export CLUSTER2_GW_ADDR=$(kubectl get --context=$CTX_CLUSTER2 svc --selector=app=istio-ingressgateway \ -n istio-system -o jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}')

为了让集群1上的服务能够发现集群2上的Core DNS在集群1上的服务到达httpbin.bar.global这个端点时,可以到达集群2的Ingress网关。下面的yaml:

在hosts部分定义服务域名 位置是mesh_INTERNAL,因为我们需要把其他服务当作同一个服务网格的一部分 将服务暴露在8000端口上 我们需要给该服务提供一个独特的IP地址。该IP地址不需要可路由,并且你可以使用240.0.0.0/16范围内的任意地址 我们在端点地址部分上定义集群2 ingress网关地址,以便于请求可以路由给它。端口15443是Ingress网关的SNI识别的Envoy代理端口,用于在目标群集服务的Pod之间路由流量。

应用yaml文件:

$ kubectl apply --context=$CTX_CLUSTER1 -n foo -f - <

测试服务

现在让我们从sleep微服务中产生一些流量,看看它是否能到达集群2上运行的kubectl exec --context=$CTX_CLUSTER1 $SLEEP_POD -n foo -c sleep -- curl -I httpbin.bar.global:8000/headers % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0HTTP/1.1 200 OK 0 519 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 server: envoy date: Sat, 16 May 2020 23:03:22 GMT content-type: application/json content-length: 519 access-control-allow-origin: * access-control-allow-credentials: true x-envoy-upstream-service-time: 37

我们得到一个成功的响应!恭喜你,我们已经成功地使用Istio在多个Kubernetes集群之间配置了服务发现。

结 论

感谢你的阅读,希望你能喜欢这篇文章。

这是一个在多个集群上运行的高可用Istio服务网格配置的演示。你也可以有一个共享的控制平面配置,但这并不推荐用于生产——如果你因为中断而失去一个集群,你也会失去对正在运行的集群的控制。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:让我带你理清 Azure 的负载均衡器
下一篇:Java并发编程之StampedLock锁介绍
相关文章

 发表评论

暂时没有评论,来抢沙发吧~