对于刚接触Istio的读者,多少都对它提供的无侵入流量治理、强大的仪表盘监控有深刻的印象,很想拥有一套Istio环境尽情的折腾起来。
可是搭建一套istio环境真的很容易吗?
抛开直接购买云厂商的Istio云服务不谈(那就不是0成本了),对于平时只有1台Windows笔记本的大多数开发者,从零搭建Istio环境会遇到很多问题:
首先,Istio运行于K8s之上,Istio安装的前提是先搭建K8s。而K8s部署在Linux上,又需要先搭建2节点(K8s搭建需要控制节点和计算节点)的Linux环境,例如通过Vmvare创建Linux虚拟机。
其次,因为国内安全上网的原因,只能使用离线方式安装K8s。官方建议离线安装使用kubeadm部署工具,但是kubeadm又对安装的k8s最低版本有要求,比如>1.21版本,这就需要我们自己处理kubeadm和离线下载的k8s组件镜像的依赖关系,版本不配套会消耗大量的精力处理安装问题。
最后,Istio由于上述原因同样需要离线方式安装,还是会遇到版本不配套的问题需要手动处理。
那么有没有便捷的方法能够直接拥有一套K8s环境来安装Istio呢?
Killercoda是一个慕课学习平台,提供交互式的Web命令行环境,引导用户完整的体验一个功能场景,例如使用K8s部署一套Deployment。
左侧是教学说明。包含功能场景的引导式流程以及对应的命令行输入,点击命令行可以复制到右侧执行;
右侧是交互式的shell命令行与k8s节点交互。Killercoda提供的k8s环境默认包含2个Ubuntu节点(1U2G),节点网络默认与外网互通没有安全上网的问题,而且带宽超出你的想象。
需要注意的是,超过10min不使用右侧命令行交互,节点的远程连接会被断开,建议点击右侧的+
快速建立新的远程连接;超过1小时不使用环境会被删除。
接下来,我们就用Killercoda提供的K8s环境安装istio。
安装Istio之前,先了解下Istio官方提供的几种安装模式:
由于是尝鲜体验Istio,我们使用istioctl安装Istio。
进入Killercoda提供的k8s playground,一个开箱即用的k8s环境:
首先通过如下命令,确认k8s组件的pod状态为Running
:
k get pod -A
然后,安装Istio核心组件istiod和IngressGateway。这部分直接参考官方文档的下载Istio和安装Istio章节。
Istio核心组件安装完成后,接下来要部署运行在Istio之上的业务应用。官方提供了部署在Istio上的示例应用BookInfo,BookInfo的详细介绍请参考官方文档。
BookInfo的部署直接参考官方部署示例应用章节。
部署完成后访问BookInfo,回显如下响应证明BookInfo应用运行正常:
上述命令实际上是进入K8s集群内的BookInfo应用实例,访问通了应用的api接口。但是我们要在集群外部通过浏览器访问,应该怎么办?
首先,参考官方的对外开放应用程序配置BookInfo服务对集群外暴露可访问。
然后,借助Killercoda提供的Traffic/Ports功能并结合K8s的Nodeport,将浏览器访问BookInfo的公网流量,从集群外部引入到集群内的BookInfo实例。配置如下:
echo $(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')
例如回显端口号如32665,这就是Istio的IngessGateway对外暴露的Nodeport端口,可以使用这个端口访问BookInfo服务。
输入上述端口号,点击Access跳转:
这里的Access
跳转访问的域名,实际是Killercoda实现了从k8s集群外到集群内的L7层代理流量转发。可以看到跳转后提示404,这是因为请求中没有指定BookInfo的访问url,流量到达IngressGateway后无法进一步路由到BookInfo应用。
到这里,我们完成了Istio核心组件的安装和Istio示例应用BookInfo的安装,可以在通过浏览器从公网访问部署在Istio上的BookInfo服务。
接下来我们会安装Istio的流量拓扑仪表盘,可视化监控BookInfo的应用流量。
Istio的仪表盘由开源服务Kiali提供,直接参考官方文档安装仪表盘。
Kiali安装完成后,同样需要在浏览器通过公网访问。由于安装好的Kiali没有默认开放Nodeport端口,这里通过k8s的port-forward
功能开放:
kubectl port-forward -n istio-system --address 0.0.0.0 service/kiali 2234:20001
可以正常访问Kiali服务:
虽然Kiali可以正常访问,但是点击Graph界面没有流量拓扑信息,这是因为访问BookInfo的流量不够,未达到Istio默认采样率导致无法绘制流量拓扑图。需要使用官方的流量脚本构造访问BookInfo的流量:
该脚本实际上是通过for循环,调用curl命令100次访问GATEWAY_URL的环境变量。由于Killercoda提供的是原生k8s集群,参考入站IP和端口章节创建GATEWAY_URL环境变量:
export INGRESS_HOST=$(kubectl get po -l istio=ingressgateway -n istio-system -o jsonpath='{.items[0].status.hostIP}')
export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')
export SECURE_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="https")].nodePort}')
export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT
参考官方访问BookInfo的流量脚本,发送100个请求到BookInfo应用:
for i in `seq 1 100`; do curl -s -o /dev/null http://$GATEWAY_URL/productpage; done
刷新Kiali的Graph看板,选中default命名空间,可以看到刚刚的流量拓扑:
至此,我们基于Killercoda提供的K8s环境,完成了Istio的全家桶安装:包括Istio核心组件、示例应用BookInfo以及监控仪表盘Kiali,接下来各位就可以尽情体验如流量切换、故障注入、可观测等高阶特性了。
上面的介绍的过程还是要安装Istio,如果连Istio都不想安装,还有其他方法直接在Istio上部署应用吗?
Killercoda提供了k8s的playground,同样也提供了Istio的playground。Istio的playground提供了已安装的Istio核心组件,可以在上面直接部署业务应用如BookInfo:
需要注意的是:
从零搭建istio成本较高,需要准备底层vm资源和搭建K8s。对于普通的开发者,如果只想尝鲜Istio的话,可以用Killercoda提供的k8s playground环境搭建Istio,或者直接使用Istio playground部署业务应用。避免时间浪费在反复折腾底层环境上。
希望这篇文章为喜欢Istio的读者打通理想与现实,进一步探索Istio的世界。
参考
- Istio官方文档
- Killercoda
- K8s Nodeport