- 云原生
- DevOps
- 运维
【免费下载链接】devtron
The only Kubernetes dashboard you need
本文围绕 Devtron 官方用例文档《Pull Helm Charts from OCI Registry》展开,完整覆盖从注册 OCI 仓库、开启Use as chart repository、填充 Chart Store,到排查"找不到 Chart"与移除仓库的全流程操作;并结合 Devtron 后端源码剖析oci_registry_config数据模型、Chart Provider 同步 Job 的触发链路,帮助你在实际运维中既会操作、也知其所以然。
1. 核心概念:为什么 OCI Registry 也能当 Helm 仓库用
Devtron 支持从两类来源安装 Helm chart:
- 传统 Helm repository(基于
index.yaml索引文件的仓库); - 容器 / OCI registry(Docker Hub、ECR、GCR 等 Container/OCI registry)。
关键差异在于:Helm repo 依赖index.yaml来发现仓库中的全部 chart,而 OCI registry 没有这种索引文件。Devtron 的解决方案是把 OCI registry 也统一纳管为"chart 源",通过配置要拉取的仓库列表(repository list),将多来源的 chart 统一填充(populate)到 Chart Store。这一设计在源码中得到了印证:pkg/chartRepo/ChartRepositoryService.go里对传统 Helm repo 的校验逻辑正是拼接<repo-url>/index.yaml并发起 GET 请求验证可访问性(见ValidateChartRepo方法,ChartRepositoryService.go);而 OCI registry 路径则完全不走 index 校验,走的是docker_artifact_store+oci_registry_config两张表(见第 5 节)。
前置条件
- 已有一个或多个 Helm Chart,且以 OCI artifact 形式推送到你的仓库中;
- 一个 OCI 合规的 registry(Docker Hub 及 更多支持的 provider);
- 必须先把 OCI registry 添加到 Devtron,并开启
Use as chart repository选项。
2. 配置 OCI Registry 的关键字段
在Global Configurations → Container/OCI Registry → Add Registry页面,除 Provider、Registry type(Private/Public)外,与"拉取 Chart"直接相关的字段如下(源自 container-registries.md):
| 字段 | 说明 |
|---|---|
| Name | 仓库名称,会出现在 Build Configuration 等场景的 Container Registry 下拉列表 |
| Registry URL | 仓库 URL。注意:不要包含oci://、http://或https://前缀 |
| Authentication Type | 凭据输入形式随 provider 不同而不同(如 ECR 的 User Auth、GCR 的 JSON key) |
| Push container images | 勾选表示用该仓库推送容器镜像(默认勾选) |
| Push helm packages | 勾选表示允许向该仓库推送 Helm chart |
| Use as chart repository | 核心开关:勾选后 Devtron 会从此仓库拉取 Helm chart 并展示到 Chart Store,且必须提供仓库内的 repository 列表 |
| Set as default registry | 设为默认 registry |
从源码结构看,上述 UI 字段与pkg/pipeline/types/DockerRegistry.go中的DockerArtifactStoreBean一一对应,其中IsOCICompliantRegistry、OCIRegistryConfig、RepositoryList []string三个字段正是"该 registry 能否当 chart 源用"的数据载体(DockerRegistry.go)。
3. 操作教程:把 Chart 拉进 Chart Store
3.1 填充 Chart 到 Chart Store
- 进入Global Configurations → Container/OCI Registry。
- 在列表中搜索目标 OCI registry,点击进入。
- 在List of repositories中添加 chart 仓库,格式必须为
username/chartname(username可在 registry provider 的控制台账户信息中找到,例如 Docker Hub 的用户名)。 - 点击Save(新增)或Update(修改)。
- 从左侧导航进入Chart Store。
- 通过搜索栏直接搜索,或在 chart 来源(source)筛选中选择你的 chart 源,即可看到已同步的 chart。
完成后,chart 即出现在 Chart Store 列表中,可用于创建应用或作为模板源。
3.2 找不到你的 Chart?两个排查方向
方向一:deprecated chart 默认被过滤。已被标记废弃的 chart 不会显示在 Chart Store 中,除非你打开Show deprecated charts过滤器。
方向二:手动触发一次 resync。若 registry 中的 chart 有更新而 Store 未反映,可对对应 chart provider 执行 resync。
从源码看,"resync"背后是创建一个 Kubernetes Job:ChartProviderService.SyncChartProvider会把{ChartProviderId, IsOCIRegistry}封装成ChartProviderConfig调用TriggerChartSyncManual(ChartProviderService.go)。后者在 ChartRepositoryService.go 中渲染 ManualAppSyncYaml.go 里的 Job 模板(名为app-manual-sync-job,backoffLimit: 4),并通过CHART_PROVIDER_ID、IS_OCI_REGISTRY两个环境变量告诉 sync 容器"这是哪个源、是不是 OCI 源",随后由K8sUtil.DeleteAndCreateJob在 default cluster 中创建 Job 执行实际的拉取/入库。
对应到前端,resync 动作最终打到 REST 接口SyncChartProvider,该接口会先做登录态校验与 validator 校验,再用 casbin 做 RBAC 检查(ResourceGlobal+ActionGet),见 ChartProviderRestHandler.go;列表/启停接口GetChartProviderList、ToggleChartProvider也在同一文件中。
4. 从 Chart Store 移除 Chart
- 进入该 OCI registry 的设置页。
- 在List of repositories中删除不想要的 chart 仓库条目。
- 点击Update。
移除后,对应 chart 将不再出现在 Chart Store 中。
注意(官方提示):在 OCI registry 上删除 chart 仓库,不会导致该 chart 从 Devtron 的 Chart Store 中被移除——即 Store 中的历史数据不会因为源端删除而自动清理,需要按上述步骤在 Devtron 侧同步移除。
5. 源码纵深:OCI Chart 源是如何被识别与管理的
5.1 数据模型:oci_registry_config表
OCI registry 的"chart 用途"配置独立存储在oci_registry_config表中,模型见 OCIRegistryConfigRepository.go:
| 字段 | 含义 |
|---|---|
docker_artifact_store_id | 关联的 registry(docker_artifact_store表主键) |
repository_type | 取值CONTAINER或CHART(常量OCI_REGISRTY_REPO_TYPE_CONTAINER/OCI_REGISRTY_REPO_TYPE_CHART) |
repository_action | 取值PULL、PUSH或PULL/PUSH(常量STORAGE_ACTION_TYPE_*) |
repository_list | 即 UI 中 List of repositories 的字符串形式,存放username/chartname列表 |
is_chart_pull_active | chart 拉取开关,对应"启用/停用"该 chart 源 |
is_public/deleted | 是否公共仓库 / 软删除标记 |
这些常量定义在 DockerArtifactStoreRepository.go。
5.2 哪些 registry 会被当作"Chart Provider"
查询侧的过滤条件非常明确:FindAllChartProviders只返回active = true且关联配置满足repository_type='CHART'且repository_action为PULL或PULL/PUSH的 registry(DockerArtifactStoreRepository.go)。
服务层再做一道等价判定IsOCIConfigChartProvider:RepositoryType == CHART且 action 为PULL/PULL/PUSH且RepositoryList != ""才认为是有效 chart 源(ChartTemplateService.go)。这也解释了为什么文档强调Use as chart repository必须勾选且必须填写 repository 列表——列表为空时该 registry 根本不会进入 Chart Provider 列表。
5.3 启用/停用:is_chart_pull_active开关
ToggleChartProvider对 OCI 源的处理是:按docker_artifact_store_id查出未删除的OCIRegistryConfig,找到 chart 类型那条记录后更新IsChartPullActive(ChartProviderService.go)。即"停用某 chart 源"并不删除配置,只是把拉取开关置为 false。
5.4 已部署应用对 registry 的反向约束
FindDeploymentCount的 SQL 通过oci_registry_config(条件is_chart_pull_active = true且repository_type='CHART'且 action 为PULL/PULL/PUSH)与installed_app_versions/app_store关联统计该 registry 下已部署应用数(DockerArtifactStoreRepository.go)。结合 Chart Provider 列表中IsEditable的赋值逻辑(存在活跃部署即不可编辑,见 ChartProviderService.go),可以推断:已被应用引用的 chart 源会受到删除/修改保护,这与传统 chart repo "有已部署 chart 则不可改名/改 URL"(ChartRepositoryService.go)的保护策略一脉相承。
5.5 Chart Store 中的 OCI 标记
应用创建后,App Store 服务会依据 chart 来源写入标记:来源是 OCI registry(DockerArtifactStore != nil)时置IsOCICompliantChart = true,否则为 false(AppStoreService.go)。这个标记让 Devtron 能区分同一 Chart Store 中"来自 Helm repo"与"来自 OCI registry"两类应用版本。
6. 小结
| 事项 | 结论 |
|---|---|
OCI registry 没有index.yaml,如何发现 chart? | 依赖Use as chart repository+List of repositories(username/chartname)显式声明 |
| 配置存在哪? | docker_artifact_store(registry 本体)+oci_registry_config(CHART/PULL用途配置) |
| 手动 resync 的实现? | 渲染并创建app-manual-sync-jobKubernetes Job,注入CHART_PROVIDER_ID、IS_OCI_REGISTRY环境变量 |
| 源端删除 chart 会同步删除 Store 记录吗? | 不会,需在 Devtron 侧移除 repository 条目并 Update |
| 权限要求? | Toggle/Sync 接口经 casbin 校验ResourceGlobal权限,普通用户会被 403 拒绝 |
掌握以上操作与数据链路后,你可以将团队的私有 chart 资产统一收敛到 OCI registry,并通过 Devtron 的 Chart Store 实现多源 chart 的统一检索、同步与部署,同时利用is_chart_pull_active开关与部署计数保护机制,安全地管理 chart 源的生命周期。
- 云原生
- DevOps
- 运维
【免费下载链接】devtron
The only Kubernetes dashboard you need
相关推荐
Kubeapps 离线(Air-gapped)安装实战指南:从拉取 Chart、镜像仓库镜像化到 Helm 部署
Kubeapps 离线(Air gapped)安装实战指南:从拉取 Chart、镜像仓库镜像化到 Helm 部署 导读 本文基于 Kubeapps 官方离线安装
云原生后端前端Devtron 容器/OCI 镜像仓库配置实战:从添加仓库到集群凭证自动注入
Devtron 容器/OCI 镜像仓库配置实战:从添加仓库到集群凭证自动注入 本篇指南围绕 Devtron 的 Global Configurations →
云原生DevOps运维Kubernetes项目实战:从私有镜像仓库拉取镜像的完整指南
Kubernetes项目实战:从私有镜像仓库拉取镜像的完整指南 概述 在Kubernetes集群中部署应用时,经常需要从私有镜像仓库拉取容器镜像。本文将详细介绍
文档教程云原生
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考