离线/内网部署
前置条件:内网机器需要已安装 docker、docker-compose、iptables。
离线部署分两种场景:
- 完全无法联网的内网机器:所有镜像/数据在联网机器上下载好,再搬进内网。
- 内网中有可以联网的机器:用一台出口机器做代理(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-studio 和 rancher 两个项目,分别存放 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.sh(rancher/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_ORG(config.py:978,默认ccr.ccs.tencentyun.com/cube-studio/)PUSH_REPOSITORY_ORG(config.py:980)USER_IMAGE(config.py:983)NOTEBOOK_IMAGES(config.py:998)DOCKER_IMAGES(config.py:1112,默认docker:23.0.4)NERDCTL_IMAGES(config.py:1113)NNI_IMAGES(config.py:1298)WAIT_POD_IMAGES(config.py:1300)INFERNENCE_IMAGES(config.py:1324,注意代码里变量名确实拼作INFERNENCE_IMAGES)
其他修改:
SERVICE_EXTERNAL_IP(config.py:837)添加内网 IP,格式为['内网ip']或['内网ip|公网ip']。DEFAULT_GPU_RESOURCE_NAME(config.py:1259,默认nvidia.com/gpu)修改为默认的 k8s GPU 资源名。
5)修改 label studio 镜像为内网镜像
vi install/kubernetes/labelstudio/labelstudio.yaml
# 把其中 image 的值更换为内网镜像
6)部署 cube-studio
复制 k8s 的 config 文件,部署方式与外网相同,参考 单机部署。
4. web 界面的内网修正
- web 界面 hubsecret 改为内部仓库的账号密码。
- 修改配置文件中的内网仓库信息和内外网 IP。
- 自带的目标识别 pipeline 中,第一个数据拉取任务的启动命令改为:
cp offline/coco.zip ./ && ...。 - 自带的推理服务启动命令,把
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