离线/内网部署

机器无法连外网(或只有部分机器能联网),需要把镜像/模型/依赖搬进内网完成平台部署时读这篇

02-部署安装 / 部署方式
离线部署内网部署offline无外网私有仓库harbor镜像导出image saveimage loadpush_harborpull_harborrancher离线aihub离线modelscope缓存nginx代理coredns自定义host

离线/内网部署

前置条件:内网机器需要已安装 docker、docker-compose、iptables。

部署视频(内网离线部署)

离线部署分两种场景:

  1. 完全无法联网的内网机器:所有镜像/数据在联网机器上下载好,再搬进内网。
  2. 内网中有可以联网的机器:用一台出口机器做代理(nginx/iptables + coredns),内网其他机器走代理拉取。

一、完全无法联网的内网机器

1. 安装依赖组件和数据

在能连接外网的机器上执行下面命令,下载好后再拷贝到内网机器:

mkdir offline
cd offline
# 下载 kubectl 和 harbor 的离线安装包
# amd64 版本
wget https://cube-studio.oss-cn-hangzhou.aliyuncs.com/install/kubectl
wget https://githubfast.com/goharbor/harbor/releases/download/v2.11.1/harbor-offline-installer-v2.11.1.tgz
# arm64 版本
wget https://cube-studio.oss-cn-hangzhou.aliyuncs.com/install/kubectl-arm64 && mv kubectl-arm64 kubectl
wget https://githubfast.com/wise2c-devops/build-harbor-aarch64/releases/download/v2.13.0/harbor-offline-installer-aarch64-v2.13.0.tgz

# 下载模型
wget https://cube-studio.oss-cn-hangzhou.aliyuncs.com/inference/resnet50.onnx
wget https://cube-studio.oss-cn-hangzhou.aliyuncs.com/inference/resnet50-torchscript.pt
wget https://cube-studio.oss-cn-hangzhou.aliyuncs.com/inference/resnet50.mar
wget https://cube-studio.oss-cn-hangzhou.aliyuncs.com/inference/tf-mnist.tar.gz
wget https://cube-studio.oss-cn-hangzhou.aliyuncs.com/inference/decisionTree_model.pkl

# 训练、标注数据集
wget https://cube-studio.oss-cn-hangzhou.aliyuncs.com/pipeline/coco.zip
wget https://docker-76009.sz.gfp.tencent-cloud.com/github/cube-studio/aihub/deeplearning/cv-tinynas-object-detection-damoyolo/dataset/coco2014.zip

注意:这里下载的是通用名 kubectl,而部署脚本 install/kubernetes/start.sh:14-18 下载的是带版本的 kubectl-amd64-1.28 / kubectl-arm64-1.28。离线场景建议下载与 start.sh 一致的版本以避免版本不匹配,OSS 上具体文件请按实际确认。

把整个 offline 目录拷贝到内网机器上。

在连不上网的内网机器上:

1)安装 kubectl

cd offline
chmod +x kubectl && cp kubectl /usr/bin/ && cp kubectl /usr/local/bin/

2)安装内网镜像仓库

参考 私有镜像仓库 Harbor(对应源码 install/kubernetes/harbor/readme.md)。

并创建 cube-studiorancher 两个项目,分别存放 rancher 的基础镜像和 CubeStudio 的基础镜像。

为每台机器的 docker 添加内网私有仓库到 insecure-registries(如果仓库是 https 可忽略此步),参考 节点安装 Docker 中「配置 docker」一节。

3)将前面下载的数据转移到个人目录下

cp -r offline /data/k8s/kubeflow/pipeline/workspace/admin/

2. 镜像转移至内网

镜像导出/推送/拉取脚本由 install/kubernetes/all_image.py(CubeStudio 基础镜像)和 install/kubernetes/rancher/all_image.py(rancher 镜像)生成。运行前先修改各自脚本中的内网仓库地址 harbor_repo

2.1 转移 rancher 镜像

修改 install/kubernetes/rancher/all_image.py 中的内网仓库地址,运行后会生成下列脚本(见 rancher/all_image.py:6-11):

  • 联网机器上二选一:

    • 运行 push_rancher_harbor.sh,把镜像拉取后推送到内网 harbor 仓库;
    • 或运行 rancher_image_save.sh,把镜像压缩成 .tar.gz 文件,再拷贝到内网机器。

    说明:原文此处写的是 pull_rancher_images.sh,但该脚本只做「从公网拉取镜像」(rancher/all_image.py:35),真正「推送到内网仓库」的是 push_rancher_harbor.shrancher/all_image.py:24),此处按代码更正。

  • 不能联网机器上(每台机器都要执行)二选一:

    • 运行 pull_rancher_harbor.sh,从内网仓库拉取镜像;
    • 或运行 rancher_image_load.sh,从压缩文件中导入镜像。

