使用私有镜像创建开发机

除了英博云提供的预置镜像可以创建开发机,您还可以自行制定私有镜像创建开发机。

通过英博云控制台,基于私有镜像创建开发机

登录英博云控制台,在以下界面:开发机->创建开发机,选择自定义镜像,或者外部镜像,如下:

私有镜像创建cs

通过kubectl命令,基于私有镜像创建开发机

完整的yaml,参考ContainerServer CR,需要修改以下部分,设置为您的私有镜像路径:

spec:
  image: custom.registry/repository:mytag # 您的自定义镜像
  

关于Command命令

command命令是pod启动的具体命令,以下是一段shell脚本,分为:initialize阶段、launch阶段。 其中initialize阶段进一步分为initialize_install子阶段、initialize_config子阶段。 具体的逻辑,伪代码参考内容如下:

## 1. initialize阶段
if not initialized:
    # 若是未初始化,则执行2个子阶段的初始化操作

    ## 1.1 initialize_install子阶段
    install_necessary_pkgs

    ## 1.2 initialize_config子阶段
    init_root_passwd
    init_k8s_env
    init_docker_config_json
fi

## 2. launch阶段
start_jupyter-lab
start_sshd

以下是一个详细的示例:

## 1. initialize阶段
if [ -z "${EBCS_SYS_INITIALIZED}" ] || [ "$(echo "${EBCS_SYS_INITIALIZED}" | tr '[:upper:]' '[:lower:]')" = "false" ]; then
    ## 1.1 initializate_install子阶段
    # 允许密码登录
    mkdir -p /etc/ssh
    echo "PasswordAuthentication yes" >> /etc/ssh/sshd_config
    
    # 允许root用户登录
    echo "PermitRootLogin yes" >> /etc/ssh/sshd_config

    # 允许sftp访问,用于scp文件
    grep -q "^Subsystem sftp" /etc/ssh/sshd_config && sed -i 's|^Subsystem sftp.*|Subsystem sftp /usr/lib/openssh/sftp-server|' /etc/ssh/sshd_config || echo "Subsystem sftp /usr/lib/openssh/sftp-server" >> /etc/ssh/sshd_config 

    # 安装sshd相关pkg,相关pkg已经存在于/public目录
    dpkg -i /public/shared-resources/openssh-server/ubuntu_22.04_amd64/*.deb

    # 安装docker client,相关pkg已经存在于/public目录
    cp /public/shared-resources/docker-build/docker /usr/bin/docker
    
    ## 1.2 initialize_config子阶段
    # 修改root用户密码
    echo "root:$EBCS_SYS_ROOT_PASSWORD" | chpasswd

    # 初始化k8s环境变量
    if [ -f /proc/1/environ ]; then
        echo 'while IFS= read -r line; do export "$line"; done < <(tr "\\0" "\\n" < /proc/1/environ)' | tee -a /etc/profile
        echo "K8s env >> /etc/profile DONE"
    fi

    # 初始化docker config文件
    if [ -n "$DOCKER_CONFJSON" ]; then
        mkdir -p ~/.docker
        echo "$DOCKER_CONFJSON" > ~/.docker/config.json
        chmod 600 ~/.docker/config.json
        echo 'Docker config initialization complete.'
    fi
fi

## 2. launch阶段
# 启动jupyter-lab
if command -v jupyter-lab >/dev/null 2>&1 && [ -n "$EBCS_JUPYTER_PORT" ] && [ -n "$EBCS_JUPYTER_TOKEN" ]; then
    cd /root && jupyter-lab --allow-root --ip=0.0.0.0 --port=$EBCS_JUPYTER_PORT  --NotebookApp.token=$EBCS_JUPYTER_TOKEN --no-browser --NotebookApp.allow_origin='*' --NotebookApp.allow_remote_access=True > /tmp/jupyter.log 2>&1 &
fi

# 启动sshd进程
if service ssh start -D; then
    echo "SSHD exited."
else
    /usr/sbin/sshd -D
    echo "SSHD failed to start."
fi

Command命令可以引用的环境变量

环境变量名称取值示例说明
EBCS_SYS_INITIALIZEDtrue/falseContainServer是否已经初始化
EBCS_SYS_ROOT_PASSWORDQ24dUl$6x0p7W,g1ContainServer的初始密码
DOCKER_CONFJSON{"auths":{"https://registry-cn-huabei1-internal.ebcloud.com":{"username":"myname","password":"SCU5n6j1dfk","auth":"bGlsYmVkd2luOlNxy87uNmoxM2s="}}}租户专属集群的auth信息

对于私有镜像的要求

  • SSH远程连接依赖镜像预置安装openssh-server
  • vscode远程连接需镜像预置安装openssh-sftp-servercurl
  • jupyter服务需镜像预置安装jupyter