- 云原生
- DevOps
- 运维
【免费下载链接】devtron
The only Kubernetes dashboard you need
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 |
| Enhancements | buildx builder pod 就绪等待超时支持环境变量驱动 | #6944 |
| Enhancements | 应用过滤器增强 | #6939 |
| Bugs | dependabot 修复 | #6955 |
| Bugs | 精简 AWS 会话创建并改进错误处理 | #6948 |
| Bugs | dependabot 安全公告修复 | #6945 |
| Others | SQL 迁移 | #6951 |
| Others | Release candidate v0.46.0 | #6953 |
| Others | dependabot 安全修复同步 | #6950 |
| Others | develop 分支迁移序列 | #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_SECS | int | 120 | 等待 buildx k8s driver builder Pod 就绪的超时秒数(覆盖首次启动与 spot 中断后重建两种场景) |
BUILDX_CACHE_MODE_MIN | bool | false | 是否将 buildx 构建缓存模式设为 minimum |
ASYNC_BUILDX_CACHE_EXPORT | bool | false | 是否启用异步容器镜像缓存导出 |
BUILDX_INTERRUPTION_MAX_RETRY | int | 3 | buildx 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.BuildxBuilderPodWaitDurationSecsWorkflowRequest中的对应字段同样定义了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 谓词语义 |
|---|---|
EQUALS | key 存在且 value 精确匹配 |
DOES_NOT_EQUAL | key 存在且至少一个 value 与目标不同 |
CONTAINS | key 存在且至少一个 value 包含目标子串(LIKE) |
DOES_NOT_CONTAIN | key 存在且至少一个 value 不包含目标子串(NOT LIKE) |
EXISTS | key 存在 |
DOES_NOT_EXIST | key 不存在 |
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: ®ion, }) } else { // Case 2: Static credentials creds := credentials.NewStaticCredentials(accessKey, secretKey, "") sess, err = session.NewSession(&aws.Config{ Region: ®ion, 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 对应的内部版本发布候选,用于发布前的验证与灰度。
七、升级与验证建议
- 备份数据库:v2.2.0 携带 SQL 迁移(#6951),升级前务必备份
scripts/sql对应版本的迁移所涉及的数据库; - 评估 buildx 超时参数:若 CI 频繁因 builder Pod 启动超时失败,可在部署 Devtron 的环境变量中设置
BUILDX_BUILDER_POD_WAIT_DURATION_SECS(默认 120 秒)并按集群实际表现调优; - 验证 Sidecar 配置:在生产环境启用自定义
containers前,先在非生产环境验证镜像拉取、资源限额与主容器的端口互访; - 验证标签过滤:升级后可在应用列表页按标签组合过滤,确认
EQUALS/CONTAINS/EXISTS等操作符行为符合预期,并留意过滤条件的 AND 组合语义; - 检查依赖安全状态:确认构建镜像已包含 dependabot 修复(#6945、#6950、#6955)对应的依赖版本。
总体来看,v2.2.0 是一个"稳中求进"的版本:原生 Sidecar 容器支持补全了部署模板的灵活性,buildx 就绪超时的环境变量化提升了 CI 在复杂集群环境下的可调性,应用标签过滤器则显著改善了多应用场景下的检索效率,加上 AWS 会话与依赖安全的修复,整体交付质量扎实。
- 云原生
- DevOps
- 运维
【免费下载链接】devtron
The only Kubernetes dashboard you need
相关推荐
Devtron v2.2.0 发布说明深度解析:sidecar 容器、buildx 超时与 AWS 会话优化
Devtron v2.2.0 发布说明深度解析:sidecar 容器、buildx 超时与 AWS 会话优化 Devtron 是围绕 Kubernetes 打造
云原生DevOps运维Zcash 4.4.1-rc1 发布说明解读:Windows 构建支持收窄与布隆过滤器、锁并发优化
Zcash 4.4.1 rc1 发布说明解读:Windows 构建支持收窄与布隆过滤器、锁并发优化 Zcash 4.4.1 rc1 是一份以「构建系统变更 +
区块链密码学htmx 0.3.0 发布深度解读:触发器过滤、生命周期响应头与 AJAX 事件体系增强
htmx 0.3.0 发布深度解读:触发器过滤、生命周期响应头与 AJAX 事件体系增强 htmx 0.3.0 是 htmx 早期演进中承上启下的一个重要版本:
前端Web框架
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考