渐进式交付实践:通过 Argo Rollouts 和 FSM Gateway 实现金丝雀发布

ops/2024/11/14 19:50:14/

渐进式交付(Progressive delivery)是一种软件发布策略,旨在更安全、更可控地将新版本软件逐步推出给用户。它是持续交付的进一步提升,允许开发团队在发布新版本时拥有更细粒度的控制,例如可以根据用户反馈、性能指标和其他关键数据来调整发布过程。渐进式交付通过利用一系列现代部署方案如蓝绿部署(Blue-Green Deployments)、金丝雀发布(Canary Releases)等让开发团队能够更灵活地管理风险,同时加快新功能的发布速度。

Argo Rollouts 包括一个 Kubernetes控制器 和一组 CRD,提供如蓝绿色、金丝雀、金丝雀分析、体验等高级部署功能和 Kubernetes 的渐进交付功能。

之前曾分享过 使用 Argo Rollouts 和服务网格实现自动可控的金丝雀发布(彼时的服务网格现已更名为 FSM),这是通过服务网格技术实现了东西向流量的金丝雀发布。虽然以此可以确保内部服务之间的平滑过渡,但这并不足以保证最终用户体验的质量。我们还需要手段来控制新版本对最终用户的可变性及影响,因此对于南北向流量 – 入口的网络流量 – 金丝雀发布变得不可或缺。

对于 Kubernetes 的入口流量管理,常见的有如 Ingress Controller、Gateway API。作为服务网格 FSM 组件之一的 FSM Gateway 是一个开源的 Kubernetes Gateway API 实现,它使用可编程应用引擎 Pipy 作为代理配置路由和策略来管理入口流量。关于 FSM Gateway 的使用,可以查看之前的 系列文章。

rollouts-plugin-trafficrouter-gatewayapi 是 Argo Rollouts 的一个插件它实现了 Kubernetes Gateway API 规范。使用它可以使用 FSM Gateway 实现渐进式的交付,当然你可以使用其他的实现。

今天就以 FSM Gateway 为例介绍如何使用 Argo Rollouts 进行南北向流量的金丝雀发布。

前置条件

  • Kubernetes 集群,最低版本 1.23
  • kubectl cli

准备环境

安装 FSM Gateway

我们可以通过 FSM CLI 来安装 FSM Gateway,参考 文档 下载并安装 FSM CLI,当前最新的版本为 1.2.3。

system=$(uname -s | tr '[:upper:]' '[:lower:]')
arch=$(uname -m | sed -E 's/x86_/amd/' | sed -E 's/aarch/arm/')
release=v1.2.3
curl -L https://github.com/flomesh-io/fsm/releases/download/$release/fsm-$release-$system-$arch.tar.gz | tar -vxzf -
./$system-$arch/fsm version
cp ./$system-$arch/fsm /usr/local/bin/fsm

使用下面的命令安装 FSM Gateway,作为 服务网格 FSM 的众多组件之一,FSM Gateway 的运行会由 FSM 控制器管理。

fsm install \--set=fsm.fsmGateway.enabled=true

如果你已经安装了 FSM,可以通过下面的命令来启用网关。

fsm gateway enable

在成功安装 FSM Gateway 之后,可以看到 gateway class fsm-gatweay-cls 已经就绪。

kubectl get gatewayclass
NAME              CONTROLLER                      ACCEPTED   AGE
fsm-gateway-cls   flomesh.io/gateway-controller   True       2m35s

与 FSM Gateway 一同安装的还有 Gateway API 的 CRD。

创建 Gateway 对象

安装了 FSM Gateway 并不意味着马上可以开始接管流量,我们还需要创建 Gateway 对象。

kubectl apply -n default -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1beta1
kind: Gateway
metadata:name: simple-fsm-gateway
spec:gatewayClassName: fsm-gateway-clslisteners:- protocol: HTTPport: 80name: httpallowedRoutes:namespaces:from: Same
EOF

获取 Gateway 的 IP 地址。

export GATEWAY_IP=$(kubectl get svc -n default -l app=fsm-gateway -o jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}')

安装 Argo Rollouts

使用下面的命令在集群中安装最新的 Argo Rollouts,其运行在命名空间 argo-rollouts 中。

kubectl create namespace argo-rollouts
kubectl apply -n argo-rollouts -f https://github.com/argoproj/argo-rollouts/releases/latest/download/install.yaml

为了 Argo Rollouts 能够通过修改路由来控制流量,需要为其创建 ClusterRoleClusterRoleBinding。(这个操作在每个集群只需一次即可)

