Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Flagger 在 Kubernetes 集群上是如何工作的?

Flagger 在 Kubernetes 集群上是如何工作的?

原创
作者头像
philentso
修改于 2022-12-26 07:10:50
修改于 2022-12-26 07:10:50
2.3K00
代码可运行
举报
文章被收录于专栏:philentsophilentso
运行总次数:0
代码可运行

通过前面一节的 Flagger基本学习,这节学习它的工作原理,以帮助加深理解应用!

Flagger 是如何工作的-工作原理?

可以通过一个名为 canary 的自定义资源来配置 Kubernetes 工作负载的自动化发布过程.

Canary resource

Canary 自定义资源定义了在 Kubernetes 上运行的应用程序的释放过程,并且可以across clusters, service meshes 和 ingress providers 进行移植.

对于名为 podinfo 的 deployment ,带有渐进式流量转移的 Canary 发布可以定义为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: flagger.app/v1beta1
kind: Canary
metadata:
  name: podinfo
spec:
  targetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: podinfo
  service:
    port: 9898
  analysis:
    interval: 1m
    threshold: 10
    maxWeight: 50
    stepWeight: 5
    metrics:
      - name: request-success-rate
        thresholdRange:
          min: 99
        interval: 1m
      - name: request-duration
        thresholdRange:
          max: 500
        interval: 1m
    webhooks:
      - name: load-test
        url: http://flagger-loadtester.test/
        metadata:
          cmd: "hey -z 1m -q 10 -c 2 http://podinfo-canary.test:9898/"

当 deployment 一个新版本的应用时,Flagger 会逐渐将流量转移到 Canary,同时测量请求成功率以及平均响应时间,可以通过自定义指标、验收和负载测试来扩展 Canary 的分析,以加强应用发布过程的验证过程

如果在同一个集群中运行多个服务网格或入口控制器,可以用 spec.provider 覆盖特定 canary 的全局提供者

Canary target

Canary 资源可以针对 Kubernetes Deployment 或 DaemonSet

Kubernetes Deployment 的例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spec:
  progressDeadlineSeconds: 60
  targetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: podinfo
  autoscalerRef:
    apiVersion: autoscaling/v2beta2
    kind: HorizontalPodAutoscaler
    name: podinfo

基于上述配置,Flagger 生成了以下 Kubernetes对象:

. deployment/<targetRef.name>-primary

. hpa/<autoscalerRef.name>-primary

primary deployment 被认为是应用程序的稳定版本,默认情况下,所有流量都被路由到这个版本,而 target deployment 被扩展为 0, Flagger 会检测到target deployment 的变化(包括secrets 和 configmaps),并在将新版本提升为 primary 版本之前进行 Canary 分析.

注意,target deployment 必须有一个单一的 label selector,格式为 app: <DEPLOYMENT-NAME>:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: apps/v1
kind: Deployment
metadata:
  name: podinfo
spec:
  selector:
    matchLabels:
      app: podinfo
  template:
    metadata:
      labels:
        app: podinfo

除了 app 之外,Flagger 还支持 name 和 app.kubernetes.io/name 选择器, 如果使用不同的约定,可以在 Flagger deployment 清单中容器 args 下的 -selector-labels=my-app-label 命令标志来指定标签,或者在用 Helm 安装 Flagger 时设置 --set selectorLabels=my-app-label

如果 target deployment 使用 secrets 或 configmaps,Flagger 将使用 -primary 后缀创建每个对象的副本并在 primary deployment 中引用这些对象,

如果用 flagger.app/config-tracking: disabled 来注释 ConfigMap 或 Secret,Flagger 将在 primary deployment 中使用相同的对象而不是制作 primary 副本,

可以在 Flagger deployment 清单中的 containers args 下使用 -enable-config-tracking=false 命令标志全局禁用 secrets/configmaps 跟踪,或者在用 Helm 安装 Flagger 时设置,

-set configTracking.enabled=false,但使用每个 Secret/ConfigMap 注释禁用 config-tracking 可能更符合使用情况

autoscaler 的引用是可选的,当指定时, Flagger 将暂停流量的增加,同时 target 和 primary deployment 被放大或缩小, HPA 可以帮助减少在 canary 分析过程中的资源使用,

