使用 Istio 和 Apisix 实现全链路灰度测试(三)
部署基于用户身份的路由
cd /data/yaml/default/bookinfo/networking
# 创建 DestinationRule 和 VirtualService
kubectl apply -f destination-rule-all.yaml -f virtual-service-reviews-test-v2.yaml
测试
浏览器访问 http://test.klvchen.com/productpage,没有使用 jason 用户登录,reviews 都是 v1 版本

浏览器访问 http://test.klvchen.com/productpage,使用 jason 用户登录 (用户名 jason, 密码空),reviews 都是 v2 版本

成功实现了基于用户身份的路由
剩余的问题
- productpage 这个 servie 作为 Apisix 的入口服务如果要做灰度,需要部署两个deployment对应其两个版本,一个service关联这两个版本的pod,但用Apisix的路由配置来实现灰度。可参考
cat >> apisix-ar-au.yaml << EOF
apiVersion: apisix.apache.org/v2
kind: ApisixRoute
metadata:
namespace: default
name: productpage
spec:
http:
- backends:
- serviceName: productpage
servicePort: 9080
subset: v2 # productpage 有 v1 和 v2 版本
match:
exprs:
- op: Equal
subject: # 请求头中带上 end-user=jason
name: end-user
scope: Header
value: jason
hosts:
- test.klvchen.com
paths:
- /*
name: route-v2
priority: 1
- backends:
- serviceName: productpage
servicePort: 9080
subset: v1
match:
hosts:
- test.klvchen.com
paths:
- /*
name: route-default
EOF
---
apiVersion: apisix.apache.org/v2
kind: ApisixUpstream
metadata:
namespace: default
name: productpage
spec:
subsets:
- name: v2
labels:
version: v2 # 通过 version 标签来进行筛选
- name: v1
labels:
version: v1
# 如果是自己的服务,deployment 和 service 例子可参考下面:
[root@k8s-master-1 myapp-demo]# cat myapp-demo-v1.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-v1
namespace: istio-test
labels:
app: myapp-pod
version: v1
spec:
replicas: 1
selector:
matchLabels:
app: myapp-pod
version: v1
template:
metadata:
labels:
app: myapp-pod
version: v1
spec:
containers:
- name: myapp-pod
image: ikubernetes/myapp:v1
[root@k8s-master-1 myapp-demo]# cat myapp-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: myapp-svc
namespace: istio-test
spec:
ports:
- port: 80
name: http
selector:
app: myapp-pod
- 该方案使用了 K8S 的 Service 关联后端服务的入口,目前公司使用的 Nacos 作为服务发现,针对 Nacos 后面还需继续研究~

浙公网安备 33010602011771号