使用 Flagger 自动执行金丝雀发布
Flagger 可以自动分析 Kubernetes Deployment 的金丝雀版本。它会协调候选版本和主版本、加权路由、测试流量、指标以及提升或回滚。
本指南配置的金丝雀发布每次增加 10% 流量,最高达到 30%;要求请求成功率为 99%,最大请求耗时为 500 毫秒。请选择使用 HTTPRoute 的 Gateway API 提供方,或使用 ApisixRoute 的 APISIX 提供方,并在整篇指南中保持一致。
Gateway API 将 Flagger 集成列为公开预览阶段。采用 Gateway API 路径前,请在非生产集群中验证具体的控制器、网关和 Flagger 版本,以及初始化、提升和回滚行为。
了解 Flagger 管理的资源
对于名为 podinfo 的目标 Deployment,Flagger 会管理以下资源:
| 资源 | 用途 |
|---|---|
podinfo Deployment | 源 Pod 模板;Flagger 初始化后会将其缩容,并用于候选版本 |
podinfo-primary Deployment | 最近一次成功提升的 Pod 模板 |
podinfo、podinfo-primary 和 podinfo-canary Service | 分别作为公共、稳定版和金丝雀 Service |
生成的 HTTPRoute 或 ApisixRoute | 由 Flagger 控制稳定版和金丝雀权重 |
不要把生成的资源加入其他 Helm Release、Kustomize Base 或 GitOps 应用。请继续修改源 Deployment;Flagger 会把成功的变更复制到主 Deployment。
提供方决定 Flagger 如何构建发布 Route:
- 使用
gatewayapi:v1时,Flagger 根据Canary中的主机名和Gateway引用生成名为podinfo的HTTPRoute。 - 使用
apisix时,Flagger 把源ApisixRoute复制为名为podinfo-podinfo-canary的生成 Route。
前提条件
- 完成设置 Ingress Controller 和网关。
- 安装 Helm 和
kubectl。 - 确保网关能够访问应用命名空间中的 Service。
- 使用
HTTPRoute时,创建一个状态为Programmed=True的Gateway,其监听器允许应用命名空间中的 Route。 - 使用
ApisixRoute时,确保能够安全修改集群范围的默认IngressClass。 - 使用已公开 APISIX Prometheus 指标的 APISIX 网关或 API7 Gateway。
以下命令使用 Flagger Chart 1.44.0 和负载测试器 Chart 0.38.0。如果使用更新版本,请先查看发布说明并验证兼容性。
公开 APISIX 指标
分析会查询 apisix_http_status 和 apisix_http_latency_bucket。稍后安装的 Prometheus 服务器通过标准抓取注解发现网关 Pod。
如果使用 Chart 2.16.0 安装 APISIX,请把以下配置添加到网关 Release Values 中:
apisix:
prometheus:
enabled: true
podAnnotations:
prometheus.io/scrape: "true"
prometheus.io/port: "9091"
prometheus.io/path: /apisix/prometheus/metrics
对于 API7 Gateway Chart 3.10.11,请改为添加以下配置:
pluginAttrs:
prometheus:
enable_export_server: true
export_addr:
ip: 0.0.0.0
port: 9091
apisix:
podAnnotations:
prometheus.io/scrape: "true"
prometheus.io/port: "9091"
prometheus.io/path: /apisix/prometheus/metrics
显式配置 API7 导出地址后,Prometheus Pod 能够访问该端点,而不再局限于网关 Pod 内部。请通过负责网关 Release 的 Helm 或 GitOps 工作流应用这些配置。不要对 GitOps 管理的 Release 单独运行 helm upgrade。
如果使用其他 Chart 版本或 APISIX 软件包,请在应用前确认 Prometheus 属性和 Pod 注解的 Values 路径。不同 Chart 的 Values 路径并不通用。
验证网关 Pod 注解:
kubectl get pods --namespace <gateway-namespace> \
--selector <gateway-pod-label-selector> \
-o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.metadata.annotations.prometheus\.io/scrape}{"\t"}{.metadata.annotations.prometheus\.io/port}{"\n"}{end}'
对于上述 Chart 版本,APISIX 使用 app.kubernetes.io/name=apisix,API7 Gateway 使用 app.kubernetes.io/name=gateway。
从网关 Pod 转发指标端口,并确认指标可用:
kubectl port-forward pod/<gateway-pod> \
9091:9091 \
--namespace <gateway-namespace>
如果网关 Chart 公开了指标 Service,也可以改为转发 Service 端口:
kubectl port-forward service/<gateway-metrics-service> \
9091:9091 \
--namespace <gateway-namespace>
在另一个终端中:
curl "http://127.0.0.1:9091/apisix/prometheus/metrics"
只有当端点返回 Prometheus 文本指标后,才能继续。