当指定 autoscaler 参考时,对 autoscaler 的任何改变只有在 deployment 的 rollout 开始并成功完成时才会在 primary autoscaler 中被激活,

可以选择创建两个 HPA,一个用于 canary,一个用于 primary,以更新 HPA 而不做新的展开, 由于 Canary 的 deployment 将被缩减到 0,Canary 上的 HPA 将不活跃

注意: Flagger 需要 HPA 的 autoscaling/v2 或 autoscaling/v2beta2 API 版本

进度截止日期表示 Canary deployment 在回滚前取得进展的最大时间(秒),默认为 10 分钟。

Canary service

Canary 资源决定了 target 工作负载在集群内的暴露方式, Canary target 应该暴露一个 TCP 端口,该端口将被 Flagger 用来创建 ClusterIP 服务:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spec:
  service:
    name: podinfo
    port: 9898
    portName: http
    appProtocol: http
    targetPort: 9898
    portDiscovery: true

来自 target 工作负载的容器端口应该与 service.port 或 service.targetPort 匹配, service.name 是可选的,默认为 spec.targetRef.name, service.targetPort 可以是一个容器端口号或名称service.portName 是可选的(默认为 http),如果工作负载使用 gRPC,则将端口名称设为 grpc, service.appProtocol 是可选的,更多细节可以在 这里 找到

如果启用了端口发现功能,Flagger 会扫描 target 工作负载并提取容器端口,但不包括 canary service 和 service mesh sidecar 端口中指定的端口, 这些端口将在生成 ClusterIP 服务时使用。

基于 canary 规格的服务,Flagger 创建以下 Kubernetes ClusterIP 服务:

. <service.name>.<namespace>.svc.cluster.local

代码语言:txt
AI代码解释
复制
selector app=<name>-primary

. <service.name>-primary.<namespace>.svc.cluster.local

代码语言:txt
AI代码解释
复制
selector app=<name>-primary

. <service.name>-canary.<namespace>.svc.cluster.local

代码语言:txt
AI代码解释
复制
selector app=<name>

这确保了到 podinfo.test:9898 的流量将被路由到应用程序的最新稳定版本, podinfo-canary.test:9898 地址只在 canary 分析期间可用,可用于一致性测试或负载测试

可以配置 Flagger 来为生成的服务设置annotations 和 labels:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spec:
  service:
    port: 9898
    apex:
      annotations:
        test: "test"
      labels:
        test: "test"
    canary:
      annotations:
        test: "test"
      labels:
        test: "test"
    primary:
      annotations:
        test: "test"
      labels:
        test: "test"

请注意,apex 注解被添加到生成的 Kubernetes 服务和生成的 service mesh/ingress 对象, 这允许在 Istio VirtualService 和 TraefikServices 中使用外部 DNS

要注意 这里 的配置冲突

除了端口映射和元数据,service specification 可以包含 URI 匹配和重写规则、超时和重试策略:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spec:
  service:
    port: 9898
    match:
      - uri:
          prefix: /
    rewrite:
      uri: /
    retries:
      attempts: 3
      perTryTimeout: 1s
    timeout: 5s

当使用 Istio 作为网格提供者时,还可以指定 HTTP头操作、CORS 和流量策略、Istio 网关和 hosts, Istio 的路由配置可以在 这里 找到

Canary status

可以使用 kubectl 来获取集群范围内 canary deployment 的当前状态:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl get canaries --all-namespaces

状态条件反映了 Canary 分析的最后已知状态:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl -n test get canary/podinfo -oyaml | awk '/status/,0'

一个成功的 rollout 状态:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
status:
  canaryWeight: 0
  failedChecks: 0
  iterations: 0
  lastAppliedSpec: "14788816656920327485"
  lastPromotedSpec: "14788816656920327485"
  conditions:
  - lastTransitionTime: "2019-07-10T08:23:18Z"
    lastUpdateTime: "2019-07-10T08:23:18Z"
    message: Canary analysis completed successfully, promotion finished.
    reason: Succeeded
    status: "True"
    type: Promoted

