作者:ZadigX
企业发布现状痛点
目前企业在选择和实施发布策略时面临以下困境:
1. 缺乏云原生能力: 由于从传统部署转变为云原生模式后,技术架构改造需要具备相关能力的人才。这使得企业在发布策略方面难以入手。
2. 缺乏自动化平台支持: 即使找到适合产品现状的发布策略,仍然依赖手工逐步执行。这可能导致流程遗漏或人工操作失误,造成生产事故的风险。
3. 发布效率低下: 仅实现了服务级别的灰度能力,逐个发布服务耗时长,导致发布过程缓慢,验证效果不佳。
针对以上问题,ZadigX 与阿里云 MSE 联合发布**「面向开发者的全链路灰度发布解决方案」**,帮助企业应对这些痛点。
阿里云 MSE 为 Java 应用提供了便捷实现全链路灰度的能力。MSE 微服务引擎是基于 Java Agent 实现的无侵入式企业生产级服务治理产品,不需要修改任何一行业务代码,即可拥有不限于全链路灰度的治理能力,并且支持近 5 年内所有的 Spring Boot、Spring Cloud 和 Dubbo。
使用 MSE 进行灰度发布的过程中,ZadigX 可以便捷地创建灰度环境和灰度 K8S 资源, 结合发布工作流编排能力,自动为 K8S 资源设置 MSE 所需的资源标记,并集成了 MSE API 以降低重复工作量。开发无需切换平台,管理员一次配置即可。 开发可以基于 ZadigX 与日常工作平滑结合,完成高效、安全、快捷的发布。
工作原理介绍
工作原理图示:
工作流程描述:
MSE 灰度发布任务
-
复制一份基于基准环境中服务的 YAML
-
自动为 YAML 中的资源名称 metadata.name 添加后缀 -mse-
-
自动为 YAML 中的资源添加 MSE 全链路灰度发布所需的相关 label
-
用户可以设置灰度镜像、副本数,此外可以直接在渲染后的 YAML 中修改其他需要改动的字段(不可删除灰度过程中使用的 label)
-
根据最终的 YAML 生成灰度版本资源
下线 MSE 灰度服务
- 通过灰度资源被设置的相关 label ,找到并删除它们
前置操作
MSE 全链路灰度能力可以支持任意 K8S 集群,全链路灰度场景需基于网关能力建设,下面以 MSE 自带的云原生网关为例介绍场景,用户可以根据自身情况选择合适的网关。
安装 MSE 组件
在阿里云 ACK 集群中安装 MSE 组件,安装方式参考文档:安装 ack-onepilot 组件 [ 1] 。
安装 MSE Ingress 云原生网关
安装方式参考文档
-
创建 MSE 云原生网关 [ 2]
-
通过 MSE Ingress 访问容器服务 [ 3]
下面以 spring-a、spring-b、spring-c、nacos 这几个服务结合 MSE 云原生网关组成的项目为例演示项目初始化和 MSE 灰度发布过程。
管理员做项目初始化
运维或者 DevOps 工程师在 ZadigX 上进行项目的初始化,包括新建项目、新建服务、新建环境并启用 MSE、新建灰度发布工作流等步骤。以下操作是一次性操作,后续只需按需配置执行工作流即可。
步骤一:新建项目
在 ZadigX 上新建项目,输入项目名称,项目类型选择 「K8s YAML」项目。
步骤二:新建服务
在 ZadigX 服务-生产服务模块新建 nacos、spring-a、spring-b、spring-c 服务并配置对应的 YAML。
📍注意:在服务 deployment 中需添加以下 selector 和 template.metadata.labels:zadigx-release-version: original
服务 YAML 如下所示:
- nacos 服务 YAML 配置:
apiVersion: apps/v1
kind: Deployment
metadata:name: nacos-server
spec:replicas: 1selector:matchLabels:app: nacos-servertemplate:metadata:labels:app: nacos-serverspec:containers:- env:- name: MODEvalue: standaloneimage: nacos/nacos-server:v2.2.0imagePullPolicy: Alwaysname: nacos-serverdnsPolicy: ClusterFirstrestartPolicy: Always# Nacos Server Service配置
---
apiVersion: v1
kind: Service
metadata:name: nacos-server
spec:ports:- port: 8848protocol: TCPtargetPort: 8848selector:app: nacos-servertype: ClusterIP
- spring-a 服务 YAML 配置:
apiVersion: apps/v1
kind: Deployment
metadata:name: spring-cloud-a
spec:replicas: 1selector:matchLabels:app: spring-cloud-azadigx-release-version: originaltemplate:metadata:labels:msePilotCreateAppName: spring-cloud-aapp: spring-cloud-azadigx-release-version: originalspec:containers:- env:- name: JAVA_HOMEvalue: /usr/lib/jvm/java-1.8-openjdk/jreimage: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-a:0.1-SNAPSHOTimagePullPolicy: Alwaysname: spring-cloud-aports:- containerPort: 20001livenessProbe:tcpSocket:port: 20001initialDelaySeconds: 10periodSeconds: 30
---
apiVersion: v1
kind: Service
metadata:name: spring-cloud-a-base
spec:ports:- name: httpport: 20001protocol: TCPtargetPort: 20001selector:app: spring-cloud-azadigx-release-version: original
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: spring-cloud-a
spec:ingressClassName: mserules:- host: example.comhttp:paths:- backend:service:name: spring-cloud-a-baseport:number: 20001path: /pathType: Prefix
- spring-b 服务 YAML 配置:
apiVersion: apps/v1
kind: Deployment
metadata:name: spring-cloud-b
spec:replicas: 1selector:matchLabels:app: spring-cloud-bzadigx-release-version: originalstrategy:template:metadata:labels:msePilotCreateAppName: spring-cloud-bapp: spring-cloud-bzadigx-release-version: originalspec:containers:- env:- name: JAVA_HOMEvalue: /usr/lib/jvm/java-1.8-openjdk/jreimage: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-b:0.1-SNAPSHOTimagePullPolicy: Alwaysname: spring-cloud-bports:- containerPort: 8080livenessProbe:tcpSocket:port: 20002initialDelaySeconds: 10periodSeconds: 30
- spring-c 服务 YAML 配置:
apiVersion: apps/v1
kind: Deployment
metadata:name: spring-cloud-c
spec:replicas: 1selector:matchLabels:app: spring-cloud-czadigx-release-version: originaltemplate:metadata:labels:msePilotCreateAppName: spring-cloud-capp: spring-cloud-czadigx-release-version: originalspec:containers:- env:- name: JAVA_HOMEvalue: /usr/lib/jvm/java-1.8-openjdk/jreimage: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-c:0.1-SNAPSHOTimagePullPolicy: Alwaysname: spring-cloud-cports:- containerPort: 8080livenessProbe:tcpSocket:port: 20003initialDelaySeconds: 10periodSeconds: 30
步骤三:新建环境并启用 MSE
- 在 ZadigX 上新建生产环境
- 执行以下命令启用 MSE,对灰度过程所有涉及到的命名空间(上图中为:mse-customer) 打上 mse-enable 标签。
kubectl label namespace <NAMESPACE> mse-enable=enabled
-
在生产环境中添加服务spring-a、spring-b、spring-c、nacos。
-
检查服务是否成功接入 MSE。在 ZadigX 环境中选择服务,比如spring-a,检查 Pod YAML 中是否成功注入one-pilot-initcontainer,如下图所示。
步骤四:配置 MSE 灰度发布工作流
-
新建发布工作流 mse-gray-workflow,添加任务,配置如下。
-
- MSE 灰度发布:用于部署灰度服务
- [可选]通用任务 :用于验证灰度后的新版本
- 下线 MSE 灰度:用于下线灰度服务
- 新建发布工作流 prod-workflow ,添加部署任务,用于执行生产发布,配置如下图所示。
工程师执行 MSE 灰度发布
多个灰度服务部署
执行 mse-gray-workflow,选择服务组件 spring-cloud-a和spring-cloud-c ,设置灰度标,选择对应的灰度镜像、副本数量、修改灰度服务 YAML 配置,点击执行即可完成灰度服务部署。
此处 spring-cloud-a 为流量入口,因此需要在灰度服务 YAML 中手动添加/修改 Service 和 MSE Ingress 资源的一些相关字段:
-
通过 MSE Ingress 的 annotations 设置灰度流量规则,并为灰度流量带上灰度标 Header
-
设置灰度路由规则的 backend.service.name 为其下的灰度 Service 名称
具体改动内容如下:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:annotations:mse.ingress.kubernetes.io/request-header-control-update: x-mse-tag graynginx.ingress.kubernetes.io/canary: "true"nginx.ingress.kubernetes.io/canary-by-header: x-user-idnginx.ingress.kubernetes.io/canary-by-header-value: "100"nginx.ingress.kubernetes.io/canary-weight: "0"creationTimestamp: nulllabels:zadigx-release-service-name: spring-azadigx-release-type: mse-grayzadigx-release-version: grayname: spring-cloud-a-mse-gray
spec:ingressClassName: mserules:- host: example.comhttp:paths:- backend:service:name: spring-cloud-a-mse-grayport:number: 20001path: /pathType: Prefix
status:loadBalancer: {}
---
apiVersion: v1
kind: Service
metadata:creationTimestamp: nulllabels:zadigx-release-service-name: spring-azadigx-release-type: mse-grayzadigx-release-version: grayname: spring-cloud-a-mse-gray
spec:ports:- name: httpport: 20001protocol: TCPtargetPort: 20001selector:app: spring-cloud-azadigx-release-service-name: spring-azadigx-release-type: mse-grayzadigx-release-version: gray
status:loadBalancer: {}
部署完成后,可在生产环境中查看灰度服务的运行状态和基本信息。
灰度结果验证
灰度服务部署完成后,自动执行新版本功能验证或通过其他业务方法验证灰度结果。
正式发布生产服务
灰度服务验证没有问题后,执行 prod-workflow 工作流,选择更新的服务及对应的镜像,即可更新生产服务。
灰度服务清理与下线
生产发布成功后,执行 mse-gray-workflow 工作流,选择需要下线的灰度标,即可下线对应的灰度服务。
总结
面向开发者的全链路灰度发布解决方案通过与阿里云 MSE 的联合,为企业提供云原生能力、自动化平台支持,显著提高发布效率和软件交付质量,为用户带来卓越体验。
参考链接:
[1] ACK 微服务接入 MSE
https://help.aliyun.com/document_detail/2360531.html*
*
[2] 创建 MSE 云原生网关
https://help.aliyun.com/document_detail/347638.html*
*
[3] MSE Ingress 访问容器服务
https://help.aliyun.com/document_detail/438003.html
文章来源: 本文转载自 KodeRover 微信公众号