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

Kubernetes微服务部署与弹性伸缩实战:从踩坑到金融级落地 微服务在Kubernetes上的部署(Deploying)与伸缩(Scaling)远不止YAML编写和HPA配置,而是涵盖镜像构建、准入控制、健康探针、多维指标扩缩、优雅退出等全生命周期工程实践。其核心原理在于将业务语义(如Kafka lag、P95延迟)转化为调度决策,实现资源效率与业务SLA的动态平衡。技术价值体现在降低运维噪声、提升系统韧性、支撑高可用场景;典型应用场景包括电商订单系统、实时风控中台、用户画像服务等对延迟敏感、流量波动大的生产环境。本文聚焦真实集群(v1.28+)中Deploying与 阅读详情

Go微服务架构实战-【公粽号:堆栈future】

原文
Go微服务架构实战目录

1. 微服务架构上篇

1. grpc技术介绍

2. grpc+protobuf+网关实战

3. etcd技术介绍

4. 基于etcd的服务发现与注册

5. 基于etcd的分布式锁实战

2. 微服务架构中篇

1. k8s架构介绍

2. 基于k8s的容器化部署

3. 基于k8s的Deployment工作负载

4. 基于k8s的ingress实战

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。

大家可以看下:图片

接下来为了测试,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就可以做到真正的全方位的灰度发布。

公粽号:堆栈future

使很多处于迷茫阶段的coder能从这里找到光明,堆栈创世,功在当代,利在千秋

OpenClaw生产级部署指南:AI Agent工作流的工程化落地实践 AI Agent框架正从概念验证走向生产落地,其核心挑战在于工作流编排的稳定性、技能(Skill)的隔离性与可观测性保障。OpenClaw并非轻量SDK,而是以生产就绪为设计原点的分布式运行时——它通过gRPC服务通信、分离式部署架构与强约束封装包,解决多语言技能协同、资源隔离和灰度发布等关键问题。技术价值体现在故障可定位(如内存泄漏源于闭包引用)、升级可回滚(蓝绿/金丝雀双轨策略)、合规可审计(SBOM+TLS强制校验)。典型应用场景包括金融风控中台的异步工作流调度、工业设备远程诊断的多协议技能集成,以及 阅读详情

相关推荐

网易运维开发笔试备考:岗位拆解、知识点权重与复习策略

运维开发工程师是介于传统运维与后端开发之间的复合型岗位,核心是用开发手段解决系统稳定性与自动化问题,常与DevOps、SRE等概念关联。笔试通常围绕Linux命令、网络基础、操作系统原理、编程与脚本能力展开,强调从故障现象反推根因的排查思维。其技术价值在于通过发布平台、监控告警、容器调度等工具建设,将重复运维工作自动化,提升高并发业务的交付效率。在大型互联网公司的高实时、高可用业务场景中,这类能力尤为关键。网易有道提前批运维开发笔试的真题经验表明,掌握岗位画像、复习优先级与答题策略,能有效提升校招通过率。

weixin_34187862的博客 446

微服务架构项目目录结构

浅谈项目结构spring cloud项目架构,各种项目项目架构分类方法,项目目录结构,项目模块分类方法,微服务项目架构方法 - 为乐而来 - 博客园

qq_50909707的博客 1754

【信息科学与工程学】计算机科学与自动化——第一百三十五篇 开发框架篇 系列二 Spring框架系列 02 Spring Cloud01

定义 HealthScore=∑wi​⋅indicatori​,其中 indicatori​ 为各组件健康度(0~1),wi​ 为权重。当 HealthScore<threshold 时返回 DOWN。②。

weixin_49199313的博客 481

spring-cloud-alibaba

官方地址 https://github.com/alibaba/spring-cloud-alibaba/blob/master/README-zh.md 组件 Sentinel:把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 Nacos:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 RocketMQ:一款开源的分布式消息系统,...

tiancxz的专栏 608

手把手教你用SNAP做全极化SAR图像分类