促成状态条件可以有以下原因之一:Initialized(初始化)、Waiting(等待)、Progressing(进展)、WaitingPromotion(等待推广)、Promotion(推广)、Finalising(最终完成)、Succeeded(成功)或 Failed(失败),失败的 Canary 将把推广状态设置为 false,原因为 failed,最后应用的规格将与最后推广的规格不同

等待成功推广:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl wait canary/podinfo --for=condition=promoted

CI example:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# update the container image
kubectl set image deployment/podinfo podinfod=stefanprodan/podinfo:3.0.1

# wait for Flagger to detect the change
ok=false
until ${ok}; do
    kubectl get canary/podinfo | grep 'Progressing' && ok=true || ok=false
    sleep 5
done

# wait for the canary analysis to finish
kubectl wait canary/podinfo --for=condition=promoted --timeout=5m

# check if the deployment was successful 
kubectl get canary/podinfo | grep Succeeded

Canary finalizers

Flagger 在 Canary 删除时的默认行为是让不属于控制器的资源保持其当前状态, 这简化了删除动作并避免了在资源最终确定时可能出现的死锁,

如果 Canary 与现有资源(即服务、虚拟服务等)一起被引入,它们将在初始化阶段被突变,不再反映其初始状态,

如果删除时希望的功能是将资源恢复到它们的初始状态,可以启用 revertOnDeletion 属性

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spec:
  revertOnDeletion: true

当一个删除动作被提交给集群时,Flagger 将尝试恢复以下资源:

. Canary target 副本将被更新为 primary 副本数量

. Canary service 选择器将被恢复

. Mesh/Ingress 流量被路由到 target 上

禁用 Canary 分析的推荐方法是利用 skipAnalysis 属性,它限制了对资源调节的需求, 当不打算再依赖 Flagger进行 deployment 管理时,应启用 revertOnDeletion 属性

注意: 当这个特性被启用时,由于调节的原因,删除动作会有延迟

Canary analysis

Canary 分析定义了:

. Deployment 策略的类型

. 用来验证 Canary 版本的指标

. 用于一致性测试、负载测试和手动门控的 webhooks

. 警报设置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Spec:

  analysis:
    # schedule interval (default 60s)
    interval:
    # max number of failed metric checks before rollback
    threshold:
    # max traffic percentage routed to canary
    # percentage (0-100)
    maxWeight:
    # canary increment step
    # percentage (0-100)
    stepWeight:
    # promotion increment step
    # percentage (0-100)
    stepWeightPromotion:
    # total number of iterations
    # used for A/B Testing and Blue/Green
    iterations:
    # threshold of primary pods that need to be available to consider it ready
    # before starting rollout. this is optional and the default is 100
    # percentage (0-100)
    primaryReadyThreshold: 100
    # threshold of canary pods that need to be available to consider it ready
    # before starting rollout. this is optional and the default is 100
    # percentage (0-100)
    canaryReadyThreshold: 100
    # canary match conditions
    # used for A/B Testing
    match:
      - # HTTP header
    # key performance indicators
    metrics:
      - # metric check
    # alerting
    alerts:
      - # alert provider
    # external checks
    webhooks:
      - # hook

