istio实现灰度发布
上传镜像到harbor
创建两个版本的pod
vi deployment-v1.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: appv1labels:app: v1
spec:replicas: 1selector:matchLabels:app: v1apply: canarytemplate:metadata:labels:app: v1apply: canaryspec:containers:- name: nginximage: 172.16.80.140/istio/canary:v1ports:- containerPort: 80vi deployment-v2.yaml
kind: Deployment
metadata:name: appv2labels:app: v2
spec:replicas: 1selector:matchLabels:app: v2apply: canarytemplate:metadata:labels:app: v2apply: canaryspec:containers:- name: nginximage: 172.16.80.140/istio/canary:v2ports:- containerPort: 80
创建service代理
vi service.yaml
apiVersion: v1
kind: Service
metadata:name: canarylabels:apply: canary
spec:selector:apply: canaryports:- protocol: TCPport: 80targetPort: 80
创建网关
vi gateway.yaml
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:name: canary-gateway
spec:selector:istio: ingressgatewayservers:- port:number: 80name: httpprotocol: HTTPhosts:- "*"
创建虚拟网关
[root@mast01 test]# more virtual.yaml
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:name: canary
spec:hosts:- "*"gateways:- canary-gatewayhttp:- route:- destination:host: canary.default.svc.cluster.localsubset: v1weight: 90- destination:host: canary.default.svc.cluster.localsubset: v2weight: 10
创建目标规则
vi destination.yaml
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:name: canary
spec:trafficPolicy:tls:mode: DISABLEhost: canary.default.svc.cluster.localsubsets:- name: v1labels:app: v1- name: v2labels:app: v2
将istio-ingressgateway的type改为NodePort(默认为loadbanlanc)
for i in `seq 1 100`; do curl 172.16.80.131:32168;done > 1.txt
cat 1.txt | grep v1 | wc -l
cat 1.txt | grep v2 | wc -l
大致与配置中的90:10相当
可以通过修改权重,实现访问权重、灰度发布等
如果一个为100,一个为0,那就实现了版本下线