引言 最近在研究极化SAR图像分类方面的内容,发现用SNAP软件可以很方便的实现图像的分类。因为在入门过程中踩了很多坑,浪费了一些时间,为了不让大家踩坑,所以决定写下这篇教程。 前期准备 软件下载 SNAP是欧空局旗下的一个SAR图像处理软件,可以点击下载地址进行下载。 数据下载 数据下载地址:https://mdacorporation.com/sample_data/RS2_OK76385_...

zz651044657的博客 1万+

SAP 凭证分割功能 - 概述&系统配置 - Chapter01/02

为何要进行凭证拆分(分割)?在启用凭证分割之前, 在财务凭证在过账时会自动带出默认的利润中心,这利 润中心一般是从其他对象派生出来的(比如从成本中心、WBS 或资产负债表科 目定义默认的利润中心等),但是某些情况下的财务过账是不会派生出利润中 心的,比如说应收或者应付。如果一笔销售凭证上有两个行项目,10 行对应的成品物料 A 的利润中心为 TPCA-100;公司项目Dr/Cr科目金额利润中心10001Dr应收账款20002Cr库存商品A1500TPCA-1003Cr。

weixin_46525734的博客 3957

搭建微服务集群基本架构目录

前端技术 基础的HTML、CSS、JavaScript(基于ES6标准) JQuery Vue.js 2.0以及基于Vue的UI框架:Vuetify 前端构建工具:WebPack 前端安装包工具:NPM Vue脚手架:Vue-cli ajax框架:axios 基于Vue的富文本框架:quill-editor 后端技术 基础的SpringMVC、Spring5.0和MyBatis3...

qq_24545959的博客 573

DBC到ARXML:AUTOSAR CAN通信栈自动化配置完整指南

在AUTOSAR架构下,DBC(CAN数据库文件)与ARXML(AUTOSAR XML)分别扮演着描述总线通信和ECU内部配置的关键角色。DBC定义了网络上的报文与信号,而ARXML则是AUTOSAR工具链交换配置数据的标准格式。在实际的ECU开发中,如何将DBC中的通信信息高效、准确地转换为ARXML,并自动生成可编译的CAN通信栈BSW配置,是许多工程师面临的痛点。借助DaVinci Configurator等工具,我们可以通过自动化导入链路消除手工映射带来的字节序错误、信号起始位偏差等高风险问题,大幅

weixin_34183910的博客 536

神作再现!阿里技术官强推的这份微服务架构笔记,不愧为社招福音

前言 大概从五六年前开始,我在工作中越来越多地谈到了微服务,并参与了一些客户应用的微服务改造,其中不乏成功的例子,当然也有没达到预期的情况。随着网络基础设施的高速发展,以及越来越多的企业和组织需要通过互联网提供服务,在考虑构建可以支持海量请求以及多变业务的软件平台时,微服务架构成为多数人的首选。微服务架构的出现是符合事物发展规律的:当问题足够大、有足够多的不确定性因素时,人们习惯把大的问题拆分成小的问题,通过分割、抽象和重用小而可靠的功能模块来构建整体的方案。但是当这些小的、可重用的部分越来越多时,又会出

m0_50180963的博客 378

3D Gaussian Splatting环境配置和运行

使用conda命令根据environment.yml文件创建虚拟环境时,安装的pytorch是使用conda install 命令来安装的,实际上并不能成功安装带有gpu的pytorch,而这两个模块的安装依赖于带gpu的pytorch。如果不注释掉这三行,直接安装会报错

m0_46360757的博客 3326

【ROS2】Arduino系列之机器人底盘实现

介绍ros中提供的一个已经封装了的模块: ros_arduino_bridge,该模块由下位机驱动和上位机控制两部分组成,通过该模块可以更为快捷、方便的实现自己的机器人平台

guilin 1483

什么是微服务架构

微服务(或微服务架构)系统是一个,按照业务域划分为独立的服务单元,是一种云原生架构方法,其中单个应用程序由许多松散耦合且可独立部署的较小组件或服务组成。

咩嘢的博客 1169

【AIGC】人工智能训练师(高级)考试题库-橙点同学

