Istio(三)通过Rancher使用Istio

环境信息:

组件 版本
Kubernetes 1.15.5
Istio 1.4.3
Rancher 2.3.4

概述

Rancher2.3版本已经集成Istio了,通过Rancher2.3可以非常简单方便和直观的对Istio规则进行配置和管理。

部署Rancher

参考官方手册,进行单节点部署,或HA部署。

https://docs.rancher.cn/rancher2x/quick-start.html

启用Istio

进入Rancher后在对集群工具选项中启用Istio。

默认是没有启用Istio-gateway,可以自行启用

启用Istio后Rancher会在System项目下部署Istio组件

在对应项目的资源下可以看见已经启用的Istio,在这可以配置Istio规则对应图表的查看

测试使用

继续以Bookinfo为例,通过Rancher UI配置对应的规则
部署bookinfo

1
kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml

在对应的default命名空间启用sidecar自动注入

部署bookinfo

1
kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml

因为本次没有启用Istio-Gateway,所以直接将bookinfo的productpage通过nodeport方式暴露出来

1
kubectl patch svc productpage -p '{"spec": {"type": "NodePort"}}'

访问

http://172.16.1.6:32632/productpage

流量监控查看,这个主要从prometheus处获取

内嵌kiali监控图

其他对应的如grafana、kiali、jaeger、prometheus的访问界面可以直接点击左上方图标即可进入。

实现动态请求路由

配置路由请求策略将全部访问流量指向reviews v1版本
定义destinationrule配置对应的版本和label关联

创建VirtualService服务,定义http路由访问V1版本,权重设置100


访问
http://172.16.1.6:32632/productpage不断刷新页面可以看见一直显示v1版本

实现灰度发布

在这里实现两种灰度发布的方式

方式一:通过http的head将请求路由到不同的后端服务上
比如我们这里将用户标识进行请求路由,比如将用户名为jason的请求路由到Reviews service v2的版本上其他用户还是轮询访问

删除之前定义的VirtualService规则

定义新规则
根据http的头部headers配置其匹配规则

创建两个http路由,一个定义匹配规则,规则为基于http的头的end-user,精确匹配为jason则,访问到reviews v2版本,当http的头的end-user字段非jason时访问V1版本。

规则定义在请求头的end-user字段为Jason时将请求转发到Reviews-server v2版本
在UI上通过sign in登录输入用户名jason,不用输入密码刷新页面可以看见
无论怎么刷新都还是黑星星
退出登录或用其他用户名登录访问都还是Reviews-server v1版本(没星星)

方式二:将访问流量分比例,比如百分之80流量访问Reviews-server v1版本,百分之20流量访问Reviews-server v2版本

删除刚刚定义的virtualService规则,建立新规则,在http路由中添加另外一个hosts,设置流量访问权重,V1版本权重为80,V2版本权重为20

不断刷新页面,你会发现Review只会显示没有星星和黑星星,并且黑星星的显示次数比没星星要少很多。 查看kiali看见流量走向Reviews-server v1和v2版本

熔断配置

部署httpbin

1
kubectl apply -f samples/httpbin/httpbin.yaml

创destinationrule断路器

定义连接池
HTTP1最大等待请求设置为1
每个连接的HTTP最大请求设置为1
TCP最大连接数设置为1

异常检测
基本驱逐时间设置为1
连续错误设置为1
时间间隔为1s
最大驱逐百分比为100%

部署fortio进行测试

1
kubectl apply -f samples/httpbin/sample-client/fortio-deploy.yaml

1
FORTIO_POD=$(kubectl get pod | grep fortio | awk '{ print $1 }')

执行fortio用3个连接20个请求进行测试

1
kubectl exec -it $FORTIO_POD -c fortio /usr/bin/fortio -- load -c 3 -qps 0 -n 20 -loglevel Warning http://httpbin:8000/get

多连接几次,可以看见服务降级生效,请求都被拒绝了。

1
2
3
4
5
6
7
8
> 0.001 <= 0.00147963 , 0.00123982 , 100.00, 3
# target 50% 0.00072548
# target 75% 0.000921566
# target 90% 0.00115988
# target 99% 0.00144765
# target 99.9% 0.00147643
Sockets used: 20 (for perfect keepalive, would be 3)
Code 503 : 20 (100.0 %)

总结

通过rancher可以相对简单的把Istio用起来,但实际上Istio本身的配置复杂对于大部分使用者还是有一定门槛,相信在后期的版本中应该能得到一定解决。