news 2026/10/14 18:05:37

Devtron v2.2.0 发布说明解读:原生 Sidecar 容器、buildx 构建超时与应用过滤器增强

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Devtron v2.2.0 发布说明解读:原生 Sidecar 容器、buildx 构建超时与应用过滤器增强
  • 云原生
  • DevOps
  • 运维

【免费下载链接】devtron

The only Kubernetes dashboard you need

项目地址:https://gitcode.com/gh_mirrors/dev/devtron
点击查看免费下载

v2.2.0 是 Devtron 在 CI/CD 与 Kubernetes 应用交付领域的一次重要迭代,本版本围绕"构建链路稳定性、部署模板灵活性、应用列表检索效率"三条主线展开:新增原生 Sidecar 容器支持(#6946)、为 buildx k8s driver 构建器 Pod 引入环境变量驱动的就绪等待超时(#6944)、增强应用列表 Tag 过滤器(#6939),同时修复了一批由 dependabot 引入的安全公告问题并顺带优化了 AWS 会话创建流程。读完本文,你将掌握 v2.2.0 新增配置的完整参数语义、底层实现位置,以及如何在 Devtron 部署模板与 CI 构建中实际启用这些能力。

一、版本概览

官方发布说明将 v2.2.0 的变更按三类归档:

分类条目PR 编号
Enhancements原生 Sidecar 容器支持#6946
Enhancementsbuildx builder pod 就绪等待超时支持环境变量驱动#6944
Enhancements应用过滤器增强#6939
Bugsdependabot 修复#6955
Bugs精简 AWS 会话创建并改进错误处理#6948
Bugsdependabot 安全公告修复#6945
OthersSQL 迁移#6951
OthersRelease candidate v0.46.0#6953
Othersdependabot 安全修复同步#6950
Othersdevelop 分支迁移序列#6949
Others迁移序列同步#6942

下文将逐一展开,并结合仓库源码说明每一项的实际效果与配置方式。

二、增强:原生 Sidecar 容器支持(#6946)

2.1 该能力解决什么问题

在 v2.2.0 之前,Devtron 的部署模板中虽然已有initContainers,但业务侧希望"与应用主容器长期共存"的辅助容器(例如日志采集器、监控探针、代理等)时,可配置性有限。v2.2.0 引入的"原生 Sidecar 容器支持",允许用户在部署模板中直接声明随主应用一起调度、同生命周期运行的附加容器。

2.2 部署模板中的配置形态

在官方参考 chartcontrib-chart/reference-chart_3-11-0中,values.yaml与app-values.yaml都提供了containers这一顶层配置段:

containers: [] ## Additional containers to run along with application pods. ## for example, be used to run a sidecar that chown Logs storage . #- name: volume-mount-hack # image: busybox # command: ["sh", "-c", "chown -R 1000:1000 logs"] # volumeMounts: # - mountPath: /usr/local/airflow/logs # name: logs-data

配置项说明:

  • name:Sidecar 容器的名称,必须符合 Kubernetes 容器命名规范;
  • image:Sidecar 使用的镜像地址;
  • command:容器启动命令(可选);
  • volumeMounts:需要挂载的卷,可与volumes配合使用。

2.3 模板渲染逻辑

参考 chart 的 Rollout 模板 contrib-chart/reference-chart_3-11-0/templates/deployment.yaml 中,主容器区存在如下渲染分支:

containers: {{- if $.Values.appMetrics }} - name: envoy image: {{ $.Values.envoyproxy.image | default "envoyproxy/envoy:v1.14.1"}} ... {{- end}} {{- if $.Values.containers }} {{ toYaml $.Values.containers | indent 8 -}} {{- end}} - name: {{ $.Chart.Name }} image: "{{ .Values.server.deployment.image }}:{{ .Values.server.deployment.image_tag }}" ...

可以看到渲染顺序:先渲染appMetrics开启时的 envoy 指标代理容器,再通过{{ toYaml $.Values.containers | indent 8 -}}将用户声明的 Sidecar 容器原样渲染进 Pod 的containers列表,最后是主应用容器。这意味着 Sidecar 与主应用共享同一个 Pod 网络命名空间与存储卷,可以以localhost互相访问。

2.4 与 appMetrics envoy sidecar 的关系

需要区分的是,v2.2.0 的"原生 Sidecar 容器支持"是面向用户自定义辅助容器的通用能力;而 Devtron 原有的"应用指标(Application Metrics)"功能同样会注入一个 envoy sidecar(透明代理),用于采集延迟、吞吐、4xx/5xx 等高级指标。两者相互独立:

  • 自定义containers由用户完全控制镜像与配置;
  • envoy sidecar 由appMetrics开关与envoyproxy配置段控制,默认镜像envoyproxy/envoy:v1.14.1,默认资源 50m CPU / 50Mi 内存(见 docs/user-guide/creating-application/app-metrics.md)。

由于所有请求都会经由 envoy 代理,官方文档特别提醒:任何 envoy 配置错误都可能拖垮应用,务必先在非生产环境充分压测(详见 部署模板与应用指标说明)。

三、增强:buildx builder pod 就绪等待超时改为环境变量驱动(#6944)

3.1 背景

Devtron 的 CI 构建基于 buildx 的 k8s driver:每次构建会动态拉起一个 builder Pod,构建完成后销毁。如果集群资源紧张或节点发生 spot 中断,builder Pod 的启动可能变慢甚至反复重建,此前等待时长为硬编码值,难以适配不同集群环境。

3.2 新增环境变量及默认值

v2.2.0 在 CI 触发服务中引入BuildxGlobalFlags结构体(见 pkg/build/trigger/HandlerService.go),核心新增项为:

环境变量类型默认值语义
BUILDX_BUILDER_POD_WAIT_DURATION_SECSint120等待 buildx k8s driver builder Pod 就绪的超时秒数(覆盖首次启动与 spot 中断后重建两种场景)
BUILDX_CACHE_MODE_MINboolfalse是否将 buildx 构建缓存模式设为 minimum
ASYNC_BUILDX_CACHE_EXPORTboolfalse是否启用异步容器镜像缓存导出
BUILDX_INTERRUPTION_MAX_RETRYint3buildx builder 中断后的最大重试次数

源码中的定义如下:

type BuildxGlobalFlags struct { BuildxCacheModeMin bool `env:"BUILDX_CACHE_MODE_MIN" envDefault:"false" description:"To set build cache mode to minimum in buildx" ` AsyncBuildxCacheExport bool `env:"ASYNC_BUILDX_CACHE_EXPORT" envDefault:"false" description:"To enable async container image cache export"` BuildxInterruptionMaxRetry int `env:"BUILDX_INTERRUPTION_MAX_RETRY" envDefault:"3" description:"Maximum number of retries for buildx builder interruption"` BuildxBuilderPodWaitDurationSecs int `env:"BUILDX_BUILDER_POD_WAIT_DURATION_SECS" envDefault:"120" description:"Timeout in seconds to wait for buildx k8s driver builder pods to be ready (initial startup and after spot interruption)"` }

3.3 配置生效链路

在 pkg/build/trigger/HandlerService.go 中,服务初始化时通过env.Parse解析上述环境变量:

buildxCacheFlags := &BuildxGlobalFlags{} err := env.Parse(buildxCacheFlags) if err != nil { Logger.Infow("error occurred while parsing BuildxGlobalFlags env,so setting BuildxCacheModeMin and AsyncBuildxCacheExport to default value", "err", err) }

解析后的标志位随后在 pkg/build/trigger/HandlerService_ent.go 中写入WorkflowRequest:

workflowRequest.BuildxCacheModeMin = impl.buildxGlobalFlags.BuildxCacheModeMin workflowRequest.AsyncBuildxCacheExport = impl.buildxGlobalFlags.AsyncBuildxCacheExport workflowRequest.BuildxInterruptionMaxRetry = impl.buildxGlobalFlags.BuildxInterruptionMaxRetry workflowRequest.BuildxBuilderPodWaitDurationSecs = impl.buildxGlobalFlags.BuildxBuilderPodWaitDurationSecs

WorkflowRequest中的对应字段同样定义了BuildxBuilderPodWaitDurationSecs(见 pkg/pipeline/types/Workflow.go),最终通过 Argo Workflow 下发到构建执行端。

3.4 测试验证

仓库提供了专门的单元测试 pkg/build/trigger/HandlerService_buildx_test.go:

  • TestBuildxGlobalFlagsDefaults:验证未设置环境变量时BuildxBuilderPodWaitDurationSecs默认不为 0,即 envDefault 120 生效;
  • TestUpdateWorkflowRequestWithBuildxFlags:验证buildxGlobalFlags.BuildxBuilderPodWaitDurationSecs=300时能正确传播到workflowRequest.BuildxBuilderPodWaitDurationSecs;
  • TestWorkflowRequestJSONRoundTrip:验证该字段在 JSON 序列化/反序列化往返中值保持不变。

使用建议:若集群节点启动较慢(如大规模集群、冷启动缓存缺失),可适当调高BUILDX_BUILDER_POD_WAIT_DURATION_SECS(例如 180~300 秒)以避免构建误判失败;若使用 spot 实例,可配合调高BUILDX_INTERRUPTION_MAX_RETRY提升容错。

四、增强:应用过滤器增强(#6939)

4.1 功能定位

应用列表页的过滤器增强,核心是让用户能基于"应用标签(app label)"对应用列表进行多条件组合检索。从源码结构看,该能力在 v2.2.0 中落地为TagFilter模型与对应的 SQL 谓词生成逻辑。

4.2 TagFilter 模型与操作符

过滤器的数据模型定义在 internal/sql/repository/helper/AppListingRepositoryQueryBuilder.go:

type TagFilter struct { Key string `json:"key" validate:"required"` Operator TagFilterOperator `json:"operator" validate:"required"` Value *string `json:"value"` } type TagFilterOperator string const ( TagFilterOperatorEquals TagFilterOperator = "EQUALS" TagFilterOperatorDoesNotEqual TagFilterOperator = "DOES_NOT_EQUAL" TagFilterOperatorContains TagFilterOperator = "CONTAINS" TagFilterOperatorDoesNotContain TagFilterOperator = "DOES_NOT_CONTAIN" TagFilterOperatorExists TagFilterOperator = "EXISTS" TagFilterOperatorDoesNotExist TagFilterOperator = "DOES_NOT_EXIST" )

六种操作符的语义(均区分大小写)如下:

操作符SQL 谓词语义
EQUALSkey 存在且 value 精确匹配
DOES_NOT_EQUALkey 存在且至少一个 value 与目标不同
CONTAINSkey 存在且至少一个 value 包含目标子串(LIKE)
DOES_NOT_CONTAINkey 存在且至少一个 value 不包含目标子串(NOT LIKE)
EXISTSkey 存在
DOES_NOT_EXISTkey 不存在

4.3 SQL 谓词生成实现

buildTagFilterPredicate(internal/sql/repository/helper/AppListingRepositoryQueryBuilder.go)将每个过滤行翻译为针对app_label表的关联子查询,例如:

-- EQUALS EXISTS (SELECT 1 FROM app_label al WHERE al.app_id = a.id and al.key = ? and al.value = ?) -- DOES_NOT_EXIST NOT EXISTS (SELECT 1 FROM app_label al WHERE al.app_id = a.id and al.key = ?)

多个过滤行之间按 AND 逻辑组合(buildTagFiltersWhereConditionAND),从源码注释看"Tag filters are AND-combined for now as requested by product",即当前版本多条过滤为交集关系。

CONTAINS/DOES_NOT_CONTAIN会先通过buildContainsPattern转义 SQL LIKE 通配符再包裹%...%,保证"包含"退化为纯子串匹配,防止用户输入%、_干扰查询。

4.4 请求侧校验与归一化

在 pkg/app/AppListingService.go 中:

  • ValidateTagFilters:逐行校验——key 非空、操作符合法;EXISTS/DOES_NOT_EXIST不允许携带 value,其余操作符必须提供非空 value;
  • NormalizeTagFilters:对 key 做strings.TrimSpace归一化,且不改动原输入切片。

FetchAppListingRequest结构体(pkg/app/AppListingService.go)中对应字段为TagFilters []helper.TagFilter \json:"tagFilters" validate:"omitempty,dive"`,即应用列表接口可直接接收tagFilters` 数组。

4.5 测试覆盖

仓库为过滤器增强提供了两组测试:

  • pkg/app/AppListingService_tag_filter_test.go:覆盖校验规则(EQUALS 必须有值、EXISTS 必须无值、非法操作符报错)与 key 归一化行为;
  • internal/sql/repository/helper/AppListingRepositoryQueryBuilder_tag_filters_test.go:验证多过滤行 AND 组合后的 WHERE 片段与查询参数,例如DOES_NOT_CONTAIN的值pro_d%会被转义为%pro\_d\%%。

五、Bug 修复:AWS 会话创建与依赖安全(#6948、#6955、#6945)

5.1 精简 AWS 会话创建并改进错误处理(#6948)

该修复涉及 Devtron 与 AWS ECR 交互的链路。在 internal/util/EcrService.go 的CreateEcrRepo中可以看到会话创建的分支逻辑:

if len(accessKey) == 0 || len(secretKey) == 0 { // Case 1: IAM role — use default credential chain (IRSA, instance profile, task role, env vars) sess, err = session.NewSession(&aws.Config{ Region: &region, }) } else { // Case 2: Static credentials creds := credentials.NewStaticCredentials(accessKey, secretKey, "") sess, err = session.NewSession(&aws.Config{ Region: &region, Credentials: creds, }) }

即:当未提供静态密钥时,走 AWS 默认凭证链(IRSA、实例角色、环境变量等);提供密钥时才使用静态凭证。v2.2.0 对此链路做了精简并增强了错误处理,减少会话创建失败时对构建流程的干扰。相关凭证字段在 pkg/pipeline/DockerRegistryConfig.go 中(AWSAccessKeyId、AWSSecretAccessKey、AWSRegion)以加密形式存储管理。

5.2 dependabot 安全修复(#6955、#6945、#6950)

v2.2.0 连续合入多轮 dependabot 驱动的依赖安全修复(#6945、#6950、#6955),覆盖了安全公告与新发现的依赖问题。此类修复通常涉及 Go 模块与前端依赖的补丁升级,建议升级 v2.2.0 后重新构建镜像以彻底应用修复。

六、其他变更与工程化(#6951、#6949、#6942、#6953)

  • SQL 迁移(#6951):随版本附带数据库结构迁移。仓库中维护着成体系的迁移脚本目录 scripts/sql(形如NNN_xxx.up.sql/NNN_xxx.down.sql成对出现),升级时由 migrator 组件按迁移序列执行;
  • 迁移序列同步(#6949、#6942):同步 develop 分支与主干的迁移序号,避免多分支并行开发导致迁移编号冲突;
  • Release candidate v0.46.0(#6953):v2.2.0 对应的内部版本发布候选,用于发布前的验证与灰度。

七、升级与验证建议

  1. 备份数据库:v2.2.0 携带 SQL 迁移(#6951),升级前务必备份scripts/sql对应版本的迁移所涉及的数据库;
  2. 评估 buildx 超时参数:若 CI 频繁因 builder Pod 启动超时失败,可在部署 Devtron 的环境变量中设置BUILDX_BUILDER_POD_WAIT_DURATION_SECS(默认 120 秒)并按集群实际表现调优;
  3. 验证 Sidecar 配置:在生产环境启用自定义containers前,先在非生产环境验证镜像拉取、资源限额与主容器的端口互访;
  4. 验证标签过滤:升级后可在应用列表页按标签组合过滤,确认EQUALS/CONTAINS/EXISTS等操作符行为符合预期,并留意过滤条件的 AND 组合语义;
  5. 检查依赖安全状态:确认构建镜像已包含 dependabot 修复(#6945、#6950、#6955)对应的依赖版本。

总体来看,v2.2.0 是一个"稳中求进"的版本:原生 Sidecar 容器支持补全了部署模板的灵活性,buildx 就绪超时的环境变量化提升了 CI 在复杂集群环境下的可调性,应用标签过滤器则显著改善了多应用场景下的检索效率,加上 AWS 会话与依赖安全的修复,整体交付质量扎实。

  • 云原生
  • DevOps
  • 运维

【免费下载链接】devtron

The only Kubernetes dashboard you need

项目地址:https://gitcode.com/gh_mirrors/dev/devtron
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/14 18:04:17

RTD2660HD显示主控固件开发实战:从屏参修改到EDID与ISP烧录

简介:Realtek RTD2660HD Ver8.0 2019源代码包,面向机顶盒、数字电视接收机和嵌入式显示设备开发者,提供基于这颗主控芯片进行固件与驱动开发的完整工程参考,可帮助解决高清解码、多制式接收和多声道音频处理在二次开发时缺少底层模…

作者头像 李华
网站建设 2026/10/14 18:04:12

KUKA码垛项目程序解析:文件结构、KRL逻辑与调试避坑

简介:面向机器人自动化工程师及工业机器人编程学习者的KUKA码垛项目程序包,聚焦物流、仓储、制造场景中的物料搬运与堆叠任务,帮助用户借助实际项目案例,系统掌握KUKA机器人系统构成、WorkVisual离线编程方法以及码垛任务的逻辑设…

作者头像 李华
网站建设 2026/10/14 18:04:04

PostgreSQL TOAST机制详解:大字段存储、压缩与性能调优实践

1. 从一次“物理备份差点翻车”说起 先说个我早年的真实经历。当时接手一套业务系统,里面有一张核心流水表,每条记录都存了一份完整的请求响应快照,字段类型是 text 。单条数据不大,平均也就几十KB,但表总行数到了上…

作者头像 李华
网站建设 2026/10/14 18:03:46

信号要统考!?!

没想到真的会有统考,且来得这么快,虽然是小规模,但是也有这个趋势了。备考天津电子信息类研究生的同学注意!天津有多所高校(天津科技、天津工业、天津理工、中国民航、天津商业)初试专业课“可能”统一考81…

作者头像 李华
网站建设 2026/10/14 18:03:11

激光SLAM前端基石:差速轮式里程计运动模型推导、标定与工程实践

1. 从轮子转数到机器人位姿:里程计到底在算什么很多人第一次接触激光SLAM,注意力全被激光雷达和点云配准吸引走了,觉得里程计就是个"辅助传感器",随便给个初值就行。我刚开始做移动机器人定位那会儿也是这么想的&#x…

作者头像 李华