环境信息:
组件 | 版本 |
---|---|
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 | > 0.001 <= 0.00147963 , 0.00123982 , 100.00, 3 |
总结
通过rancher可以相对简单的把Istio用起来,但实际上Istio本身的配置复杂对于大部分使用者还是有一定门槛,相信在后期的版本中应该能得到一定解决。