镜像仓库简介
镜像仓库这个功能的存在,是为了在推送和拉取镜像的时候,不用每次输入账号密码。在“在线开发 -> 镜像管理 -> 镜像仓库”界面中配置好镜像仓库的域名、用户名、密码之后,平台会自动在 k8s 集群中以 Secret 形式保存镜像仓库的账号密码。

后端入口:
Repository_ModelView_Api,route_base = /repository_modelview/api(见myapp/views/view_images.py:164)。 保存的表单字段为name / server / user / password / hubsecret,其中hubsecret默认名为<用户名>-hubsecret(myapp/views/view_images.py:68、:117)。
命名空间的信息
添加(或修改保存)镜像仓库后,平台会把镜像仓库账号密码以 k8s Secret(docker-registry 类型,即 hubsecret)的形式写入到一批命名空间中。

具体写入哪些命名空间由 security_manager.get_all_namespace() 决定(见 myapp/views/view_images.py:141、myapp/security.py:1092):它会遍历所有项目组(Project),收集每个项目组配置的 notebook / pipeline / service / automl 四类命名空间。在默认配置下,这四类命名空间分别为 jupyter、pipeline、service、automl(见 myapp/config.py:768-780),因此默认会在这四个命名空间各创建一份 Secret。
说明:
myapp/config.py:990虽然定义了HUBSECRET_NAMESPACE(默认含pipeline/automl/jupyter/service/aihub/rental六个命名空间),但全代码检索中该变量仅在定义行出现、并未被任何凭据下发逻辑引用(属未启用的配置项)。实际下发由apply_hubsecret调用get_all_namespace(myapp/views/view_images.py:133-155、myapp/security.py:1092)决定,后者只收集各项目组的 notebook / pipeline / service / automl 四类命名空间。因此默认情况下aihub、rental命名空间不会收到 hubsecret(除非某项目组把这四类命名空间显式配置为 aihub/rental)。
增加集群、仓库
新增 k8s 集群
凭据下发逻辑会在保存仓库时遍历当时 CLUSTERS 中配置的所有集群 kubeconfig 并逐个写入 Secret(见 myapp/views/view_images.py:135-150)。因此如果之后新增了 k8s 集群,已有的镜像仓库 Secret 不会自动同步到新集群,需要重新修改、保存一次镜像仓库的配置,信息才会在新集群上生效。
全局秘钥
镜像拉取
镜像拉取时使用的 imagePullSecrets 由两部分合并而成(见 myapp/views/view_images.py:334-336):
- 配置文件中的
HUBSECRET变量(默认['hubsecret'],见myapp/config.py:975); - 当前用户在“在线开发 -> 镜像管理 -> 镜像仓库”中个人创建的全部仓库秘钥(
hubsecret)。
配置文件位置:本地为仓库内
install/docker/config.py(实际加载哪个由环境变量MYAPP_CONFIG决定,默认myapp/config.py);线上为infra命名空间下名为kubeflow-dashboard-config的 ConfigMap(kustomize 生成时可能带 hash 后缀,见install/kubernetes/cube/overlays/kustomization.yml)。
所以如果想让所有人都能拉取某个私有镜像,可选:
- 方法一:把镜像设置为 public 公开镜像。
- 方法二:在“在线开发 -> 镜像管理 -> 镜像仓库”中创建一个有拉取(推送)权限的仓库秘钥,并把对应的 k8s Secret 名称加入配置文件的
HUBSECRET变量中,使其对全平台生效。
镜像推送
为了避免每个同学都单独配置推送秘钥,平台在保存/推送镜像时(镜像调试构建、notebook 保存镜像等)会自动挑选推送秘钥。以在线构建推送为例,挑选规则见 myapp/views/view_images.py:312-322:
- 先筛出
server出现在目标镜像名中的仓库; - 在这些仓库里取“打分最高”的一个:打分公式为
len(server) + 1000 * (是否为本人创建)。即优先使用本人创建的仓库秘钥,其次选择server与镜像名匹配字符前缀最长的那个仓库秘钥;选中后用该仓库的账号密码执行docker login再推送。
所以为了让所有人都能推送到同一个镜像仓库,可以在“在线开发 -> 镜像管理 -> 镜像仓库”中创建一个具有推送权限的仓库秘钥。
镜像构建/推送时的默认目标组织由配置文件中的 PUSH_REPOSITORY_ORG 控制(默认 ccr.ccs.tencentyun.com/cube-studio/,见 myapp/config.py:980、myapp/views/view_docker.py:153);而拉取/通用默认镜像所在组织为 REPOSITORY_ORG(默认同样为 ccr.ccs.tencentyun.com/cube-studio/,见 myapp/config.py:978)。如需改为自己的内网仓库,请按需修改这两个变量。
原文档此处只提到修改
REPOSITORY_ORG作为推送默认仓库;按当前代码,推送默认组织实际由PUSH_REPOSITORY_ORG决定,已据代码更正。
相关文档
- 私有镜像仓库的部署与运维(Harbor):见 04-运维管理/私有镜像仓库Harbor.md
- 配置文件(含
HUBSECRET、REPOSITORY_ORG、PUSH_REPOSITORY_ORG等变量)的管理:见 04-运维管理/配置文件管理.md