2.2 内网部署 k8s

使用与 rancher 相同的方法可在内网部署 k8s。

2.3 转移 CubeStudio 基础镜像

修改 install/kubernetes/all_image.py 中的内网仓库地址,运行后生成下列脚本(见 all_image.py:136-141):

  • 联网机器上二选一:
    • 运行 push_harbor.sh,把镜像推送到内网仓库;
    • 或运行 image_save.sh,把镜像压缩成文件再导入到内网机器。
  • 不能联网机器上(每台机器都要执行)二选一:
    • 运行 pull_harbor.sh,从内网仓库拉取镜像;
    • 或运行 image_load.sh,从压缩文件中导入镜像。

3. 内网部署 cube-studio

1)修改镜像拉取脚本为内网拉取(每台机器都要执行)

把节点初始化脚本 install/kubernetes/init_node.sh 中的镜像拉取命令改为从内网拉取。

说明:原文写的是「把 pull_images.sh 改为 pull_harbor.sh」,但当前 init_node.sh 末尾实际调用的是 sh pull_images_mini.sh(见 init_node.sh 最后一行),请把这一行改为 sh pull_harbor.sh

2)取消 start.sh 中下载 kubectl 的逻辑

注释掉 install/kubernetes/start.sh:13-18 这段(因为内网无法访问 OSS,kubectl 已在前面手动安装):

ARCH=$(uname -m)

if [ "$ARCH" = "x86_64" ]; then
  wget -O kubectl https://cube-studio.oss-cn-hangzhou.aliyuncs.com/install/kubectl-amd64-1.28 && chmod +x kubectl && cp kubectl /usr/bin/ && mv kubectl /usr/local/bin/
elif [ "$ARCH" = "aarch64" ]; then
  wget -O kubectl https://cube-studio.oss-cn-hangzhou.aliyuncs.com/install/kubectl-arm64-1.28 && chmod +x kubectl && cp kubectl /usr/bin/ && mv kubectl /usr/local/bin/
fi

注:上面代码块已按当前 start.sh 更正(带版本号的 kubectl-amd64-1.28 / kubectl-arm64-1.28),原文使用的是旧 URL。

3)修改 CubeStudio 镜像为内网镜像

vi install/kubernetes/cube/overlays/kustomization.yml
# 修改最底部的 newName 和 newTag

4)修改 CubeStudio 的配置文件

vi install/kubernetes/cube/overlays/config/config.py

下面这些镜像相关配置项改为内网仓库地址(均在 config.py 中,行号见括注):

  • REPOSITORY_ORGconfig.py:978,默认 ccr.ccs.tencentyun.com/cube-studio/
  • PUSH_REPOSITORY_ORGconfig.py:980
  • USER_IMAGEconfig.py:983
  • NOTEBOOK_IMAGESconfig.py:998
  • DOCKER_IMAGESconfig.py:1112,默认 docker:23.0.4
  • NERDCTL_IMAGESconfig.py:1113
  • NNI_IMAGESconfig.py:1298
  • WAIT_POD_IMAGESconfig.py:1300
  • INFERNENCE_IMAGESconfig.py:1324,注意代码里变量名确实拼作 INFERNENCE_IMAGES

其他修改:

  • SERVICE_EXTERNAL_IPconfig.py:837)添加内网 IP,格式为 ['内网ip']['内网ip|公网ip']
  • DEFAULT_GPU_RESOURCE_NAMEconfig.py:1259,默认 nvidia.com/gpu)修改为默认的 k8s GPU 资源名。

5)修改 label studio 镜像为内网镜像

vi install/kubernetes/labelstudio/labelstudio.yaml
# 把其中 image 的值更换为内网镜像

6)部署 cube-studio

复制 k8s 的 config 文件,部署方式与外网相同,参考 单机部署

4. web 界面的内网修正

  1. web 界面 hubsecret 改为内部仓库的账号密码。
  2. 修改配置文件中的内网仓库信息和内外网 IP。
  3. 自带的目标识别 pipeline 中,第一个数据拉取任务的启动命令改为:cp offline/coco.zip ./ && ...
  4. 自带的推理服务启动命令,把 wget https://xxxx/xx.zip 部分改为 cp /mnt/admin/offline/xx.zip ./

二、aihub 模型预拉取

导入所有模型

在能联网的机器上下载所有模型:

