平台单机部署 - tencentmusic/cube-studio GitHub Wiki

基础环境依赖

  • docker == 20.x docker 存储目录>1T
  • kubernetes = 1.21~1.25
  • kubectl == 1.24
  • nfs/ceph等分布式文件系统 挂载到每台机器的 /data/k8s/ (单机可忽略)
  • 数据库接口地址 mysql,没有可忽略使用cube-studio自带的
  • 单机 磁盘>=1000G 单机磁盘容量要求不大,仅做镜像容器的的存储
  • 控制端机器 cpu>=16 mem>=32G
  • 任务端cpu/gpu机器 根据需要自行配置,gpu安装对应厂商的要求安装好机器驱动
  • IB/RDMA网络 自动安装机器驱动和IB卡
  • 系统 ubuntu 20.04 ubuntu 22.04 或者centos7或者centos8

平台完成部署之后如下:

在这里插入图片描述

部署提前预备内容

1、分布式存储,挂载到/data/k8s目录下(单机可忽略)。

nfs分布式存储示例:参考cube-studio/install/kubernetes/nfs/NFS离线部署.md

2、私有镜像仓库,在每台机器的docker配置中添加Insecure Registries(体验可忽略)

参考:cube-studio/install/harbor/readme.md

3、gpu机器要安装nvidia-docker2,gpu机器安装对应的驱动,IB设备也需要安装对应的驱动(cpu机器可忽略)

参考:cube-studio/install/rancher

1、对于不熟悉k8s的同学

可以参考视频,先使用rancher部署k8s,再部署cube-studio

单机部署视频

也可以查看使用rancher部署k8s的文档,可以查看cube-studio/install/kubernetes/rancher/readme.md

2、对于已有k8s的同学

1、对于ipvs模式的k8s, (1)要将start.sh脚本最后面的kubectl patch注释掉。然后手动释放istio-system命名空间 istio-ingressgateway,服务类型改为NodePort。 (2)将配置文件install/kubernetes/cube/overlays/config/config.py中的K8S_NETWORK_MODE 改为ipvs

2、服务可用端口范围要放大到10~60000

3、平台入口是istio-system命名空间 istio-ingressgateway,不是cube-studio的前端部分

平台部署命令:

将k8s集群的kubeconfig文件复制到install/kubernetes/config文件中,对于双网卡的同学,记得rancher里面current-context切换为内网的连接形式,然后执行如下命令,其中xx.xx.xx.xx为机器内网的ip(不是外网ip)

# 在k8s worker机器上执行
sh start.sh xx.xx.xx.xx

kubeconfig文件位置

在这里插入图片描述

3、对于隔离内网部署的同学

需要先把需要的镜像拉取到内网docker仓库,再从内网docker仓库拉取到机器上。

其他的同第一步或第二步

将infra命名空间下deployment拉取策略改为IfNotPresent,同时修改配置文件中IMAGE_PULL_POLICY为IfNotPresent

4、创建企业自己的镜像仓库,在web界面,在线开发-镜像仓库,添加自己的仓库地址和账号密码。注意hubsecret不要删除

5、修改config.py文件中REPOSITORY_ORG为自己的镜像仓库地址,HUBSECRET添加自己上一步配置的k8s hubsecret,并将配置更新到infra/kubeflow-dashboard-config的configmap中。

修改为非80端口

修改istio-system命名空间下面名为istio-ingressgateway的service,将服务类型改为NodePort。将80端口的nodePort改为其他可以访问的端口,注意不要删除80端口的配置,因为在gateway中会读取这个80参数。

域名访问

修改 install/kubernetes/gateway.yaml,将其中的host参数 * 修改为域名。然后重新部署这个gateway.yaml文件

修改域名后notebook要重新reset才能打开。

内部ip和外部ip

部署cube-studio时,start.sh脚本后面要填写内网ip,浏览器访问使用外网ip(公网ip),修改config.py中SERVICE_EXTERNAL_IP为外网ip。

nginx 反向代理istio-ingressgateway

有时候浏览器只能打开物理机ip,而我们部署cube-studio使用的是虚拟机。需要添加nginx代理,注意nginx访问超时时常要设置大一些,不然websocket协议的webshell执行命令会失败

nginx配置参考:myapp/install/kubernetes/nginx-https/nginx.conf

部署后排查

了解平台基础组件

了解机器标签管理

0、kubectl工具不存在,无法下载,在内网中会存在,可以查看修改下start.sh脚本,手动下载kubectl。

1、如果k8s采用的是ipvs网络模式,修改istio-ingressgateway为nodeport模式,而不是externalIPs模式

1、查看机器lable是否添加

kubectl label node $node train=true cpu=true notebook=true service=true org=public istio=true knative=true kubeflow=true kubeflow-dashboard=true mysql=true redis=true monitoring=true logging=true --overwrite

2、如果istio部署有问题,对于k8s 1.21+以上的版本。使用如下命令修复

kubectl delete -f istio/install.yaml
kubectl apply -f istio/install-1.15.0.yaml
kubectl patch svc istio-ingressgateway -n istio-system -p '{"spec":{"externalIPs":["'"xx.xx.xx.xx"'"]}}'

2、pv和pvc是否绑定。有些k8s平台会自动为pvc添加Storage Classes,需要对应pv也添加完成绑定

3、kube-system命名空间coredns是否正常,

  • 3.1、可以放开防火墙
/sbin/iptables -P FORWARD ACCEPT
/sbin/iptables -P INPUT ACCEPT
/sbin/iptables -P OUTPUT ACCEPT

放开防火墙后重启coredns 的pod

  • 3.2、可以查看53端口是否被占用,比如bind服务,关闭主机原有53端口服务(注意机器重启后可能原53端口占用的服务被重新打开)。

4、infra命名空间mysql是否部署成功。 对于出现 Table 'kubeflow.ab_permission_view_role。删除/data/k8s/infra/mysql/,然后重新部署sh start.sh xx.xx.xx.xx

5、infra命名空间其他组件是否成功,会链接mysql完成数据库初始化。kubeflow数据库由kubeflow-dashboard.infra组件完成初始化。

  • 5.1 数据库如果库表不全,可以把对应库删掉,重启相应组件。rm -rf /data/k8s/infra/mysql,然后重启mysql,再重启kubeflow-dashboard
  • 5.2 如果kubeflow-dashboard报core dump,则可能是linux系统内核版本太低,需要升级系统内核

6、istio-system空间,istio-ingressgateway的svc是否externalIPs形式暴露了内网ip。 如果有双网卡, 在执行sh start.sh xx.xx.xx.xx时,使用的是内网ip,浏览器打开的是外网ip

6、istio-ingressgateway暴露80以后,仍然无法打开,可能原因(1)80被内网封禁(2)80倍其他服务占用(3)没有禁用nginx-ingress (4)防火墙限制,可以/sbin/iptables -P FORWARD ACCEPT

7、istio-ingressgateway暴露其他端口,如果80端口被占用了,可以修改 istio-system/svc/istio-ingressgateway 类型为NodePort

8、镜像拉取不下来:可以离线拉取一遍平台镜像,对于其他的仓库镜像,最好public,否则更新每个命名空间hubsecret的账号密码。配置在线开发->镜像仓库 中hubsecret中的账号密码为自己的dockerhub官网的账号密码

9、k8s dashboard不能搜索,在高版本k8s中,使用 kubectl apply -f dashboard/v2.6.1-cluster.yaml部署更高版本的k8s dashboard