一、前言
在经过前面几天k8s和Istio的安装之后,开始进入最核心的阶段。微服务在抛弃传统的服务注册和服务发现之后,是怎么在istio怎么做服务间的调用的呢?本次实战花费了我2-3天的时间,经过不断的尝试,折腾,最后终于把服务间的调用调通了。下面我将介绍我本次的实践过程,希望对于同样在研究这个技术有困难的同学提供一定的帮助。
二、准备工作
对应不熟悉的技术,我也是首先找了这方面的博文。我本次也是参考如下两篇博文进行实践的:
- istio gateway入口流量路由管控
- istio 访问网格内的服务(路由管理)
对于第一篇博文还是比较顺利的,问题就出在第二篇博文。在最关键的那一步服务间的调用,出现问题了,报错日志如下:
upstream connect error or disconnect/reset before headers. reset reason: connection failure, transport failure reason: delayed connect error: 111
我看有博文上有显示pilot 的pod,我还还怀疑是我少安装了pilot,找了一圈也没发现怎么安装pilot。
后面再安装了kiali 之后,在调用中又看到了如下的报错:
PassthroughCluster
然后又经过一阵折腾,又报了如下的错误:
503 Service Unavailable: [no body]
后面我还咨询了博主本人,问是不是spring项目中需要加spring-cloud-kubernetes 依赖,然后博主还回复我了不需要这个,用的就是istio的 LoadBalancer。
三、问题排查
几个关键点如下:
- ingressgateway 的类型
istio 安装时使用istioctl install --set profile=demo -y 安装的时候ingressgateway 默认安装的类型就是LoadBalancer,后面我为了方便访问我改完了NodePort。通过上面博主的提示,然后我看他博文里面ingressgateway 的类型确实为LoadBalancer,于是我就将它改过来了,然后我看他的EXTERNAL-IP 是“localhost” 于是我也将我的ingressgateway 的EXTERNAL-IP 改为了本机IP,如下图所示:
- istio-springboot-demo-b服务是否正常
当我安装istio-springboot-demo-a服务的方式部署完istio-springboot-demo-b后,发现istio-springboot-demo-b并不能正常访问。我才发现istio-springboot-demo-a项目的端口是8080,这是微服务默认的端口,istio-springboot-demo-b服务在容器里面配的是8081,但是我在微服务项目里面并没有配置这个端口,于是我加上配置重新打包镜像。至于怎么通过容器端配置修改服务的端口我后面再研究。
3.服务间调用通过IP是否能调用通
当我在阅读如下博文Istio(十二):Istio问题排查的之后,我查看了我的springboot-demo-b服务的情况,如下图所示
于是服务间调用我通过POD IP可以正常调用,如下图所示:
然后我又通过SVC IP也可以正常调用,如下图所示:
在我写本文之前SVC 端口是8081,后面我将SVC 端口IP换成了80,
后面又通过服务名+端口也可以正常调用了,如下图所示:
最后,我将SVC 端口8081改为80就大功告成了(80端口可以省略,同命名空间调用.svc.cluster.local也可以省略)
四、总结
通过本次实验,掌握了通过命令修改SVC type和externalIPs的方法,如下所示:
kubectl patch service kiali -n istio-system -p '{"spec":{"type":"NodePort"}}'
kubectl patch svc istio-ingressgateway --namespace istio-system --patch '{"spec": { "externalIPs": ["192.168.1.29"] }}'
还包括kubectl的如下方法:
kubectl edit svc istio-ingressgateway -n istio-system
kubectl get pod istio-springboot-demo-b-v1-6859cf6699-nrl4r -n istio-demos -o json
kubectl describe pod istio-springboot-demo-b-v1-5c789bf465-72f4c -n istio-demos
另外学会了xshell 批量发送请求
for i in $(seq 1 100); do curl -s -o /dev/null "http://192.168.1.29:32207/productpage"; done