假如你正在一家典型的企业里工作,需要与多个团队一起工作,并为客户提供一个独立的软件,组成一个应用程序。你的团队遵循微服务架构,并拥有由多个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 Ingress网关:集群间的通信通过Ingress网关进行,服务之间没有直接连接。因此,你要确保Ingress网关是可发现的,并且所有集群都可以连接到它。
服务发现Istio使用以下步骤来促进服务发现:
集群上都有相同的控制平面,以促进高可用性。
Kube DNS与Istio CoreDNS为支点,以提供全局服务发现。
用户通过Istio CoreDNS中的ServiceEntries定义远程服务的路由,格式为name.namespace.global。
源sidecar使用全局CoreDNS条目将流量路由到目标Istio Ingress网关。
目标 Istio Ingress 网关将流量路由到正确的微服务 pod。
前期准备
本文假设你已经对Kubernetes以及Istio的工作原理有一个基本的了解。如果你想了解Istio 1.5和1.6的详细内容,点击此处即可查看相关视频。为了能够跟上我们接下来的演示,请确保:
你有至少两个Kubernetes集群,Kubernetes的版本为1.14、1.15或1.16
你拥有在集群内安装和配置Istio的权限
你在两个Kubernetes集群上都有集群管理权限。
Ingress网关可通过网络负载均衡器或类似配置连接到其他集群。扁平网络是不必要的。
安装Istio在两个集群上,使用以下命令安装Istio 1.6.1:
curl -L https://istio.io/downloadIstio | 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 - <<EOF apiVersion: v1 kind: ConfigMap metadata: name: kube-dns namespace: kube-system data: stubDomains: | {"global": ["$(kubectl get svc -n istio-system istiocoredns -o jsonpath={.spec.clusterIP})"]} EOF configmap/kube-dns configured 设置上下文(context)