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