“我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第5篇文章,点击查看活动详情”
引言
新入职了一家单位,一个组被撸掉,留下了一大笔资产,我自告奋勇去收纳整理了一波
思路
人已经走了,资源就剩下了服务器、文档这些。好在服务还能找到,在k8s集群里面。简单梳理了下, 用了开发环境用的是私有云,测试线上环境用的公有云,redis、mysql这些都是买的现成的服务,线上的环境还在跑,里面的镜像6月份之后就没更新过了,如果要升级某个功能就要梳理出来CICD的流程,包括Jenkis、Harbor的服务器地址、文件目录等等。
切入点
好在gitlab和jenkins服务都还在用的,找领导开通权限就能看到具体的代码了,首先看看配置文件里有没有东西,bootstrap.yaml和application.yaml什么的都别放过,还有git提交记录也看看。最终整理了出来:整个后端云都是基于微服务的理念设计架构的,大多数服务都是java写的,采用的是spring cloud alibaba的框架和组件,包括nacos、gateway、feign等等。
但是,有些服务已经改用istio来替换掉代码里的相关组件了,比如服务发现和动态配置。有些服务还在用着spring的微服务。并且,开发环境的部署的服务版本与测试环境不匹配,已经落后几个大版本了。
总结下来就是1.istio迁移的事干到一半就被业务调整了 2.后期直接操作了测试环境,开发环境弃用了。
了解istio
我之前是一个纯纯的开发,像k8s、istio这些只是了解接触过,能够在kuboard的页面上点点看看pod运行的日志,仅限于此。代码提交后的流程是运维同学负责的。istio作为一个服务网格概念落地是用的最多的一个产品,与之相似的还有linkerd,都是行业内做的不错的service mesh的解决方案。在我的理解里,istio是运行在k8s“之上”的一层,通用的解释是分为控制平面和数据平面,使用envoy代理了pod,接管了pod的流量进出,从而实现对应用服务的流量管理,这就是所谓的“sidecar” 边车思想。
优势
在具体的迁移过程中,我发现它的思想和spring微服务的管理差不多,连virtual service里流量控制的语法和spring gateway 都差不多啊有没有。有了spring 微服务的基础,搞这个istio部署还是挺顺利的。 回过头来我发现istio的优势有两点:
- 少代码侵入
让java应用又回归到之前的纯业务模式,而少了很多为了解决微服务的问题(日志追踪、流量熔断限流降级)而引入的组件,比较直观的就是依赖的减少和代码中注解、切面的减少,打镜像的时候大小也少了很多。 - 支持异构语言
1. 有了docker\k8s这么一套部署运维标准,前端项目(vue.js)还有一些C、GO语言都能够使用这一套标准,但是他们的类库支持没有java这么全面,他们在实践微服务的时候也要处理链路追踪、日志查看、流量控制这些问题。就没有spring cloud的依赖可以使用了。可能要自己处理。
2. 因为java语言才有这么多丰富的组件、sdk支持它微服务体系的构建,其他语言可能没有这么多的中间件支撑,istio就解决了网关、流量控制的难题,让开发者专注地编写业务代码就OK了。
缺点
在使用过程中也发现了不足的地方,可能是我的认识水平有限
- 使用门槛高
有了devOps概念的出现,程序员简直太难了,又要每天应对繁杂的业务,还要抽时间学习技术的新知识,光是大数据这块就有的啃了,现在还有分出身来搞运维??像k8s、istio这些没有娴熟的linux、网络、虚拟容器的知识储备,真要解决一个百度搜不到的问题是真难! - 占资源
不知道是不是java语言的缘故,有网上反映用go写的服务要好些?istio的sidecar给我的感觉是很吃资源啊,公有云一套集群服务资源吃紧啊,经常飙红,也有可能是我们部署的问题。
部署小记
- 前置准备
gitlab、jenkins、Harbor、k8s这些服务是要搭建好的,并且CI流程是通的 - 安装istio
curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.6.8 TARGET_ARCH=x86_64 sh -
export PATH=$PWD/bin:$PATH
istioctl install --set profile=demo -y - 开启istio注入
kubectl label namespace nsname istio-injection=enabled
在指定的命名空间执行此命令后即开启了Envoy的自动注入,会在启动容器的时候启动一个istio-proxy容器来代理你的业务应用 - 启动业务容器
我这边使用的是kuboard页面操作,也可以直接使用yaml文件去执行create -f,后来发现有个demo让我去熟悉,就是上面指定的set profile=demo,会有一个类似图书检索的一个demo服务让我尝试着去部署和发布。istio的文件夹里samples/bookinfo/platform/kube/bookinfo.yaml 那好像就不用我在这写了? 直接参考 istio.io/latest/zh/d…
遇到的坑
- yaml里面的标签一定要加上app:yourAppName , version倒是可加可不加
- configMap里面的映射关系application.yaml->application.yaml除非你的项目是特别的
- 网关要结合lb或者测试时声明为为nodeport类型的
- vs里面的路由替换精确到“\”,例如常用的/api/user向路由到user服务,要声明
prefix:"/*/" -> rewrite: uri:/