使用 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/

浙公网安备 33010602011771号