如何安装Istio——0成本体验服务网格

目录

  • 一、前言
  • 二、从零安装Istio——基于Killercoda的K8s环境
  • 三、Istio安装步骤
    • 使用istioctl安装Istio核心组件
    • 安装Istio示例应用BookInfo
    • 安装Istio仪表盘
  • 四、开箱即用的Istio——Killercoda的Istio playground
  • 五、总结

一、前言

对于刚接触Istio的读者,多少都对它提供的无侵入流量治理、强大的仪表盘监控有深刻的印象,很想拥有一套Istio环境尽情的折腾起来。

可是搭建一套istio环境真的很容易吗?

抛开直接购买云厂商的Istio云服务不谈(那就不是0成本了),对于平时只有1台Windows笔记本的大多数开发者,从零搭建Istio环境会遇到很多问题:

首先,Istio运行于K8s之上,Istio安装的前提是先搭建K8s。而K8s部署在Linux上,又需要先搭建2节点(K8s搭建需要控制节点和计算节点)的Linux环境,例如通过Vmvare创建Linux虚拟机。
如何安装Istio——0成本体验服务网格_第1张图片
其次,因为国内安全上网的原因,只能使用离线方式安装K8s。官方建议离线安装使用kubeadm部署工具,但是kubeadm又对安装的k8s最低版本有要求,比如>1.21版本,这就需要我们自己处理kubeadm和离线下载的k8s组件镜像的依赖关系,版本不配套会消耗大量的精力处理安装问题。

最后,Istio由于上述原因同样需要离线方式安装,还是会遇到版本不配套的问题需要手动处理。

那么有没有便捷的方法能够直接拥有一套K8s环境来安装Istio呢?

二、从零安装Istio——基于Killercoda的K8s环境

Killercoda是一个慕课学习平台,提供交互式的Web命令行环境,引导用户完整的体验一个功能场景,例如使用K8s部署一套Deployment。
如何安装Istio——0成本体验服务网格_第2张图片
左侧是教学说明。包含功能场景的引导式流程以及对应的命令行输入,点击命令行可以复制到右侧执行;

右侧是交互式的shell命令行与k8s节点交互。Killercoda提供的k8s环境默认包含2个Ubuntu节点(1U2G),节点网络默认与外网互通没有安全上网的问题,而且带宽超出你的想象。

需要注意的是,超过10min不使用右侧命令行交互,节点的远程连接会被断开,建议点击右侧的+快速建立新的远程连接;超过1小时不使用环境会被删除。

接下来,我们就用Killercoda提供的K8s环境安装istio。

三、Istio安装步骤

安装Istio之前,先了解下Istio官方提供的几种安装模式:

  1. 使用istioctl安装:istioctl是istio推出的用于管理istio的客户端工具,类似kubectl。使用istioctl可以快速的在k8s集群中安装istio的核心组件:istiod, IngressGateway。这种安装方式一般是用来尝鲜体验Istio的最新特性功能使用,不建议作为生产环境的安装方式;
  2. 使用 Istio Operator 安装:由于istioctl安装出来的istio组件,无法在业务层面维护istio的组件配置,例如无法设置安装的istiod数量。所以,istio官方基于k8s原生的Operator机制,提供了Istio Operator安装方式。这是生产环境建议的安装方式
  3. 其他安装方式:除上述两种方式外,istio还提供了基于Helm,使用外部控制平面等安装方式。这些方式在平时使用场景较少,这里不再一一赘述,感兴趣的朋友可以自己深入研究。

由于是尝鲜体验Istio,我们使用istioctl安装Istio。

使用istioctl安装Istio核心组件

进入Killercoda提供的k8s playground,一个开箱即用的k8s环境:
如何安装Istio——0成本体验服务网格_第3张图片
首先通过如下命令,确认k8s组件的pod状态为Running

k get pod -A

然后,安装Istio核心组件istiod和IngressGateway。这部分直接参考官方文档的下载Istio和安装Istio章节。

Istio核心组件安装完成后,接下来要部署运行在Istio之上的业务应用。官方提供了部署在Istio上的示例应用BookInfo,BookInfo的详细介绍请参考官方文档。

安装Istio示例应用BookInfo

BookInfo的部署直接参考官方部署示例应用章节。

部署完成后访问BookInfo,回显如下响应证明BookInfo应用运行正常:
在这里插入图片描述
上述命令实际上是进入K8s集群内的BookInfo应用实例,访问通了应用的api接口。但是我们要在集群外部通过浏览器访问,应该怎么办?

首先,参考官方的对外开放应用程序配置BookInfo服务对集群外暴露可访问。

