Go微服务架构实战 中篇:5. k8s基于ingress和service实现金丝雀发布和蓝绿发布

简介: Go微服务架构实战 中篇:5. k8s基于ingress和service实现金丝雀发布和蓝绿发布

5. 基于ingress和service实现灰度发布



关于灰度发布有好几种方式,比如蓝绿发布,滚动发布以及金丝雀发布。基于它们的表现形式不同,可以在不同场景下做到灵活应用。


细分的话基于Request Header的流量切分,基于Cookie的流量切分以及基于服务权重的流量切分都是灰度发布的具体表现,那我们这篇文章重点来聊聊蓝绿发布和金丝雀发布。


先大概介绍下这三种发布:


蓝绿发布:蓝绿部署是不停老版本,部署新版本然后进行测试,确认OK,将流量切到新版本,然后老版本同时也升级到新版本。


也就是说老版本(绿)在提供服务的时候,新版本上线(蓝),把流量全部切到新版本之后,如果验证通过就直接将老版本资源释放掉(下线机器等资源).


这种方式风险太大,一旦新版本有问题,回退之后切到原来老版本上,那么数据库里面的数据有可能因为这次灰度变脏了,怎么处理这些数据需要较强的运维能力和解决问题能力。


所以蓝绿发布不太适合高并发的场景中,比较适合后台这样的系统发布。


滚动发布:摘除一个发布一个,当然前提是你有多个这样的服务。那如果是一个呢?那我们为了不停机提供服务,首先得先起一个服务,然后把新进来的流量都打到刚才起的服务上,然后等摘除的服务把它原本处理的流量处理完成之后就可以选择下线了。


这种方式是比较建议的一种部署方式,也是k8s比较推荐的。这个上篇文章已经讲过实操,这里就不再演示了。


金丝雀发布:不用解释太多,看这个故事就知道了。


矿井中的金丝雀 17世纪,英国矿井工人发现,金丝雀对瓦斯这种气体十分敏感。空气中哪怕有极其微量的瓦斯,金丝雀也会停止歌唱;而当瓦斯含量超过一定限度时,虽然鲁钝的人类毫无察觉,金丝雀却早已毒发身亡。当时在采矿设备相对简陋的条件下,工人们每次下井都会带上一只金丝雀作为“瓦斯检测指标”,以便在危险状况下紧急撤离。


故事结束之后我们总结下经验:新老服务都在线,只不过新上的服务可能是一个,等新的服务没有问题之后,把剩余的服务全部升级到新的服务。


这种发布也是灰度的一种,也是比较推荐的。

接下来看下蓝绿发布和金丝雀发布实操。


1. 蓝绿发布


  1. 准备好两个版本的Deployment

deploy.yaml(v1.0.0)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: k8sdemo-deploy
  labels:
    app: k8sdemo
    version: 1.0.0 # pod版本
spec:
  replicas: 1
  selector:
    matchLabels:
      app: k8sdemo
      version: 1.0.0
  template:
    metadata:
      labels:
        app: k8sdemo
        version: 1.0.0
    spec:
      containers:
      - name: k8sdemo
        image: k8s-grpc-demo:v2
        imagePullPolicy: Never


deploy1.yaml(v1.0.1)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: k8sdemo-deploy-old
  labels:
    app: k8sdemo
    version: 1.0.1 # pod版本
spec:
  replicas: 1
  selector:
    matchLabels:
      app: k8sdemo
      version: 1.0.1
  template:
    metadata:
      labels:
        app: k8sdemo
        version: 1.0.1
    spec:
      containers:
      - name: k8sdemo
        image: k8s-grpc-demo:v6
        imagePullPolicy: Never


service.yaml

apiVersion: v1
kind: Service
metadata:
  name: k8sdemo-svc
spec:
  ports:
    - name: k8sdemo-svc
      port: 8000
      targetPort: 60001
  selector:
    app: k8sdemo
    version: 1.0.0 # 关联pod的版本
  type: NodePort


ingress.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: k8sdemo-ingress-prefix
  annotations:
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
    - host: hi.k8sdemo.com
      http:
        paths:
          - path: "/hello"
            pathType: ImplementationSpecific
            backend:
              service:
                name: k8sdemo-svc # 关联service
                port:
                  number: 8000


