Service Mesh: 基于 Istio 的落地实践(一)

init Kubernetes

传送门 二进制安装 kubernetes

安装istio

下载安装

下载istio 安装

进入 Istio releasearrow-up-right 页面,下载对应目标操作系统的安装文件。在 macOS 或者 Linux 系统中,还可以运行下面的命令,进行下载和自动解压缩:

初始化自定义资源

istio 本身进行了很多的资源自定义。 首先需要将这些自定义的资源创建出来。

执行istio-demo的安装,因为需要下载很多的镜像,而且大部分在国外,耗时比较长。

确认下列 Kubernetes 服务已经部署并都具有各自的 CLUSTER-IP

如果你的集群在一个没有外部负载均衡器支持的环境中运行,istio-ingressgateway 的 EXTERNAL-IP 会是 <pending>。要访问这个网关,只能通过服务的 NodePort 或者使用端口转发来进行访问。

这一点很重要,这与后面访问应用时有着紧密的联系。

确认必要的 Kubernetes Pod 都已经创建并且其 STATUS 的值是 Running

如果上面 的pod 运行不正常,尤其是 istio-policyistio-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=enabledIstio sidecar injector 会自动把 Envoy 容器注入到你的应用 Pod 之中。

这里,我们采用默认的 namespace dafault 避免出错之后不好排查。

验证一下bookinfo 的 service pod 运行状况

要确认 Bookinfo 应用程序正在运行,请通过某个 pod 中的 curl 命令向其发送请求,例如来自 ratings:

不要忘记,我们默认的的namespace 已经换成了bookinfo

确定 Ingress 的 IP 和端口

为应用程序定义入口网关:

确认网关创建完成:

接下来,确定 INGRESS_HOSTINGRESS_PORT 变量.

确定入口 IP 和端口,执行以下命令以确定 Kubernetes 集群是否在支持外部负载均衡器的环境中运行

如果 EXTERNAL-IP 有值(IP 地址或主机名),则说明环境具有可用于 Ingress 网关的外部负载均衡器。如果 EXTERNAL-IP 值是 <none>(或一直是 <pending> ),则说明可能环境并没有为 Ingress 网关提供外部负载均衡器的功能。在这种情况下,可以使用 Servicenode port 方式访问网关。

确认应用在运行中

可以用 curl 命令来确认 Bookinfo 应用的运行情况

应用缺省目标规则

在使用 Istio 控制 Bookinfo 版本路由之前,你需要在目标规则中定义好可用的版本,命名为 subsets 。

可以使用以下命令查看目标规则

访问我们的应用

输入下面的地址,返回 200 的话,就说明部署成功

当然也可以通过 http://${GATEWAY_URL}/productpagearrow-up-right 来访问。如下的界面。

BookInfo Sample

Prometheus 指标数据

前面的示例中,官方默认安装了一系列的可测试组件。

可以执行下面的命令,就可以在浏览器 使用 http://hostip:9090/graph 中打开promethues UI 界面了。

Prometheus 界面

详细的测试数据可以参考官方的教程。

Grafana Dashboard

首先确保 Prometheus 和 Grafana 在集群中运行

执行下面的命令,在 浏览器中打开 http://hostip:3000/dashboard/db/istio-mesh-dashboard

Grafana UI

分布式链路追踪 Jaeger

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

分布式链路追踪

网格可视化kiali

确定kiali在集群中运行

执行下面的命令,浏览器界面打开 http://hostip:20001/kiali/console/就可以对服务网格进行可视化查看了。

默认账户密码 admin:admin

isito 官方还有 如何创建secret的详细教程可以参考。

Service Mesh KIALI 可视化网格 (一)
Service Mesh KIALI 可视化网格 (二)

删除Istio 以及Demo示例

删除路由规则,并终结应用的 Pod samples/bookinfo/platform/kube/cleanup.sh

确认应用已经关停

删除 Gateway 和 VirtualService,并关闭 httpbin 服务:

删除自定义资源

删除镜像 ,找到相应的image 版本,替换掉 1.2.0 执行下面的命令

总结

本文虽然说是实践,但是更多的却是将官方的例子跑了起来,没有什么特殊的地方,争取以后详细地输出落地实践的学习心得。

Last updated

Was this helpful?