例如,在嘈杂的环境中进行声音转文字,即使是优秀的模型也可能会出现一些错误,但这并不意味着该模型本身质量差,在其他较为理想的环境下,它可能会有很好的表现。例如,在一些语音应用和系统中,会使用SSML来实现对语音合成的精细控制,如调整语速、语调、音量等,而这些应用和系统的开发往往会遵循W3C的相关标准和框架,其中就包括SSML这一语音合成标记语言。例如,在语音识别等场景中,像“去火车站怎么走”这样的语音指令,没有其他嘈杂的背景声音或模糊不清的表述,就属于无噪音的数据,有利于系统准确地进行处理和分析。

RisunJan的博客 9920

Kubernetes六种发布策略本质与选型指南

在云原生系统中,服务发布不再只是‘更新镜像’的简单操作,而是涉及可用性、一致性、可观测性与业务目标的综合工程决策。Kubernetes Deployment 默认的滚动更新(Rolling Update)虽易用,却因probe机制局限、无事务边界和资源竞争风险,常导致支付、订单等核心链路出现静默失败。真正安全的发布需深入理解各策略底层原理:Recreate提供强一致性但需停机容忍;Blue-Green通过原子切流实现秒级回滚;Canary依托渐进验证与自动化分析闭环控制风险;A/B Testing聚焦业务指

weixin_33912453的博客 475

ISCC-Amy‘s Code CTF-Reverse

ISCC-Amy's Code CTF-Reverse

m0_72904009的博客 682

ASPICE标准快速掌握「1.1. 简介」

ASPICE是汽车软件过程改进能力模型(Automotive SPICE,Automotive - Software Process Improvement and Capability dEtermination)的缩写,是一种针对汽车软件开发过程的国际标准。该标准旨在帮助汽车制造商和供应商改进其软件开发过程,以确保其软件产品的质量和安全性。需要做什么为什么要做技术上的依赖性是什么。

雪云飞星的博客 2292

FDE工程师作品集构建指南:从自动化部署到云原生实战

在现代软件工程中,持续集成与持续部署(CI/CD)是提升交付效率的核心实践,其原理在于通过自动化流水线将代码变更快速、可靠地转化为生产环境中的服务。这项技术的核心价值在于缩短交付周期、减少人为错误并增强发布的可预测性。在云原生架构下,结合容器化与基础设施即代码(IaC)理念,CI/CD能够高效管理从开发到生产的全链路。本文聚焦于部署工程师(FDE)这一关键角色,探讨如何通过构建涵盖**自动化部署**与**可观测性**的实战项目集,系统化展示工程能力,从而在技术招聘与职业发展中脱颖而出。

weixin_30906185的博客 720

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Kubernetes六种Deployment更新策略深度解析与生产选型指南

Kubernetes Deployment更新策略本质是应用版本切换的系统性决策机制,其核心在于新旧Pod共存关系、流量接管方式与故障恢复能力的权衡。RollingUpdate通过maxSurge/maxUnavailable实现渐进替换,适合高可用在线服务但需严控资源水位;Recreate以服务短暂中断换取强一致性,适用于批处理与状态敏感任务;Partitioned RollingUpdate则提供原生灰度能力,无需Service Mesh即可实现精确流量控制。Blue-Green与Canary强调验证驱

weixin_30263073的博客 431

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

如何构建下一代AI原生API网关:Higress云原生网关实战深度指南

Higress作为下一代云原生API网关,将AI原生能力与传统的API网关功能深度融合,为开发者提供了一站式的AI应用接入与管理解决方案。这款基于Istio和Envoy构建的云原生网关,不仅支持Wasm插件扩展,还内置了强大的MCP(Model Context Protocol)服务器托管能力,让AI Agent能够轻松调用各类工具和服务。 ## 一、核心架构设计理念:控制平面与数据平面分离

gitblog_00025的博客 1040

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

机器学习模型服务化:从Notebook到生产环境的可观测性与弹性部署

