假如大发棋牌大发棋牌技巧技巧 你 正在一家典型的大发棋牌大发棋牌技巧技巧 企业 里工作,需要与多个团队一起工作,并为客户提供一个独立的大发棋牌大发棋牌技巧技巧 软件 ,组成一个应用程序。大发棋牌大发棋牌技巧技巧 你 的团队遵循微大发棋牌大发棋牌技巧技巧 服务 架构,并拥有由多个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 1.6管理多集群中的微大发棋牌大发棋牌技巧技巧
服务
?
     

    大发棋牌大发棋牌技巧技巧 服务 发现

 

Istio使用以下步骤来促进大发棋牌大发棋牌技巧技巧 服务 发现:

 

  1. 集群上都有相同的控制平面,以促进高可用性。

  2. Kube DNS与Istio CoreDNS为支点,以提供全局大发棋牌大发棋牌技巧技巧 服务 发现。

  3. 用户通过Istio CoreDNS中的ServiceEntries定义远程大发棋牌大发棋牌技巧技巧 服务 的路由,格式为name.namespace.global。

  4. 源sidecar使用全局CoreDNS条目将流量路由到目标Istio Ingress网关。

  5. 目标 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 http://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)

 

由于大发棋牌大发棋牌技巧技巧 大发棋牌大发棋牌技巧技巧 我 们 需要为不同得活动连接两个集群,因此获取上下文并将其存储在环境变量中会很有意义。有了这些,大发棋牌大发棋牌技巧技巧 大发棋牌大发棋牌技巧技巧 我 们 只要在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命名空间上部署httpbin微大发棋牌大发棋牌技巧技巧 服务 :
 

$ 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/httpbin created
service/httpbin created
deployment.apps/httpbin 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上的httpbin,大发棋牌大发棋牌技巧技巧 大发棋牌大发棋牌技巧技巧 我 们 需要在集群1上为httpbin.bar.global创建一个ServiceEntry。这样可以保证集群1上的Istio 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 - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
  name: httpbin-bar
spec:
  hosts:
  - httpbin.bar.global
  location: MESH_INTERNAL
  ports:
  - name: http1
    number: 8000
    protocol: http
  resolution: DNS
  addresses:
  - 240.0.0.2
  endpoints:
  - address: ${CLUSTER2_GW_ADDR}
    ports:
      http1: 15443 # Do not change this port value
EOF

serviceentry.networking.istio.io/httpbin-bar created

 

测试大发棋牌大发棋牌技巧技巧 服务

 

现在让大发棋牌大发棋牌技巧技巧 大发棋牌大发棋牌技巧技巧 我 们 从sleep微大发棋牌大发棋牌技巧技巧 服务 中产生一些流量,看看它是否能到达集群2上运行的httpbin微大发棋牌大发棋牌技巧技巧 服务 。
 

$ 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大发棋牌大发棋牌技巧技巧 服务 网格配置的演示。大发棋牌大发棋牌技巧技巧 你 也可以有一个共享的控制平面配置,但这并不大发棋牌大发棋牌技巧技巧 推荐 用于生产——如果大发棋牌大发棋牌技巧技巧 你 因为中断而失去一个集群,大发棋牌大发棋牌技巧技巧 你 也会失去对正在运行的集群的控制。