cd aihub/modelscope
docker run --name download --privileged -d -v $PWD:/app ccr.ccs.tencentyun.com/cube-studio/modelscope:base-cuda11.3-python3.7 python download_all_model.py

将联网机器上 aihub/modelscope/ 目录下的所有子目录,拷贝到内网服务器的 /data/k8s/kubeflow/global/cube-studio/aihub/deep-learning/ 目录下。

导入部分模型

如果只想要部分模型,可先在有网的服务器上部署启动对应的 aihub 应用,然后将服务器 /data/k8s/kubeflow/global/cube-studio/aihub/deep-learning/ 下对应的 aihub 应用拷贝到内网同等目录下。

内网启动

修改 CubeStudio 后台 config.py 中的:

AIHUB_CACHE_DIR='/mnt/workspace/.cache/modelscope/'

(该项在 config.py:1358,默认空字符串,注释中给的示例即 /mnt/workspace/.cache/modelscope/。)

然后重启后端 pod,再重新部署 aihub 的 web 界面。


三、内网中有可以联网的机器

如果内网里有一台机器可以出网,可让它做代理出口,内网其他机器走它拉取软件源和镜像。

1. 联网机器设置代理服务器

在联网机器上用 nginx 代理软件源,配置参考 install/kubernetes/nginx-https/apt-yum-pip-source.conf

启动 nginx 代理(需要监听 80 和 443 端口):

docker run --name proxy-repo -d --restart=always --network=host \
  -v $PWD/nginx-https/apt-yum-pip-source.conf:/etc/nginx/nginx.conf nginx

2. 在内网机器上配置 host

在内网机器的 /etc/hosts 中,把需要访问的域名指向出口机器:

<出口服务器的IP地址>    mirrors.aliyun.com
<出口服务器的IP地址>    ccr.ccs.tencentyun.com
<出口服务器的IP地址>    registry-1.docker.io
<出口服务器的IP地址>    auth.docker.io
<出口服务器的IP地址>    hub.docker.com
<出口服务器的IP地址>    www.modelscope.cn
<出口服务器的IP地址>    modelscope.oss-cn-beijing.aliyuncs.com
<出口服务器的IP地址>    archive.ubuntu.com
<出口服务器的IP地址>    security.ubuntu.com
<出口服务器的IP地址>    cloud.r-project.org
<出口服务器的IP地址>    deb.nodesource.com
<出口服务器的IP地址>    docker-76009.sz.gfp.tencent-cloud.com

添加新的 host 后要重启 kubelet:docker restart kubelet

如果代理机器没法占用 80 和 443 端口,可用 iptables 转发:

sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -d mirrors.aliyun.com -j DNAT --to-destination <出口服务器的IP地址>:<出口服务器的端口>

3. k8s 配置域名解析

在 k8s 的 kube-system 命名空间,修改 coredns 的 configmap,添加自定义 host 地址映射:

{
    "Corefile": ".:53 {
        errors
        health {
          lameduck 5s
        }
        ready
        kubernetes cluster.local in-addr.arpa ip6.arpa {
          pods insecure
          fallthrough in-addr.arpa ip6.arpa
        }
        # 自定义 host
        hosts {
            <出口服务器的IP地址>    mirrors.aliyun.com
            <出口服务器的IP地址>    ccr.ccs.tencentyun.com
            <出口服务器的IP地址>    registry-1.docker.io
            <出口服务器的IP地址>    auth.docker.io
            <出口服务器的IP地址>    hub.docker.com
            <出口服务器的IP地址>    www.modelscope.cn
            <出口服务器的IP地址>    modelscope.oss-cn-beijing.aliyuncs.com
            <出口服务器的IP地址>    archive.ubuntu.com
            <出口服务器的IP地址>    security.ubuntu.com
            <出口服务器的IP地址>    cloud.r-project.org
            <出口服务器的IP地址>    deb.nodesource.com
            <出口服务器的IP地址>    docker-76009.sz.gfp.tencent-cloud.com
          fallthrough
        }
        prometheus :9153
        forward . \"/etc/resolv.conf\"
        cache 30
        loop
        reload
        loadbalance
    } # STUBDOMAINS - Rancher specific change
    "
}

修改后重启 coredns 的 pod。

4. 容器里面使用放开的域名

pip 配置 https 源:

pip3 config set global.index-url https://mirrors.aliyun.com/pypi/simple

apt 配置 https 源:修改 /etc/apt/sources.list(ubuntu 20.04 示例):

deb https://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse

deb https://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse

deb https://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse

deb https://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse

deb https://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse

yum 配置 https 源:下载阿里的源

wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-8.repo
最后更新 2026-07-04完整文档以官方仓库为准:GitHub Wiki