首页 > 其他分享 >k8s ingress实现灰度发布

k8s ingress实现灰度发布

时间:2022-09-30 14:47:33浏览次数:55  
标签:ingress name v1 nginx v2 灰度 版本 k8s

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

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

灰度流程:

1、服务端:版本v1正常运行,发布版本v2

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

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

二、操作步骤

1、创建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

2、创建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

3、postman调用test.nginx.com

返回信息v1,说明所有请求都正常访问v1版本

 

 4、创建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

5、创建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

6、postman调用test.nginx.com

加了请求头version=v2的请求,返回信息v2,说明请求访问的是v2版本

 

 没加请求头version=v2的请求,返回v1,说明其他请求访问的还是v1版本

 

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

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

kubectl edit ingres nginx-v1

 

 8、验证:postman调用test.nginx.com,返回信息v2,说明所有请求访问的都是版本v2

没加请求头信息

 

加请求头信息:version=v2 

 

 

9、删除v1版本服务deployment,service,v2版本ingress

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

 

标签:ingress,name,v1,nginx,v2,灰度,版本,k8s
From: https://www.cnblogs.com/chenlin2022/p/16742604.html

相关文章

  • k8s+log-pilot日志收集
    github地址:https://github.com/AliyunContainerService/log-pilot介绍log-pilot是一个很棒的docker日志工具。可以从dockerlog-pilot主机收集日志并将它们发送到您的......
  • 【Kubernetes】K8s笔记(四):从 Job 和 CronJob 看 Kubernetes 的设计理念
    0.前言:在线业务和离线业务Kubernetes的业务可以分为两大类:在线业务和离线业务。在线业务:像Nginx、MySQL这样长时间运行的业务,这些应用一旦运行起来,除非出错或者停......
  • k8s 中 Pod 的控制器
    k8s中Pod的控制器前言ReplicationControllerReplicaSetDeployment更新Deployment回滚deploymentStatefulSetDaemonSetJob和CronJob总结参考k8......
  • 【k8s】K8S部署Pod到指定节点
    在启动Pod的yaml文件中与containers同级别的位置添加如下两行:nodeSelector:kubernetes.io/hostname:node的IP地址或主机名......
  • k8s消息队列-rabbiMQ集群(pod初始化安装消息延迟插件)
    一、方案:在k8s上部署rabbitMQ集群,pod初始化时安装消息延迟插件。二、部署参考rabbitMQ官方:https://www.rabbitmq.com/kubernetes/operator/operator-overview.html1、部......
  • k8s-node节点详解
    概念node是k8s集群的一个服务器角色,一般分为master(管理节点)和work(工作节点),master节点负责服务调度控制以及存储集群的配置信息等,node节点负责运行k8s的各种资源,比如:pod,D......
  • k8s网络-ingress
    一、方案:以daemonSet方式部署ingress-nginx-controller在k8s各节点上,并基于主机网络。二、部署参考:https://kubernetes.github.io/ingress-nginx/deploy/https://githu......
  • k8s部署elk+filebeat+kafka-kraft模式集群(三)filebeat部署
    k8s集群部署filebeatfilebeat需要采集每个节点的容器日志,所以我们选择daemonset的方式#catfilebeat-rbac.yamlapiVersion:v1kind:ServiceAccountmetadata:nam......
  • 二进制部署k8s集群v1.23.9版本-21-安装LTS任务调度
    21.1、准备镜像192.168.1.200服务器操作lts-jobtracker镜像dockerpullharbor.qgutech.com/qx-apaas/lts-jobtracker:v1dockertag8f1e3d395515harbor.qgutech.com/......
  • k8s部署elk+filebeat+kafka-kraft模式集群(二)kafka-zk集群
    kafka-zookeeper集群部署zk使用官方镜像,版本为3.5本文跳过rbac之类配置,与前文相同#catzk-statefulset.yamlapiVersion:v1kind:Servicemetadata:name:zk-svc......