直接kubectl apply -f .就都创建好了。


我们首先访问下老的服务:

docker@minikube:~$ curl -X POST http://hi.k8sdemo.com:31721/hello -d '{"name": "fromGW"}'
{"message":"Hello fromGW from 172.17.0.3:50009"}


没问题之后我们最后升级发布新的版本:在service.yaml中只需修改version=1.0.1就可以了。

apiVersion: v1
kind: Service
metadata:
  name: k8sdemo-svc
spec:
  ports:
    - name: k8sdemo-svc
      port: 8000
      targetPort: 60001
  selector:
    app: k8sdemo
    version: 1.0.1 # 这里从1.0.0 到 1.0.1
  type: NodePort


再次kubectl apply -f service.yaml


我们访问看下:

docker@minikube:~$ curl -X POST http://hi.k8sdemo.com:31721/hello -d '{"name": "fromGW"}'
{"message":"[gray] Hello fromGW from 172.17.0.7:50009"}


可以看到这次返回的内容就是我们新增加或者修改的内容,因为它带有[gray]标识‼️


最后我们就可以把老的服务下线:

kubectl delete deploy k8sdemo-deploy

这样就完成了服务的蓝绿部署。


2. 金丝雀发布


还是上面几个yaml文件,只不过策略上有点区别,就是老的v1.0.0多起几个pod,比如这里我们扩容到3个pod;我们新的服务就一个v1.0.1的pod。


大家可以看下:

640.png


接下来为了测试,service.yaml需要把version标签去掉,因为这次我们允许新的服务也提供线上服务(新老共存)。service.yaml:


apiVersion: v1
kind: Service
metadata:
  name: k8sdemo-svc
spec:
  ports:
    - name: k8sdemo-svc
      port: 8000
      targetPort: 60001
  selector:
    app: k8sdemo
  type: NodePort


我们访问看下:


docker@minikube:~$ while true; do curl -X POST http://hi.k8sdemo.com:31721/hello -d '{"name": "fromGW"}'; done
{
 "message": "Hello fromGW from 172.17.0.3:50009"
} 
{
 "message": "Hello fromGW from 172.17.0.8:50009"
} 
{
 "message": "Hello fromGW from 172.17.0.8:50009"
} 
{
 "message": "[gray] Hello fromGW from 172.17.0.7:50009"
}


我们看到是RR轮循的方式把流量负载均衡到各个pod中。最后我们也看到[gray]出现在我们的打印中。


当我们验证没有问题之后我们就可以把流量全部切换到新的版本中,只需要修改service.yaml加上新的版本号即可,然后通过kubectl scale扩容到和老的服务一样的数量。


这种就是按照1:3的流量做灰度的。这在规模比较小的时候可以使用,当规模达到成千上万的时候,不建议这么做了。


写到这里我不禁感叹:技术的发展就是把人变得懒惰一点,原本部署很复杂的事情,但是你两行命令就搞定了,剩下的时间干什么呢?喝杯咖啡打发掉还能怎样?


3. 小结


