使用 Apisix 对服务进行灰度

说明

这里使用浏览器添加 Header 的参数的方式对客户端进行区分,携带参数 user=klvchen 的会访问到 v2 版本的服务,不携带参数会访问到 v1 版本服务

环境准备

mkdir -p /data/yaml/istio-test/myapp-demo
cd /data/yaml/istio-test/myapp-demo

kubectl create ns istio-test

cat >> myapp-demo-v1.yaml << EOF 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-v1
  namespace: istio-test
  labels:
    app: myapp-pod        # 2个版本的服务名需要一样
    version: v1           # 2个版本的 version 不一样
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
EOF

cat >> myapp-demo-v2.yaml << EOF 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-v2
  namespace: istio-test
  labels:
    app: myapp-pod          # 2个版本的服务名需要一样
    version: v2             # 2个版本的 version 不一样
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myapp-pod
      version: v2
  template:
    metadata:
      labels:
        app: myapp-pod
        version: v2
    spec:
      containers:
      - name: myapp-pod
        image: ikubernetes/myapp:v2
EOF

cat >> myapp-svc.yaml << EOF 
apiVersion: v1
kind: Service
metadata:
  name: myapp-svc
  namespace: istio-test
spec:
  ports:
  - port: 80
    name: http
  selector:
    app: myapp-pod         # 使用一个 service 关联2个版本的 pod
EOF 

# 部署
kubectl apply -f myapp-demo-v1.yaml -f myapp-demo-v2.yaml -f myapp-svc.yaml

测试

访问 service 正常 1:1 轮询到两个 pod

配置 Apisix ApisixRoute 和 ApisixUpstream

mkdir -p /data/yaml/istio-test/apisix-inlet
cd /data/yaml/istio-test/apisix-inlet

cat >> apisix-ar-au.yaml << EOF 
apiVersion: apisix.apache.org/v2
kind: ApisixRoute
metadata:
  namespace: istio-test
  name: ingress-testclient
spec:
  http:
  - backends:
    - serviceName: myapp-svc     # K8S 对应的 service 资源
      servicePort: 80
      subset: v2                 # 指定 v2 这个版本
    match:                       # 配置条件
      exprs:
      - op: Equal
        subject:
          name: user
          scope: Header
        value: klvchen
      hosts:                     # 配置域名
      - test.klvchen.com
      paths:                     # 匹配的路径
      - /*
    name: route-v2
    priority: 1
  - backends:
    - serviceName: myapp-svc     # K8S 对应的 service 资源
      servicePort: 80
      subset: v1                 # 指定 v1 这个默认版本
    match:
      hosts:
      - test.klvchen.com
      paths:
      - /*
    name: route-default
---
apiVersion: apisix.apache.org/v2
kind: ApisixUpstream
metadata:
  namespace: istio-test
  name: myapp-svc             # K8S 对应的 service 资源
spec:
  subsets:
  - name: v2
    labels:
      version: v2             # 根据 labels 选择 version 是 v2 的 pod
  - name: v1
    labels:
      version: v1             # 根据 labels 选择 version 是 v1 的 pod
EOF

kubectl apply -f apisix-ar-au.yaml

测试

浏览器访问 test.klvchen.com ,结果全是 v1 版本

使用 Apifox 携带参数 user=klvchen 进行访问,结果全是 v2 版本

参考

https://apisix.apache.org/zh/docs/ingress-controller/concepts/apisix_route/
https://apisix.apache.org/zh/docs/ingress-controller/concepts/apisix_upstream/

posted @ 2024-01-17 16:36  klvchen  阅读(43)  评论(0)    收藏  举报