1 集群上传与apiserver联调

没有tmux如何上传???

docker run -d -p 8000:8000 \
  -v /data:/app/public --name go  --privileged \
  --restart=always\
  codeskyblue/gohttpserver --upload --delete

会上传空字符串,apiserver将其解析为name=pane_info=""的记录

(base) [sunye@BJ-IDC1-10-10-15-115 ~]$ wget -qO- http://go.d5.sensetime.com/sunye/202206/apiserver/utils/upload_tmux_session.sh | sh
Uploading tmux session...
ip:     10.10.15.115
user:   sunye
updated_time:   Thu Jun 16 15:14:18 2022
no server running on /tmp/tmux-900022744/default
no server running on /tmp/tmux-900022744/default
no server running on /tmp/tmux-900022744/default
INFO:
all:    {"ip":"10.10.15.115","updated_time":"Thu Jun 16 15:14:18 2022","info":";"}
"No sessions. Nothing changed"
Successfully upload to ostrich apiserver, result at     http://testapi.ostrich.sensetime.com/v1/ostrich/tmuxsession/sunye

{
    "ip": "10.10.15.115",
    "name": "",
    "pane_info": "",
    "updated_time": "2022-06-16 15:14:11",
    "user_id": 13
  }

如何设置用户crontab?

通过下述命令一键安装上传到

# 1. 无crontab时仍然执行
# 2. 避免收到通知
# 3. 能够检测到以前设置过的upload
# 4. 每10分钟上传一次
# 5. 运行后立即上传
echo `crontab -l > conf` && sed -i "/upload_tmux_session.sh/d" conf \
&& echo "0,10,20,30,40,50 * * * * wget -qO- http://go.d5.sensetime.com/sunye/202206/apiserver/utils/upload_tmux_session.sh \
| sh  > /dev/null 2>&1" >> conf && crontab conf && rm -f conf \
&& wget -qO- http://go.d5.sensetime.com/sunye/202206/apiserver/utils/upload_tmux_session.sh \
| sh

操控远程安装上传tmux session agent

用户登录了mtc_web进入对应的集群时:查询API中是否存在改ip的tmux session信息,如不存在,或者时间过期(>10min),则自动登录ip去安装!

具体的,add_machine函数调用时,启动了新的ws,在sshTerm.vue > created() > connectHost() 中调用

image-20220617105353367

image-20220617153218664

每次登录到集群都会判断tmux上传是否过期,运行指令设置crontab

中文date???

由于在某些机器上日期为中文导致apiserver不能解析,必须使用格式化字符串的方式

all:    {"ip":"10.10.17.32","updated_time":"2022年 06月 17日 星期五 15:39:20 CST","info":";"}
"Invalid updated_time format"
[sunye@BJ-IDC1-10-10-17-32 ~]$ date
2022年 06月 17日 星期五 15:40:29 CST

改为date +'%Y-%m-%d %H:%M:%S',联调apiserver,同接受多种时间格式

2 前端获取到tmux session信息并渲染到cluster&job页面

打开web时获取tmux session并存储到全局

与real_machines逻辑一致,在machines页面如果信息不存在,就获取并解析

注意tmux是一个字典,每个ip是一个key,而不是每个session是一个key,这里需要对于apiserver的输出做处理,具体见machine.js

async get_tmux(content) {
    console.log('getting tmux')
    this.loading = true
    let res = await get_tmux_session(
      'sunye'
      // this.$route.query['name'] || this.$store.getters.username
    )
    let sessions = res.data
    // clusters = jobs
    let tmux = new Map()
    sessions.forEach(session => {
      let time_diff = new Date().getTime() - new Date(session['updated_time']).getTime()
      if (time_diff < 605 * 1000) {
        let ip = session['ip']
        if (tmux.get(ip) == undefined) tmux.set(ip, [])
        tmux.get(ip).push(session)
      }
    })
    this.loading = false
    console.log(tmux)
    content.commit('SET_TMUX', tmux)
  },

同时在cluster和job页面显示该ip所有的tmux session信息

支持对每个session设置job,将session_job信息缓存到前端(能够保存session_job,但与api_server及数据库无关)

设想对于每个符合该集群的session,在页面上只显示其名称,鼠标悬浮于名称上时弹出一个小窗口,里面包含tmux信息表格(包括session_job),及tmux_pane表格

image-20220620113559077

Web端无法使用本地文件作为缓存?

fs 是 nodejs 服务端的模块,用来开发 web api 时使用的,vue 属于前端框架运行在浏览器环境中,在浏览器环境中时没有 fs 模块的,所以会输出空对象;在浏览器中如果想要读取文件,建议使用 FileReader,具体的 FileReader 的介绍可以查看 FileReader - Web API 接口参考 | MDN (mozilla.org)

点击tmux_name打开终端并连接到tmux session

3 前端获取到job信息并渲染到job页面

支持对每个job设置enable_tb, work_dir,缓存到前端

4 job页面:操控远程打开tb并且展示tb页面

集群上如何安装tb,是否能后台开启一个tb?

wget -qO- http://go.d5.sensetime.com/sunye/202206/apiserver/utils/open_tensorboard.sh | sh

image-20220620104103074

成功在bj15上启动了一个tensorboard,但是通过代理服务器上的端口却访问不了?无论使用ip还是域名,都出现:无法访问此网站,10.5.64.198 的响应时间过长。

这是因为在启动时没有制定Host=0.0.0.0,改过之后成功打开:

image-20220620110757673

在job页面点击enable tensorboard之后打开ws运行指令