基于k8s的ingress和service实现的灰度发布方案到这里就结束了,因为k8s对细粒度的灰度支持不太友好,所以我们需要借助第三方组件帮助我们完成,比如云厂商提供的ingress以及istio提供的ingress,像这样的ingress就可以做到真正的全方位的灰度发布。

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
8月前
|
监控 算法 NoSQL
Go 微服务限流与熔断最佳实践:滑动窗口、令牌桶与自适应阈值
🌟蒋星熠Jaxonic:Go微服务限流熔断实践者。分享基于滑动窗口、令牌桶与自适应阈值的智能防护体系,助力高并发系统稳定运行。
1116 1
Go 微服务限流与熔断最佳实践:滑动窗口、令牌桶与自适应阈值
|
运维 Kubernetes Cloud Native
智联招聘 × 阿里云 ACK One:云端弹性算力颠覆传统 IDC 架构,打造春招技术新范式
在 2025 年春季招聘季的激战中,智联招聘凭借阿里云 ACK One 注册集群与弹性 ACS 算力的深度融合,成功突破传统 IDC 机房的算力瓶颈,以云上弹性架构支撑千万级用户的高并发访问,实现招聘服务效率与稳定性的双重跃升。
|
8月前
|
Cloud Native Serverless API
微服务架构实战指南:从单体应用到云原生的蜕变之路
🌟蒋星熠Jaxonic,代码为舟的星际旅人。深耕微服务架构,擅以DDD拆分服务、构建高可用通信与治理体系。分享从单体到云原生的实战经验,探索技术演进的无限可能。
微服务架构实战指南:从单体应用到云原生的蜕变之路
|
Shell Go 开发工具
【环境】Rocky8使用gvm配置Go多版本管理的微服务开发环境(go-zero)
通过本文的介绍,我们详细讲解了如何在Rocky8上使用gvm来管理多个Go版本,并配置go-zero框架的开发环境。通过gvm的灵活管理,开发者可以轻松切换不同的Go版本,以适应不同项目的需求。同时,go-zero框架的使用进一步提升了微服务开发的效率和质量。希望本文能帮助开发者构建高效的Go语言开发环境,提高项目开发的灵活性和稳定性。
505 63
|
11月前
|
缓存 Cloud Native Java
Java 面试微服务架构与云原生技术实操内容及核心考点梳理 Java 面试
本内容涵盖Java面试核心技术实操,包括微服务架构(Spring Cloud Alibaba)、响应式编程(WebFlux)、容器化(Docker+K8s)、函数式编程、多级缓存、分库分表、链路追踪(Skywalking)等大厂高频考点,助你系统提升面试能力。
1446 0
|
Cloud Native Serverless 流计算
云原生时代的应用架构演进:从微服务到 Serverless 的阿里云实践
云原生技术正重塑企业数字化转型路径。阿里云作为亚太领先云服务商,提供完整云原生产品矩阵:容器服务ACK优化启动速度与镜像分发效率;MSE微服务引擎保障高可用性;ASM服务网格降低资源消耗;函数计算FC突破冷启动瓶颈;SAE重新定义PaaS边界;PolarDB数据库实现存储计算分离;DataWorks简化数据湖构建;Flink实时计算助力风控系统。这些技术已在多行业落地,推动效率提升与商业模式创新,助力企业在数字化浪潮中占据先机。
760 12
|
Kubernetes 监控 Serverless
基于阿里云Serverless Kubernetes(ASK)的无服务器架构设计与实践
无服务器架构(Serverless Architecture)在云原生技术中备受关注,开发者只需专注于业务逻辑,无需管理服务器。阿里云Serverless Kubernetes(ASK)是基于Kubernetes的托管服务,提供极致弹性和按需付费能力。本文深入探讨如何使用ASK设计和实现无服务器架构,涵盖事件驱动、自动扩展、无状态设计、监控与日志及成本优化等方面,并通过图片处理服务案例展示具体实践,帮助构建高效可靠的无服务器应用。
|
监控 Kubernetes Cloud Native
基于阿里云容器服务Kubernetes版(ACK)的微服务架构设计与实践
本文介绍了如何基于阿里云容器服务Kubernetes版(ACK)设计和实现微服务架构。首先概述了微服务架构的优势与挑战,如模块化、可扩展性及技术多样性。接着详细描述了ACK的核心功能,包括集群管理、应用管理、网络与安全、监控与日志等。在设计基于ACK的微服务架构时,需考虑服务拆分、通信、发现与负载均衡、配置管理、监控与日志以及CI/CD等方面。通过一个电商应用案例,展示了用户服务、商品服务、订单服务和支付服务的具体部署步骤。最后总结了ACK为微服务架构提供的强大支持,帮助应对各种挑战,构建高效可靠的云原生应用。
|
传感器 监控 安全
智慧工地云平台的技术架构解析:微服务+Spring Cloud如何支撑海量数据?
慧工地解决方案依托AI、物联网和BIM技术,实现对施工现场的全方位、立体化管理。通过规范施工、减少安全隐患、节省人力、降低运营成本,提升工地管理的安全性、效率和精益度。该方案适用于大型建筑、基础设施、房地产开发等场景,具备微服务架构、大数据与AI分析、物联网设备联网、多端协同等创新点,推动建筑行业向数字化、智能化转型。未来将融合5G、区块链等技术,助力智慧城市建设。
810 1