k8s发布-ingress实现灰度发布

一、方案:使用ingress实现应用的灰度发布

说明:此灰度发布方法不适用于利用网关转发服务的架构,利用网关转发的架构,需在网关实现灰度。

灰度流程:

1、服务端:正常版本v1,灰度版本v2

2、客户端:带有请求头version=v2标识的请求访问版本v2,其他的请求访问版本v1

3、待版本v2稳定后,所有请求切换至版本v2,停止版本v1

二、操作步骤

1、创建版本v1的deployment、service、ingress

nginx服务版本v1的deployment和service

nginx-v1.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-v1
spec:
  selector:
    matchLabels:
      app: nginx-v1
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx-v1
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
        volumeMounts:
        - mountPath: /usr/share/nginx/html
          name: file
      volumes:
      - name: file
        hostPath:
          path: /data/nginx-v1
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-v1-svc  
  labels:
    app: nginx-v1   
spec:
  type: ClusterIP  
  selector:
    app: nginx-v1
  ports:
  - port: 80
    targetPort: 80
kubectl apply -f nginx-v1.yml

nginx服务版本v1的ingress

nginx-v1-ingress.yml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-v1
spec:
  ingressClassName: nginx
  rules:
  - host: test.nginx.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx-v1-svc 
            port:
              number: 80
kubectl apply -f nginx-v1-ingress.yml

验证:postman调用test.nginx.com,当前所有请求都正常访问版本v1

 

 2、创建版本v2的deployment、service、ingress

nginx服务版本v2的deployment、service

nginx-v2.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-v2
spec:
  selector:
    matchLabels:
      app: nginx-v2
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx-v2
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
        volumeMounts:
        - mountPath: /usr/share/nginx/html
          name: file
      volumes:
      - name: file
        hostPath:
          path: /data/nginx-v2
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-v2-svc  
  labels:
    app: nginx-v2   
spec:
  type: ClusterIP  
  selector:
    app: nginx-v2
  ports:
  - port: 80
    targetPort: 80
kubectl apply -f nginx-v2.yml

nginx服务版本v2的ingress,匹配请求头version=2访问

nginx-v2-ingress.yml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-v2
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-by-header: "version"  #请求头key=version
    nginx.ingress.kubernetes.io/canary-by-header-value: "v2"  #请求头value=v2
spec:
  ingressClassName: nginx
  rules:
  - host: test.nginx.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx-v2-svc 
            port:
              number: 80
kubectl apply -f nginx-v2-ingress.yml

验证:postman调用test.nginx.com,加了请求头version=v2的请求访问版本v2,其他请求访问版本v1

 

 

 3、切换版本,使所有请求都访问v2版本

编辑v1版本的ingress,name: nginx-v1-svc改为nginx: nginx-v2-svc

kubectl edit ingres nginx-v1

 

 验证:postman调用test.nginx.com,所有请求访问的都是版本v2

 

 

 

4、删除版本v1的deployment,service,版本v2的ingress

kubectl delete deploy nginx-v1
kubectl delete svc nginx-v1-svc
kubectl delete ingress nginx-v2

 

posted @ 2022-09-30 14:34  屠夫2022  阅读(1305)  评论(0编辑  收藏  举报