Canary 分析周期性地运行,直到达到最大流量权重或迭代次数。在每次运行时,Flagger 都会调用 webhooks,检查指标,如果达到失败检查的阈值,则停止分析并回滚 canary。如果配置了警报,Flagger 将使用警报提供者发布分析结果

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Linkerd 金丝雀部署与 A/B 测试
本指南向您展示如何使用 Linkerd 和 Flagger 来自动化金丝雀部署与 A/B 测试。
为少
2021/07/30
7370
基于 Flagger 和 Nginx-Ingress 实现金丝雀发布
很久之前我写过一篇介绍使用 Nginx-Ingress 实现蓝绿部署和金丝雀发布的文章,但那篇文章只是介绍了 nginx-ingress 具备这些能力,真正应用还要很多额外的配置和操作,况且现在能实现这些功能的并不只有 nginx-ingress,Service Mesh 工具如:Istio,App Mesh,Linkerd;Ingress Controller 如:Contour,Gloo,NGINX 都能实现,而我们需要的更多是进行金丝雀发布之后指标的监控,流量的调整以及出现问题后的及时回滚。而 Flagger 就是这样一个帮助我们解决上面这些问题的开源工具。
郭旭东
2020/12/30
1.1K0
基于 Flagger 和 Nginx-Ingress 实现金丝雀发布
Istio 结合 Flagger 进行灰度发布
灰度发布也叫金丝雀部署 ,是指通过控制流量的比例,实现新老版本的逐步替换。比如对于服务 A 有两个版本(蓝和绿两个版本),当前两个版本同时部署,但是 version1 比例 90% ,version2 比例 10% ,然后我们可以观察 version2 的实际运行效果,如果符合预期,则可以逐步调整流量占比,比如调整为 80:20 -> 70:30 -> 10:90 -> 0:100 ,最终 version1 版本下线,全部替换成 version2 版本。如果验证失败,切换 100%流量回 v1 版本(回滚)。灰度发布的特点是:
我是阳明
2024/01/02
6450
Istio 结合 Flagger 进行灰度发布
功能强大的CD工具 - flagger
flagger是一个k8s operator,可以基于多种ingress 实现金丝雀升级,以进行流量转移,并使用Prometheus指标进行流量分析。canary分析器可以通过webhooks进行扩展,以运行系统集成/验收测试,负载测试或任何其他自定义验证。
有点技术
2020/08/11
2.2K0
使用 NGINX ingress controller 和 Flagger 来实现 canary deployments
Flagger 是一个渐进式的交付工具,可以为运行在 Kubernetes 上的应用程序自动发布流程。它通过逐步将流量转移到新版本,同时测量指标和运行一致性测试,降低了在生产中引入新软件版本的风险.
philentso
2022/12/21
7200
Istio 结合 Flagger 实现 A/B 测试
虽然 Flagger 可以单独执行加权路由和 A/B 测试,但通过 Istio,它可以将两者结合起来,从而形成具有会话关联性的 Canary 版本。这种部署策略将金丝雀发布与 A/B 测试相结合,当我们尝试逐步向用户推出新功能时,金丝雀发布是很有帮助的,但由于其路由的特性(基于权重),即使用户之前已经被路由到新版本,他们仍然还有路由到应用程序的旧版本上,这种情况可能不符合我们的预期。
我是阳明
2024/01/02
3600
Istio 结合 Flagger 实现 A/B 测试
基于 Flagger Operator 的 Traefik 金丝雀部署
在日常的项目开发过程中时,我们时常会面临服务变更的挑战,为不影响用户体验,我们往往尽可能需要规避服务不可用风险。因此,持续交付便应运而生,其被接受为一种企业软件实践,并且是完善的持续集成原则的自然演变。然而,持续部署仍然非常罕见,这可能是由于管理的复杂性以及担心部署失败会影响系统可用性。在整个持续交付体系中,金丝雀发布,或许是最为经典的一个场景,基于此,我们能够很快发现不健康和“有问题”的服务,并且可以毫不费力地回滚到上一个的版本。
Luga Lee
2021/11/24
5850
基于 Flagger Operator 的 Traefik 金丝雀部署
Linkerd 2.10(Step by Step)—2. 自动化的金丝雀发布
通过结合 Linkerd 和 Flagger 来根据服务指标自动金丝雀(canary)发布,从而降低部署风险。
为少
2021/07/07
6050
使用 Flux,Helm v3,Linkerd 和 Flagger 渐进式交付 Kubernetes
本指南将引导您在 Kubernetes 集群上设置渐进式交付 GitOps 管道。
为少
2021/05/27
1.3K0
使用 Flux,Helm v3,Linkerd 和 Flagger 渐进式交付 Kubernetes
使用 Flux+Flagger+Istio+Kubernetes 实战 GitOps 云原生渐进式(金丝雀)交付
在这篇指南中,你将获得使用 Kubernetes 和 Istio 使用 GitOps 进行渐进式交付(Progressive Delivery)的实际经验。
我是阳明
2021/06/25
1.3K0
使用 Flux+Flagger+Istio+Kubernetes 实战 GitOps 云原生渐进式(金丝雀)交付
Service Mesh - Istio实战篇(上)
如下图所示,我们要部署一个由两个服务组成的Mesh,除此之外还会有一个网关和一个外部服务,可以说是精简且完整了:
端碗吹水
2020/12/29
1.3K0
k8s基于自定义指标实现自动扩容
除了基于 CPU 和内存来进行自动扩缩容之外,我们还可以根据自定义的监控指标来进行。这个我们就需要使用 Prometheus Adapter,Prometheus 用于监控应用的负载和集群本身的各种指标,Prometheus Adapter 可以帮我们使用 Prometheus 收集的指标并使用它们来制定扩展策略,这些指标都是通过 APIServer 暴露的,而且 HPA 资源对象也可以很轻易的直接使用。
SY小站
2020/06/11
2.5K0
k8s基于自定义指标实现自动扩容
多集群运维(二):应用渐进发布
在云计算和DevOps的时代,管理和维护多个Kubernetes(K8S)集群成为了常见的挑战。不同的集群(如开发、测试、生产环境)拥有各自的特性和需求。为了有效管理这些复杂的集群环境,需要采用精心的规划和合适的自动化工具。
行者深蓝
2023/12/29
3200
Kubernetes_HPA使用详解
kubectl scale命令可以来实现 Pod 的扩缩容功能,但是这个毕竟是完全手动操作的,要应对线上的各种复杂情况,我们需要能够做到自动化去感知业务,来自动进行扩缩容。为此,Kubernetes 也为我们提供了这样的一个资源对象:Horizontal Pod Autoscaling(Pod 水平自动伸缩),简称HPA,HPA 通过监控分析一些控制器控制的所有 Pod 的负载变化情况来确定是否需要调整 Pod 的副本数量,这是 HPA 最基本的原理:
mikelLam
2022/10/31
9850
Kubernetes_HPA使用详解
原生Kubernetes监控功能详解-Part2
本周三晚20:30,Kubernetes Master Class在线培训第六期《在Kubernetes中创建高可用应用》即将开播,点击文末【阅读原文】即可免费预约注册!
CNCF
2019/12/05
6830
原生Kubernetes监控功能详解-Part2
Kubernetes HPA 详解
在前面的学习中我们使用用一个 kubectl scale 命令可以来实现 Pod 的扩缩容功能,但是这个毕竟是完全手动操作的,要应对线上的各种复杂情况,我们需要能够做到自动化去感知业务,来自动进行扩缩容。为此,Kubernetes 也为我们提供了这样的一个资源对象:HorizontalPodAutoscaling(Pod水平自动伸缩),简称 HPA,HPA 通过监控分析一些控制器控制的所有 Pod 的负载变化情况来确定是否需要调整 Pod 的副本数量,这是 HPA 最基本的原理:
我是阳明
2020/06/15
4.6K0
Kubernetes HPA 详解
使用 Jenkins X 渐进式交付
这是渐进式交付系列的第二篇文章,第一篇请看:Kubernetes 中的渐进式交付:蓝绿部署和金丝雀部署。
LinuxSuRen
2019/05/10
7530
使用 Jenkins X 渐进式交付
利用 Kruise Rollouts 对 Kubernetes 资源实现金丝雀发布
Kruise Rollouts 是一个旁路组件,它为一系列 Kubernetes 工作负载(如 Deployment and CloneSet)提供高级部署功能,如金丝雀、流量路由和渐进式交付功能
philentso
2022/12/29
9710
《Kubernetes》- 认识下Pod的管理者?
大家好,我是小菜,前面几篇文章我们已经从 k8s 集群的搭建然后到 k8s 中NameSpace 再说到了 k8s 中 Pod 的使用,如果还干到意犹未尽,那么接下来的 Pod 控制器 同样是一道硬菜!死鬼~看完记得给我来个三连哦!
蔡不菜丶
2021/05/18
6050
《Kubernetes》- 认识下Pod的管理者?
使用Cilium和Linkerd执行Kubernetes网络策略
在本教程中,你将学习如何一起运行Linkerd和Cilium,以及如何使用Cilium将L3和L4网络策略应用到运行Linkerd的集群。
CNCF
2021/03/15
1K0
相关推荐
Linkerd 金丝雀部署与 A/B 测试
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验