分享免费的编程资源和教程

网站首页 > 技术教程 正文

微服务的发布实现方式1灰度实现(微服务实现原理)

goqiw 2025-05-05 15:41:23 技术教程 2 ℃ 0 评论

灰度发布支持的场景

1.新功能的逐步验证和反馈

场景描述:

对于一些 新功能,开发团队不希望一次性将其发布给所有用户,因为新功能可能会导致未知的错误、用户体验问题或性能问题。通过灰度发布,可以将该新功能逐步推送给部分用户,收集他们的反馈,并确保新功能能够顺利运行。

2.性能优化验证

场景描述:

在对现有应用进行性能优化(如数据库查询优化、缓存优化、系统架构调整等)时,开发团队希望通过灰度发布逐步验证新版本的性能表现,确保优化不会对系统的其他部分或用户产生负面影响。

3.高风险功能的逐步验证

场景描述:

有些功能或改动对系统稳定性、用户体验、数据一致性等方面有较大影响,开发团队希望通过灰度发布在有限范围内逐步验证,以降低失败风险。


灰度发布

*argo rollout 介绍和使用

Argo Rollouts 是一个 Kubernetes Operator 实现,它为 Kubernetes 提供更加高级的部署能力,如蓝绿、金丝雀、金丝雀分析、实验和渐进式交付功能,为云原生应用和服务实现自动化、基于 GitOps 的逐步交付。

支持如下特性:

  • 蓝绿更新策略
  • 金丝雀更新策略
  • 更加细粒度、加权流量拆分
  • 自动回滚
  • 手动判断
  • 可定制的指标查询和业务 KPI 分析
  • Ingress 控制器集成:NGINX,ALB
  • 服务网格集成:Istio,Linkerd,SMI
  • Metrics 指标集成:Prometheus、Wavefront、Kayenta、Web、Kubernetes Jobs、Datadog、New Relic、Graphite、InfluxDB

如下图为argorollout的架构图形

相关组件如下:

Rollout Controller

这是主控制器,用于监控集群中的事件并在rollout类型的资源发生变化时做出反应。控制器读取rollout的所有的信息,并实集群处于rollout定义中描述的相公状态。argo Rollouts 不会篡改或响应正常 Deployment 资源上发生的任何变更,这意味着你可以在一个使用其他方法部署应用的集群中安装 Argo Rollouts。

Rollout 资源

Rollout 资源是 Argo Rollouts 引入和管理的一种自定义 Kubernetes 资源,它与原生的 Kubernetes Deployment 资源基本兼容,但有额外的字段来控制更加高级的部署方法,如金丝雀和蓝/绿部署。Argo Rollouts 控制器将只对 Rollout 资源中的变化做出反应,不会对正常的 Deployment 资源做任何事情,所以如果你想用 Argo Rollouts 管理你的 Deployment,你需要将你的 Deployment 迁移到 Rollouts。

AnalysisTemplate 与 AnalysisRun

Analysis 是一种自定义 Kubernetes 资源,它将 Rollout 连接到指标提供程序,并为某些指标定义特定阈值,这些阈值将决定 Rollout 是否成功。对于每个 Analysis,你可以定义一个或多个指标查询及其预期结果,如果指标查询正常,则 Rollout 将继续发布;如果指标显示失败,则自动回滚;如果指标无法提供成功/失败的结果,则暂停发布。

为了执行分析,Argo Rollouts 提供了两个自定义的 Kubernetes 资源:AnalysisTemplateAnalysisRun

AnalysisTemplate 包含有关要查询哪些指标的说明。附加到 Rollout 的实际结果是 AnalysisRun 自定义资源,可以在特定 的 Rollout 上定义 AnalysisTemplate,也可以在集群上定义全局的 AnalysisTemplate,以供多个 Rollout 共享作为 ClusterAnalysisTemplate,而 AnalysisRun 资源的范围仅限于特定的 rollout。

请注意,在 Rollout 中使用分析和指标是完全可选的,你可以通过 API 或 CLI 手动暂停和继续发布,也可以使用其他外部方法(例如冒烟测试)。你不需要仅使用 Argo Rollouts 的指标解决方案,你还可以在 Rollout 中混合自动(即基于分析)和手动步骤。

