1. 故事背景

前面说到,最近在拆分项目,把单体项目,往微服务架构方向迁移。因为我们的语言是JAVA,所以第一选择是Spring Cloud。可是在实践的过程中,和k8s整合不大融洽(Eureka缓存了服务地址,导致k8s在滚动更新应用时,会出现服务停止的现象。这点让我十分不爽),于是在找解决方案的时候,发现了Istio

简单了解后,这就是我想要的东东啊!😎

2. 提前准备

  • 本次试验是在CentOS 7.4 64位系统,root用户下进行
  • Kubernetes(k8s)集群
  • istio版本1.0.2

3. 个人理解

Istio的定义,能干啥,官网说的很清楚,居然有中文文档👏,这点真的让我很惊喜。

🤔为什么这就是我想要东东?

  • 解决我上面的问题
  • 可以直接抛弃Spring Cloud这个大包袱,只需要SpringBoot足以
  • 把微服务里较偏向运维侧的工作服务治理解耦了出来,业务研发可以几乎不再关心这部分的内容,这点实在太好了!就好像之前的前后端分离一样,较好的划清了工作边界,让专业的人做专业的事!这点真的非常振奋人心!👏

4. 安装

官网说的挺清楚,我这里用helm进行安装

下载

curl -L https://git.io/getLatestIstio | sh -

安装

这里针对自建K8S集群的安装,如果公有云(阿里云),一般有一键安装,也支持个性化配置。

# 指定gateway为NodePort,因为测试环境没有LoadBalancer
# 同时安装tracing相关组件(其实就是jaeger),建议在这里一起安装,不要独立安装jaeger
cd {your-istio-directory-path} 
helm install install/kubernetes/helm/istio --name istio --namespace istio-system \
 --set gateways.istio-ingressgateway.type=NodePort \
 --set tracing.enabled=true

如果你想定制Istio,请查看个性化配置列表传送门

删除

helm delete --purge istio
cd {your-istio-directory-path}
# 这步相当重要,在我这个版本存在,其他版本不知道
# 如果不执行我下面这句命令,在我这个版本重新安装会有问题
# 应该是删除时,清理不干净
kubectl delete -f install/kubernetes/helm/istio/templates/crds.yaml -n istio-system

5. 注意事项

Istio 对 Pod 和服务的要求

官网传送门

实践后,我总结如下:

  • 一定要对service进行命名(否则在jaeger无法显示,其他问题未知),如下命名为http-foo
kind: Service
apiVersion: v1
metadata:
  name: foo 
  namespace: bar
spec:
  selector:
    app: bar-foo-production
  ports:
  - name: http-foo
    protocol: TCP
    port: 80
    targetPort: 8080
  • 一个pod最好只关联一个service
  • 目前Pod的标签只带了app,没带上version。暂未发现什么问题,因为我的版本会体现在镜像上,所以暂时未使用。