使用 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 后面还需继续研究~

参考

https://cloud.tencent.com/developer/article/2334350

posted @ 2024-01-18 17:14  klvchen  阅读(52)  评论(0)    收藏  举报