除了指标之外,你还可以通过运行 Kubernetes Job 或运行 webhook 来决定发布的成功与否。

Metric Providers

Argo Rollouts 包括多个流行指标提供程序的本机集成,您可以在分析资源中使用这些提供程序来自动升级或回滚部署。有关特定设置选项,请参阅每个提供商的文档。

Argo Rollouts 包括几个流行的指标提供者的集成,你可以在分析资源中使用,来自动升级或回滚发布。

安装与使用

$ kubectl create namespace argo-rollouts

$ kubectl apply -n argo-rollouts -f https://github.com/argoproj/argo-rollouts/releases/download/v1.6.0/install.yaml

下载客户端

# https://ghproxy.com/https://github.com//argoproj/argo-rollouts/releases/download/v1.6.0/kubectl-argo-rollouts-linux-amd64 $ curl -LO https://github.com/argoproj/argo-rollouts/releases/download/v1.6.0/kubectl-argo-rollouts-linux-amd64

$ chmod +x ./kubectl-argo-rollouts-linux-amd64

$ sudo mv ./kubectl-argo-rollouts-linux-amd64 /usr/local/bin/kubectl-argo-rollouts

root@test-k8s-master1:~/test/argo-rollout# kubectl argo rollouts version
kubectl-argo-rollouts: v1.8.2+0775302
  BuildDate: 2025-03-21T19:14:39Z
  GitCommit: 0775302f6fd901f557a0c14be327e31ce75bb45a
  GitTreeState: clean
  GoVersion: go1.23.7
  Compiler: gc
  Platform: linux/amd64

实现金丝雀发布(灰度发布)