kubectl apply -f - <<EOF
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:name: gateway-controller-rolenamespace: argo-rollouts
rules:- apiGroups:- "*"resources:- "*"verbs:- "*"
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: gateway-admin
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: gateway-controller-role
subjects:- namespace: argo-rolloutskind: ServiceAccountname: argo-rollouts
EOF
安装 kubectl argo 插件

使用 kubectl argo 插件可以通过命令行对发布进行操作。

在 macOS 下,其他平台参考 官方安装文档。

brew install argoproj/tap/kubectl-argo-rollouts

通过下面的命令启动 Argo Rollouts Dashboard,在浏览器中打开 [http://localhost:3100/rollouts](http://localhost:3100/rollouts) 就可访问 Dashboard。

kubectl argo rollouts dashboard

安装 Rollouts Gateway API 插件

安装 Gateway API 插件需要在 Configmap 中指定插件的下载地址,执行下面的命令后 Rollouts 的控制面会从该地址下载并安装。截止本文发布,插件的最新版本是 0.2.0。

注意,请安装对应平台的插件。

kubectl apply -f - <<EOF
apiVersion: v1
kind: ConfigMap
metadata:name: argo-rollouts-config # must be so namenamespace: argo-rollouts # must be in this namespace
data:trafficRouterPlugins: |-- name: "argoproj-labs/gatewayAPI"location: "https://github.com/argoproj-labs/rollouts-plugin-trafficrouter-gatewayapi/releases/download/v0.2.0/gateway-api-plugin-linux-amd64"
EOF

创建 Service

创建两个 Service argo-rollouts-stable-serviceargo-rollouts-canary-service,这两个 Service 将作为 Gateway 的后端服务,由 Rollouts 控制到各个 Service 的流量权重。

kubectl apply -n default -f - <<EOF
apiVersion: v1
kind: Service
metadata:name: argo-rollouts-stable-service
spec:ports:- port: 80targetPort: httpprotocol: TCPname: httpselector:app: rollouts-demo
---
apiVersion: v1
kind: Service
metadata:name: argo-rollouts-canary-service
spec:ports:- port: 80targetPort: httpprotocol: TCPname: httpselector:app: rollouts-demo
EOF

创建 HTTP 路由

有了服务之后,就是在 Gateway 创建对应的 HTTPRoute 配置路由,默认将所有的流量都代理到稳定版。

kubectl apply -n default -f - <<EOF
kind: HTTPRoute
apiVersion: gateway.networking.k8s.io/v1beta1
metadata:name: argo-rollouts-http-route
spec:parentRefs:- name: simple-fsm-gatewayport: 80hostnames:- "demo.example.com"rules:- matches:- path:type: PathPrefixvalue: /  backendRefs:- name: argo-rollouts-stable-servicekind: Serviceport: 100- name: argo-rollouts-canary-servicekind: Serviceport: 0
EOF

创建 Rollout

创建资源 Rollout:

  • 使用策略 canary
  • 指定创面创建的两个 Service 分别作为 stableServicecanaryService
  • 流量路由使用插件 argoproj-labs/gatewayAPI,以及操作的 HTTPRouteargo-rollouts-http-route
  • 指定发布的流程 steps
  • 最终要的就是 template 中配置我们的应用,也就是稳定版,与 Deployment 的 template 一致。
kubectl apply -n default -f- <<EOF
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:name: rollouts-demo
spec:replicas: 3strategy:canary:canaryService: argo-rollouts-canary-service # our created canary servicestableService: argo-rollouts-stable-service # our created stable servicetrafficRouting:plugins:argoproj-labs/gatewayAPI:httpRoute: argo-rollouts-http-route # our created httproutenamespace: defaultsteps:- setWeight: 30- pause: { duration: 30s }- setWeight: 60- pause: { duration: 30s }- setWeight: 100- pause: { duration: 30s }revisionHistoryLimit: 2selector:matchLabels:app: rollouts-demotemplate:metadata:labels:app: rollouts-demospec:containers:- name: rollouts-demoimage: kostiscodefresh/summer-of-k8s-app:v1ports:- name: httpcontainerPort: 8080protocol: TCPresources:requests:memory: 32Micpu: 5m
EOF

创建完成后便通过命令行访问示例应用了。

curl -H "host: demo.example.com" $GATEWAY_IP/callme

此时会看到如下的结果,说明正在运行的 1.0 版本。

<div class='pod' style='background:#44B3C2'> ver: 1.0</div>

执行金丝雀发布

接着我们修改 Rollout,将示例应用的镜像更新为 2.0 版本。

kubectl patch rollout rollouts-demo -n default \--type='json' -p='[{"op": "replace", "path": "/spec/template/spec/containers/0/image", "value":"kostiscodefresh/summer-of-k8s-app:v2"}]'

可以通过下命令持续查看示例应用的运行。

while true; do curl -H "host: demo.example.com" $GATEWAY_IP/callme; done

当然,在 Argo Rollouts 的 Dashboard 中我们可以更加直观地看到 Rollout 的执行流程。

最终,rollouts-demo 完成升级,旧版本的实例完全退出。

关于 Flomesh

Flomesh(易衡科技)成立于 2018 年,自主研发并开源了高性能可编程代理 Pipy(https://github.com/flomesh-io/pipy)。以 Pipy 为基础,Flomesh 研发了软件负载均衡、服务网格两款软件产品。为工信部认证的可信云产品、可信开源项目。

Flomesh 核心竞争力来自完全自研的核心组件 Pipy,该组件高性能、高可靠、低延迟、可编程、可扩展、低依赖,采用 C++ 开发,内置自研的 JS 引擎,支持适用 JS 脚本做扩展开发。支持包括 x86、arm、龙芯、海光等硬件 CPU 架构;支持 Linux、FreeBSD、macOS、Windows、OpenWrt 等多种核心的操作系统。

Flomesh 成立以来,以技术为根基、以客户为导向,产品被应用在头部股份制商业银行总行、大型保险公司、运营商总部以及研究院等众多客户和多个场景。

在这里插入图片描述


http://www.ppmy.cn/ops/6150.html

相关文章

机器学习基本流程

Jupyter Notebook 代码连接&#xff1a; machine_learning_demo machine_learning_ensembles Step 1: Imports and Configuration import pandas as pd import numpy as np import copy import json import pickle import joblib import lightgbm as lgb import optuna impor…

【QT教程】QT6QFuture与并发

QT6QFuture与并发 使用AI技术辅助生成 QT界面美化视频课程 QT性能优化视频课程 QT原理与源码分析视频课程 QT QML C扩展开发视频课程 免费QT视频课程 您可以看免费1000个QT技术视频 免费QT视频课程 QT统计图和QT数据可视化视频免费看 免费QT视频课程 QT性能优化视频免费看 免…

【Django】调用django的pbkdf2_sha256加密算法测试

基于django搭建的系统中&#xff0c;用到pbkdf2_sha256&#xff08;&#xff08;Password-Based Key Derivation Function 2&#xff09;&#xff09;加密算法&#xff0c;这里做些代码测试、总结。 PBKDF2简介 PBKDF2是一种基于密码的密钥派生函数&#xff0c;用于从用户提供的…

探索Java设计模式:策略模式

探索Java设计模式&#xff1a;深入理解与实践策略模式 在软件开发中&#xff0c;设计模式作为一种最佳实践&#xff0c;旨在解决特定场景下的常见设计问题&#xff0c;提高代码的可复用性、可扩展性和可维护性。本文将聚焦于Java编程语言中的一个核心设计模式——策略模式&…

李沐45_SSD实现——自学笔记

主体思路&#xff1a; 1.生成一堆锚框 2.根据真实标签为每个锚框打标(类别、偏移、mask) 3.模型为每个锚框做一个预测(类别、偏移) 4.计算上述二者的差异损失&#xff0c;以更新模型weights 先读取一张图像。 它的高度和宽度分别为561和728像素。 %matplotlib inline import …

工业电脑在ESOP工作站行业应用

ESOP工作站行业应用 项目背景 E-SOP是实现作业指导书电子化&#xff0c;并统一管理和集中控制的一套管理信息平台。信迈科技的ESOP终端是一款体积小巧功能齐全的高性价比工业电脑&#xff0c;上层通过网络与MES系统连接&#xff0c;下层连接显示器展示作业指导书。ESOP控制终…

电视音频中应用的音频放大器

电视机声音的产生原理是将电视信号转化为声音&#xff0c;然后通过扬声器将声音播放出来。当我们打开电视并选择频道时&#xff0c;电视机首先从天线或有线电视信号中获取声音信号。声音信号经过放大器放大之后&#xff0c;就能够通过扬声器发出声音。电视机声音的产生原理和音…

【设计模式】组合模式

目录 什么是组合模式 代码实现 什么是组合模式 Java中的组合模式&#xff08;Composite Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许将对象组合成树形结构以表示部分-整体的层次结构。组合模式使得客户端对单个对象和组合对象的处理具有一致性&#xff0c;因…