机器学习模型服务化是将训练好的模型转化为稳定、可监控、可扩展API的关键工程实践。其核心原理在于解耦模型推理、数据校验、流量路由与资源调度,通过标准化接口(如Triton/TF Serving)、结构化可观测性(指标/日志/链路追踪)和声明式持续交付(GitOps),实现故障隔离、灰度可控与自动回滚。技术价值体现在降低P95延迟波动、提升GPU资源利用率、缩短MTTD至分钟级,并支撑数据漂移实时告警与模型版本原子化治理。典型应用场景包括金融风控实时评分、电商图像识别API、NLP内容审核服务等高并发、低延迟

weixin_34274029的博客 395

从Notebook到生产环境:机器学习模型落地的系统性工程实践

机器学习模型部署不是简单的代码上线,而是涵盖模型交付、服务编排、特征管理、资源调度与可观测性的全栈工程问题。其核心在于将实验室中的‘可运行’转化为产线中的‘可信赖’——即满足P99延迟、服务可用性(SLO)、模型一致性与安全合规等硬性指标。关键技术包括Triton/KServe推理服务化、Feature Store分层架构、TorchScript模型预编译、GPU动态批处理及GitOps驱动的CI/CD流水线。本文聚焦真实工业场景中电商推荐、金融反欺诈与工业预测性维护三大案例,系统拆解如何规避Flask单体

weixin_30335353的博客 447

从0到1构建微服务之基础工程创建(一)

本章内容主要讲述基础工程目录的创建以及各工程的功能、各工程之间的关系注:目前所有的代码构建肯定不是最优的,比如版本依赖的版本号抽取管理等等,后续都会一步一步去做。

qq_32590535的博客 955

SpringBoot和SpringCloud微服务目录结构

一、SpringBoot之父子模块微服务项目,SpringBoot+Mybatis+TkMapper+Dubbo目录结构如下: 1、demo-api constant:枚举类文件 dto:request和response文件 exception:异常枚举类文件 service:对外提供接口文件 2、demo-provider config:配置文件 dal——>entity:实体类文件 dal——>persistence:mapper类文件 dal——>persistence——&

netuser1937的博客 4452

k8s 使用Nginx Ingress实现灰度发布和蓝绿发布

**导语:**云原生最佳实践系列,涵盖了灰度发布、弹性伸缩、集群迁移、网络通信、应用容器化改造等等场景,针对各行业面临的应用现状,提出最佳解决方案,并提供详细操作指导,希望对您有所帮助。 Ingress基于七层的HTTP和HTTPS协议进行转发,可以通过域名和路径对访问做到更细粒度的划分。Ingress作为kubernetes集群中一种独立的资源,需要通过创建它来制定外部访问流量的转发规则,并通过Ingress Controller将其分配到一个或多个Service中。Ingress Controller在

LoveSummer 5931

如何在 Kubernetes 中借助Ingress 实现灰度发布和蓝绿发布

部署在 Kubernetes 集群中的应用,在升级发布时可能会存在的问题:1,由于 Kuberneter 底层 Pod 容器生命周期与网络组件生命周期是异步管理的,在升级时如果没有处理好应用优雅退出的问题,就很容易导致 http 访问请求 5xx2,原生 Deployment 应用的滚动发布功能是一把梭的全量发布模式,没有灰度和分批控制发布的概念,一旦出现问题,故障影响范围就会迅速扩大。

三劫散仙 1173

基于Ingress实现灰度发布(金丝雀发布)和蓝绿发布

前面有科普过灰度发布,那么本章将通过一个案例来给大家展示下实现的过程细节。 前置条件: 1、k8s集群 背景分析: 灰度及蓝绿发布是为新版本服务创建一个与老版本服务完全一致的生产环境,在不影老版本服务的前提下,按照一定的规则把部分流量切换到新版本,当新版本试运行一段时间没有问题后,将用户的全量流量从老版本迁移至新版本。 其中AB测试就是一种灰度发布方式,一部分用户继续使用老版本的服务,将一部分用户的流量切换到新版本,如果新版本运行稳定,则逐步将所有用户迁移到新版本。 应用场景 基于客户端请求的流量切

最美dee时光的博客 2503
上一篇: Go并发调度进阶-循环调度,不是你理解的死循环
下一篇: Go微服务架构实战 中篇:6. 微服务治理策略
stackfuture
博客等级 码龄5年 23粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值