apiVersion: argoproj.io/v1alpha1 kind: Rollout metadata: name: myapp-rollout namespace: istio-demo spec: replicas: 5 strategy: canary: steps: - setWeight: 10 - pause: {} - setWeight: 15 # 这里将流量从 10% 增加到 15% - pause: {duration: 10} - setWeight: 20 # 进一步增加流量 - pause: {duration: 10} - setWeight: 30 # 继续增加 - pause: {duration: 10} - setWeight: 40 revisionHistoryLimit: 2 selector: matchLabels: app: front-tomcat template: metadata: labels: app: front-tomcat spec: containers: - name: front-tomcat image:
harbor.assistfc.com/middleware/tomcat-7.0:latest ports: - containerPort: 80`

对应svc的资源如下

# basic-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: rollouts-nginx
spec:
  ports:
    - port: 80
      targetPort: http
      protocol: TCP
      name: http
  selector:
    app: front-tomcat

常见的操作命令

查看更新rollout的版本

查看
root@test-k8s-master1:~/istio-demo/huidu-argorollout# kubectl argo rollouts get rollout myapp-rollout -n istio-demo 
Name:            myapp-rollout
Namespace:       istio-demo
Status:           Healthy
Strategy:        Canary
  Step:          9/9
  SetWeight:     100
  ActualWeight:  100
Images:          harbor.assistfc.com/middleware/tomcat-7.0:latest-1 (stable)
Replicas:
  Desired:       5
  Current:       5
  Updated:       5
  Ready:         5
  Available:     5

NAME                                      KIND        STATUS        AGE    INFO
 myapp-rollout                           Rollout      Healthy     6h3m   
├──# revision:2                                                            
│  └── myapp-rollout-9cc8fbbf9           ReplicaSet   Healthy     5h2m   stable
│     ├──□ myapp-rollout-9cc8fbbf9-kf6wl  Pod          Running     5h2m   ready:1/1
│     ├──□ myapp-rollout-9cc8fbbf9-7vrdg  Pod          Running     4h59m  ready:1/1
│     ├──□ myapp-rollout-9cc8fbbf9-4zq2k  Pod          Running     4h59m  ready:1/1
│     ├──□ myapp-rollout-9cc8fbbf9-6hqsd  Pod          Running     4h59m  ready:1/1
│     └──□ myapp-rollout-9cc8fbbf9-gr87n  Pod          Running     4h59m  ready:1/1
└──# revision:1                                                            
   └── myapp-rollout-7f4db77cf7          ReplicaSet  o ScaledDown  6h3m   
   更新对应的rollout
   kubectl  argo rollouts set image  myapp-rollout  myapp-rollout=harbor.assistfc.com/middleware/tomcat-7.0:latest
   root@test-k8s-master1:~/istio-demo/huidu-argorollout# kubectl argo rollouts -n istio-demo get rollout myapp-rollout
Name:            myapp-rollout
Namespace:       istio-demo
Status:           Paused
Message:         CanaryPauseStep
Strategy:        Canary
  Step:          1/9
  SetWeight:     10
  ActualWeight:  16
Images:          harbor.assistfc.com/middleware/tomcat-7.0:latest (canary)
                 harbor.assistfc.com/middleware/tomcat-7.0:latest-1 (stable)
Replicas:
  Desired:       5
  Current:       6
  Updated:       1
  Ready:         6
  Available:     6

NAME                                       KIND        STATUS     AGE    INFO
 myapp-rollout                            Rollout      Paused   6h12m  
├──# revision:3                                                          
│  └── myapp-rollout-7f4db77cf7           ReplicaSet   Healthy  6h12m  canary
│     └──□ myapp-rollout-7f4db77cf7-gp5zh  Pod          Running  59s    ready:1/1
└──# revision:2                                                          
   └── myapp-rollout-9cc8fbbf9            ReplicaSet   Healthy  5h11m  stable
      ├──□ myapp-rollout-9cc8fbbf9-kf6wl   Pod          Running  5h11m  ready:1/1
      ├──□ myapp-rollout-9cc8fbbf9-7vrdg   Pod          Running  5h9m   ready:1/1
      ├──□ myapp-rollout-9cc8fbbf9-4zq2k   Pod          Running  5h8m   ready:1/1
      ├──□ myapp-rollout-9cc8fbbf9-6hqsd   Pod          Running  5h8m   ready:1/1
      └──□ myapp-rollout-9cc8fbbf9-gr87n   Pod          Running  5h8m   ready:1/1
      让发布的  东西继续运行
      root@test-k8s-master1:~/istio-demo/huidu-argorollout# kubectl argo rollouts promote myapp-rollout -n istio-demo              
rollout 'myapp-rollout' promoted
root@test-k8s-master1:~/istio-demo/huidu-argorollout# kubectl argo rollouts -n istio-demo get rollout myapp-rollout
Name:            myapp-rollout
Namespace:       istio-demo
Status:           Paused
Message:         CanaryPauseStep
Strategy:        Canary
  Step:          3/9
  SetWeight:     15
  ActualWeight:  16
Images:          harbor.assistfc.com/middleware/tomcat-7.0:latest (canary)
                 harbor.assistfc.com/middleware/tomcat-7.0:latest-1 (stable)
Replicas:
  Desired:       5
  Current:       6
  Updated:       1
  Ready:         6
  Available:     6

NAME                                       KIND        STATUS     AGE    INFO
 myapp-rollout                            Rollout      Paused   6h17m  
├──# revision:3                                                          
│  └── myapp-rollout-7f4db77cf7           ReplicaSet   Healthy  6h17m  canary
│     └──□ myapp-rollout-7f4db77cf7-gp5zh  Pod          Running  5m24s  ready:1/1
└──# revision:2                                                          
   └── myapp-rollout-9cc8fbbf9            ReplicaSet   Healthy  5h16m  stable
      ├──□ myapp-rollout-9cc8fbbf9-kf6wl   Pod          Running  5h16m  ready:1/1
      ├──□ myapp-rollout-9cc8fbbf9-7vrdg   Pod          Running  5h13m  ready:1/1
      ├──□ myapp-rollout-9cc8fbbf9-4zq2k   Pod          Running  5h13m  ready:1/1
      ├──□ myapp-rollout-9cc8fbbf9-6hqsd   Pod          Running  5h13m  ready:1/1
      └──□ myapp-rollout-9cc8fbbf9-gr87n   Pod          Running  5h13m  ready:1/1
     

至此实现灰度发布就ok了



Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表