然后,借助Killercoda提供的Traffic/Ports功能并结合K8s的Nodeport,将浏览器访问BookInfo的公网流量,从集群外部引入到集群内的BookInfo实例。配置如下:

  1. 查询Istio的入口网关IngressGateway组件对应的Nodeport。由于IngessGateway对外暴露了多个端口,这里只关注http2这个协议对应的Nodeport:
echo $(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')

例如回显端口号如32665,这就是Istio的IngessGateway对外暴露的Nodeport端口,可以使用这个端口访问BookInfo服务。

  1. 点击右上角图标,进入Traffic/Ports界面:
    如何安装Istio——0成本体验服务网格_第4张图片

  2. 输入上述端口号,点击Access跳转:
    如何安装Istio——0成本体验服务网格_第5张图片
    这里的Access跳转访问的域名,实际是Killercoda实现了从k8s集群外到集群内的L7层代理流量转发。可以看到跳转后提示404,这是因为请求中没有指定BookInfo的访问url,流量到达IngressGateway后无法进一步路由到BookInfo应用。

  3. 在域名最后追加**/productpage**,BookInfo应用访问成功。
    如何安装Istio——0成本体验服务网格_第6张图片

到这里,我们完成了Istio核心组件的安装和Istio示例应用BookInfo的安装,可以在通过浏览器从公网访问部署在Istio上的BookInfo服务。

接下来我们会安装Istio的流量拓扑仪表盘,可视化监控BookInfo的应用流量。

安装Istio仪表盘

Istio的仪表盘由开源服务Kiali提供,直接参考官方文档安装仪表盘。

Kiali安装完成后,同样需要在浏览器通过公网访问。由于安装好的Kiali没有默认开放Nodeport端口,这里通过k8s的port-forward功能开放:

  1. 开启节点的2234端口,将流量转发到Kiali的业务端口20001:
kubectl port-forward -n istio-system --address 0.0.0.0 service/kiali 2234:20001
  1. 打开Killercoda的Traffic/Ports界面,输入已开启的转发端口2234:
    如何安装Istio——0成本体验服务网格_第7张图片

  2. 可以正常访问Kiali服务:
    如何安装Istio——0成本体验服务网格_第8张图片
    虽然Kiali可以正常访问,但是点击Graph界面没有流量拓扑信息,这是因为访问BookInfo的流量不够,未达到Istio默认采样率导致无法绘制流量拓扑图。需要使用官方的流量脚本构造访问BookInfo的流量:

如何安装Istio——0成本体验服务网格_第9张图片

该脚本实际上是通过for循环,调用curl命令100次访问GATEWAY_URL的环境变量。由于Killercoda提供的是原生k8s集群,参考入站IP和端口章节创建GATEWAY_URL环境变量:

  1. 暴露Ingress的主机地址,实际上是IngressGateway的部署节点ip:
export INGRESS_HOST=$(kubectl get po -l istio=ingressgateway -n istio-system -o jsonpath='{.items[0].status.hostIP}')
  1. 暴露Ingress的NodePort端口,即在IngressGateway的部署节点对外开放的端口:
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}')
  1. 创建GATEWAY_URL环境变量:
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命名空间,可以看到刚刚的流量拓扑:
如何安装Istio——0成本体验服务网格_第10张图片
至此,我们基于Killercoda提供的K8s环境,完成了Istio的全家桶安装:包括Istio核心组件、示例应用BookInfo以及监控仪表盘Kiali,接下来各位就可以尽情体验如流量切换、故障注入、可观测等高阶特性了。

上面的介绍的过程还是要安装Istio,如果连Istio都不想安装,还有其他方法直接在Istio上部署应用吗?

四、开箱即用的Istio——Killercoda的Istio playground

Killercoda提供了k8s的playground,同样也提供了Istio的playground。Istio的playground提供了已安装的Istio核心组件,可以在上面直接部署业务应用如BookInfo:
如何安装Istio——0成本体验服务网格_第11张图片

需要注意的是:

  1. playground的默认安装的Istio版本是1.14,如果想试用最新的Istio版本,还需要手动安装;
  2. playground只安装了核心组件,未安装示例应用和监控仪表盘,这两部分还需要参考上述文档安装;

五、总结

从零搭建istio成本较高,需要准备底层vm资源和搭建K8s。对于普通的开发者,如果只想尝鲜Istio的话,可以用Killercoda提供的k8s playground环境搭建Istio,或者直接使用Istio playground部署业务应用。避免时间浪费在反复折腾底层环境上。

希望这篇文章为喜欢Istio的读者打通理想与现实,进一步探索Istio的世界。

参考

  1. Istio官方文档
  2. Killercoda
  3. K8s Nodeport

你可能感兴趣的:(service-mesh,istio,kubernetes,docker,mesh)