由于业务微服务先前的架构大量使用consul来做服务注册与发现,但是istio主流的方案中,业务还是走k8s基于DNS的服务发现。正好看到istio社区也号称能够基于consul;因此,基于consul做了一些POC,主要情况简单介绍一下。
当前业务方新开发的服务运行到k8s上,另外有一些旧服务运行在VM中(VM网络与办公网络三层可达,存在接口被人随意调用的风险)。希望能够降低服务部署的复杂度,同时当存在异常或瓶颈的时候能够快速感知到异常,定位问题。
因此,其服务治理的目标也比较明确:
大体分析一下:
基于istio的宣传,乍一看,以上功能都能够cover住。但是这里面仍存在风险点,比如VM+K8S融合部署、集中管控;基于consul的服务注册等。虽然社区号称istio具备这些能力,但是却未在这些点上深度发力(从发布包中可以看到主流方向还是基于纯k8s方向)。
假设使用consul作为服务发现工具,那么就相当于将vm和k8s pod都拉平来对待,似乎是一个方向。另一方面,现有服务已经在使用spring cloud + consul注册的机制,如果继续使用consul的话,现有代码不需要再做修改。
另外,社区号称istio对consul服务发现的支持还不错,且在其release包中,自带了对应的安装部署的docker-compose文件。
所以,我决定重点POC一把基于consul做服务发现的istio的情况。
其架构如上图所示,各个微服务的功能如下:
api-server
registrator
pilot
zipkin
涉及istio部署和示例服务bookinfo的部署。
部署这块,相对来讲比较简单,其发布包里面自带了基于consul部署的docker-compose.yaml。里面的api-server版本都较旧,也说明了社区未在这方面有所更新,这里重点要说下遇到的对应问题以及其更改方法。
docker-compose.yaml
文件内容如下:
version: '2' services: etcd: ...... istio-apiserver: # 更改为当前最新版本的api-server image: gcr.io/google_containers/kube-apiserver-amd64:v1.14.1 networks: istiomesh: ipv4_address: 172.28.0.13 aliases: - apiserver ports: - "8080:8080" privileged: true environment: - SERVICE_IGNORE=1 command: ["kube-apiserver", "--etcd-servers", "http://etcd:2379", "--service-cluster-ip-range", "10.99.0.0/16", "--insecure-port", "8080", "-v", "2", "--insecure-bind-address", "0.0.0.0"] consul: ...... registrator: # 更新版本为master image: gliderlabs/registrator:master networks: istiomesh: volumes: - /var/run/docker.sock:/tmp/docker.sock command: ["-internal", "-retry-attempts=-1", "consul://consul:8500"] pilot: ...... zipkin: ......
如上文所注释,这里需要修改几个地方:
[root@vm-1 consul]# pwd /root/istio-1.1.6/samples/bookinfo/platform/consul [root@vm-1 consul]# ls bookinfo.sidecars.yaml destination-rule-all.yaml virtual-service-ratings-test-abort.yaml virtual-service-reviews-test-v2.yaml bookinfo.yaml README.md virtual-service-ratings-test-delay.yaml virtual-service-reviews-v2-v3.yaml cleanup.sh virtual-service-all-v1.yaml virtual-service-reviews-50-v3.yaml virtual-service-reviews-v3.yaml
相信看到这里,大家都明白为啥k8s是主流方向了。这里示例代码中每一个服务的运行实例都需要再手动部署一个sidecar,想想k8s上自动注入的便捷性,突然感觉回到了解放前。
运行起来之后,可以在consul看到下列服务;当然,consul的UI上面未能够展现出所有的tags信息。
通过简单的访问productpage之后,我们可以在zipkin上看到对应的调用链信息视图。
如果这过程中某些配置不正确,可以查看对应envoy的配置信息,基本就是进入到envoy对应的network namespace去执行 curl localhost:15000/help
获取各种配置信息(这块在上一篇中有具体的介绍,这里不再详说)。
关于部署就讲这么多,主要是通过这样一个过程让我们对基于consul服务发现的istio有一个更加直观的认识。下面我们就来吐槽!