Service Mesh: 基于 Istio 的落地实践(一)
init Kubernetes
传送门 二进制安装 kubernetes
安装istio
下载安装
下载istio 安装
进入 Istio release 页面,下载对应目标操作系统的安装文件。在 macOS 或者 Linux 系统中,还可以运行下面的命令,进行下载和自动解压缩:
初始化自定义资源
istio 本身进行了很多的资源自定义。 首先需要将这些自定义的资源创建出来。
执行istio-demo的安装,因为需要下载很多的镜像,而且大部分在国外,耗时比较长。
确认下列 Kubernetes 服务已经部署并都具有各自的 CLUSTER-IP
如果你的集群在一个没有外部负载均衡器支持的环境中运行,istio-ingressgateway 的 EXTERNAL-IP 会是 <pending>。要访问这个网关,只能通过服务的 NodePort 或者使用端口转发来进行访问。
这一点很重要,这与后面访问应用时有着紧密的联系。
确认必要的 Kubernetes Pod 都已经创建并且其 STATUS 的值是 Running:
如果上面 的pod 运行不正常,尤其是 istio-policy 和 istio-telemetry ,这两个pod 在构造上是一样的。其中 istio-telemetry 是专门用于收集遥测数据的Mixer服务组件。istio-policy 是另一个Mixer服务,和 istio-telemetry 基本上是完全相同的机制和流程,Data Plane在转发服务的请求前调用 istio-policy 的Check 接口检查是否允许访问。Mixer 根据配置将请求转发到对应的Adapter做对应检查。给代理返回允许访问还是拒绝。
关于这些组件,我们后期还会有详细的介绍。这里暂且略过。
如果运行过程中出现了什么错误的话,可以去check一下 docker image 是否有多个版本存在的问题。
例如笔者曾经以 官方 istio-1.2.0 进行实验,一直出错。后来换成了 isito-1.2.2,又把集群中每个node 上的 docker image 检查了一遍,把 tag:1.2.0 的镜像全部删除掉了。详见 文末 删除Istio 以及Demo示例 部分。
安装BookInfo
安装
在使用 kubectl apply 进行应用部署的时候,如果目标命名空间已经打上了标签 istio-injection=enabled,Istio sidecar injector 会自动把 Envoy 容器注入到你的应用 Pod 之中。
这里,我们采用默认的 namespace dafault 避免出错之后不好排查。
验证一下bookinfo 的 service pod 运行状况
要确认 Bookinfo 应用程序正在运行,请通过某个 pod 中的 curl 命令向其发送请求,例如来自 ratings:
不要忘记,我们默认的的namespace 已经换成了bookinfo
确定 Ingress 的 IP 和端口
为应用程序定义入口网关:
确认网关创建完成:
接下来,确定 INGRESS_HOST 和 INGRESS_PORT 变量.
确定入口 IP 和端口,执行以下命令以确定 Kubernetes 集群是否在支持外部负载均衡器的环境中运行
如果 EXTERNAL-IP 有值(IP 地址或主机名),则说明环境具有可用于 Ingress 网关的外部负载均衡器。如果 EXTERNAL-IP 值是 <none>(或一直是 <pending> ),则说明可能环境并没有为 Ingress 网关提供外部负载均衡器的功能。在这种情况下,可以使用 Service 的 node port 方式访问网关。
确认应用在运行中
可以用 curl 命令来确认 Bookinfo 应用的运行情况
应用缺省目标规则
在使用 Istio 控制 Bookinfo 版本路由之前,你需要在目标规则中定义好可用的版本,命名为 subsets 。
可以使用以下命令查看目标规则
访问我们的应用
输入下面的地址,返回 200 的话,就说明部署成功
当然也可以通过 http://${GATEWAY_URL}/productpage 来访问。如下的界面。

Prometheus 指标数据
前面的示例中,官方默认安装了一系列的可测试组件。
可以执行下面的命令,就可以在浏览器 使用 http://hostip:9090/graph 中打开promethues UI 界面了。

详细的测试数据可以参考官方的教程。
Grafana Dashboard
首先确保 Prometheus 和 Grafana 在集群中运行
执行下面的命令,在 浏览器中打开 http://hostip:3000/dashboard/db/istio-mesh-dashboard

分布式链路追踪 Jaeger
执行下面的命令,在浏览器中打开 http://hostip:15032,就可以访问到分布式链路追踪的UI了。

网格可视化kiali
确定kiali在集群中运行
执行下面的命令,浏览器界面打开 http://hostip:20001/kiali/console/就可以对服务网格进行可视化查看了。
默认账户密码 admin:admin
isito 官方还有 如何创建secret的详细教程可以参考。


删除Istio 以及Demo示例
删除路由规则,并终结应用的 Pod samples/bookinfo/platform/kube/cleanup.sh
确认应用已经关停
删除 Gateway 和 VirtualService,并关闭 httpbin 服务:
删除自定义资源
删除镜像 ,找到相应的image 版本,替换掉 1.2.0 执行下面的命令
总结
本文虽然说是实践,但是更多的却是将官方的例子跑了起来,没有什么特殊的地方,争取以后详细地输出落地实践的学习心得。
Last updated
Was this helpful?