Ambassador API 网关与 Argo 集成
灰度发布(金丝雀发布/Canary)是一种强大的策略,通过增量地向用户子集发布软件的新版本来降低生产风险。假设你推出了服务的 v1.1 版本,但它有一个 bug。不是立即将它暴露给所有的流量,而是通过将 v1.1 暴露给流量的一个子集(例如 5%)来开始发布过程。随着时间的推移,你的流量逐渐增加到 100%。在此期间,任何暴露的 bug 都仅限于你的用户子集。
虽然理论上很简单,但在实践中使用灰度发布需要将 CI 流水线与持续部署工作流(如 Argo)集成在一起,并使用 API 网关来管理到服务的流量。
Ambassador 是一个基于 Envoy 代理构建的开源 kubernetes 原生 API 网关和入口控制器。Ambassador 的常见用例包括路由 gRPC 流量、认证和速率限制。虽然 Ambassador 支持标准的 ingress 类,但大多数用户使用 Ambassador mapping 资源。mapping 资源定义了路由并支持大量的属性集,超出了 ingress 支持的标准集。下面是一个 mapping 示例:
apiVersion: getambassador.io/v2
kind: Mapping
metadata:
name: echo
spec:
prefix: /echo
rewrite: /echo
service: echo-stable:80
我们已经在 Argo Rollouts 和 Ambassador 之间建立了一个原生集成(代码)[1]。你现在可以创建一个 Rollout 资源来引用 Ambassador mapping:
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
name: echo-rollout
annotations:
spec:
replicas: 5
revisionHistoryLimit: 2
selector:
matchLabels:
app: echo
template:
metadata:
labels:
app: echo
spec:
containers:
- image: hashicorp/http-echo
args:
- "-text=VERSION 137"
- -listen=:8080
imagePullPolicy: Always
name: echo-v1
ports:
- containerPort: 8080
strategy:
canary:
stableService: echo-stable
canaryService: echo-canary
trafficRouting:
ambassador:
mapping:
- echo
steps:
- setWeight: 20
- pause: {duration: 10s}
- setWeight: 50
- pause: {duration: 10s}
- setWeight: 100
- pause: {duration: 10}
请注意上面粗体部分,它引用了上面定义的名为 echo 的 Ambassador mapping 资源。将这些配置应用到集群将启动 echo-canary 服务,该服务将把 20%的流量路由到 canary,持续 10 秒,然后在 10 秒内提升到 50%,然后再提升到 100%。
我们已经发布了一个关于如何使用 Edge Stack 部署 Argo 的教程[2]。目前,本教程依赖于 Argo Rollouts 的 Ambassador 版本。如果你有兴趣跟踪我们将该功能合并到 upstream 的进度,你可以查看这个pull 请求[3]。请试一下,并在Twitter[4]或Slack[5]分享你的使用体验!
[1]
集成(代码): https://github.com/datawire/argo-rollouts/
[2]
教程: https://www.getambassador.io/docs/latest/argo/
[3]
pull 请求: https://github.com/argoproj/argo-rollouts/pull/1025
[4]
Twitter: https://twitter.com/ambassadorlabs
[5]
Slack: http://a8r.io/Slack