概述
使用 Ingress 将Kubernetes中的应用暴露成对外提供的服务,针对这个对外暴露的服务可以实现灰度发布、流量管理等。我们把这种流量管理称之为南北向流量管理,也就是入口请求到集群服务的流量管理。
而Istio是侧重于集群内服务之间的东西向流量管理、或者称之为服务网格之间的流量管理。
Istio是一个用于连接/管理以及安全化微服务的开放平台,提供了一种简单的方式用于创建微服务网络,并提供负载均衡、服务间认证以及监控等能力,并且关键的一点是并不需要修改服务本身就可以实现上述功能。
该样例应用由四个单独的微服务构成,用来演示多种 Istio 特性。该应用模仿某银行金融产品的一个分类,显示某一金融产品的信息。页面上会显示该产品的描述、明细,以及针对特定用户的增值服务。
四个单独的微服务:
• productpage :productpage 微服务会调用 details 和 addedvalues两个微服务,用来生成页面。
• details :该微服务包含了金融产品的信息。
• addedvalues:该微服务包含了针对特定用户的增值服务。它还会调用 styletransfer微服务。
• styletransfer:该微服务提供了转移照片艺术风格的API功能。
addedvalues微服务有 3 个版本:
• v1 版本不会调用 styletransfer 服务,也不会提供风险和投资分析结果。
• v2 版本不会调用 styletransfer 服务,但会提供风险和投资分析结果。
• v3 版本会调用 styletransfer 服务,提供针对特定用户的增值服务,即允许用户上传图片进行风格转换,并返回一张转换后的图片。
准备Kubernetes集群
阿里云容器服务Kubernetes 1.10.4目前已经上线,可以通过容器服务管理控制台非常方便地快速创建 Kubernetes 集群。
确保安装配置kubectl 能够连接上Kubernetes 集群。
部署Istio
打开容器服务控制台,在左侧导航栏中选中集群,右侧点击更多,在弹出的菜单中选中 部署Istio。
在打开的页面中可以看到Istio默认安装的命名空间、发布名称;
通过勾选来确认是否安装相应的模块,默认是勾选前四项;
第5项是提供基于日志服务的分布式跟踪能力,本演示中不启用。
点击 部署Istio 按钮,几十秒钟之后即可完成部署。
自动 Sidecar 注入
查看namespace:
点击编辑,为 default 命名空间打上标签 istio-injection=enabled。
使用 kubectl 部署简单的服务
kubectl apply -f app.yaml
上面的命令会启动全部的3个服务,其中也包括了 addedvalues 服务的三个版本(v1、v2 以及 v3)
定义 Ingress gateway
kubectl apply -f gateway.yaml
确认所有的服务和 Pod 都已经正确的定义和启动
kubectl get svc
kubectl get po
确认网关创建完成
kubectl get gateway
应用缺省目标规则
kubectl apply -f destination-rule-all.yaml
等待几秒钟,等待目标规则生效。这就意味着上述3个微服务已经部署在Istio环境中。 你可以使用以下命令查看目标规则:
kubectl get destinationrules
查看Ingress Gateway的地址
点击左侧导航栏中的服务,在右侧上方选择对应的集群和命名空间,在列表中找到istio-ingressgateway的外部端点地址。
打开浏览器,访问http://{GATEWAY-IP}/productpage
多次刷新页面,会得到如下3种不同的显示内容,也就是上述提到的 3 个版本的addedvalues微服务。
微服务addedvalues版本v1对应的页面:
微服务addedvalues版本v2对应的页面:
微服务addedvalues版本v3对应的页面:
请求路由
请求路由任务首先会把应用的进入流量导向 addedvalues 服务的 v2 版本。 接下来会把特定用户(登录名称以yunqi开头的)的请求发送给 v3 版本,其他用户则不受影响。
kubectl apply -f virtual-service-user-v2-v3.yaml
打开浏览器,访问http://{GATEWAY-IP}/productpage
不论刷新多少次页面,如果没有登录或者登录名不是以yunqi开头的,始终得到如下的显示内容,也就是上述提到的 第2 个版本的addedvalues微服务。
当使用以yunqi开头的用户名登录时,就会看到如下页面内容, 也就是上述提到的 第3 个版本的addedvalues微服务。
注意的是,第3 个版本的addedvalues微服务提供的页面中,按钮是disabled状态,无法点击。这是因为缺省情况下,Istio 服务网格内的 Pod,由于其 iptables 将所有外发流量都透明的转发给了 Sidecar,所以这些集群内的服务无法访问集群之外的 URL,而只能处理集群内部的目标。
下一篇文章中会介绍从集群内访问外部服务的出口的流量管理。
总结
本文通过示例演示了Istio针对集群内服务之间的东西向流量管理、或者称之为服务网格之间的流量管理。
欢迎大家使用阿里云上的容器服务,快速搭建微服务的开放治理平台Istio,比较简单地集成到自己项目的微服务开发中。