使用私有镜像创建开发机

除了可以使用英博云的 预置镜像 创建开发机,您还可以使用 私有镜像 创建开发机。

私有镜像定义解释

在本文的语境中,私有镜像是与预置镜像相对的概念,具体解释如下:

  • 私有镜像具体包括:自定义镜像外部镜像两类。
  • 自定义镜像是指已经在英博云平台中,租户专属Repository中的镜像,参考这里
  • 外部镜像则泛指不在英博云平台中的,外部container registry中的镜像。

对于私有镜像的要求

为了支持开发机正常启动,私有镜像需要预装如下软件包(或者通过下面介绍的command参数的initialize_install子阶段进行安装):

  • 私有镜像需要内置bash,用于执行pod启动命令。
  • 为了支持SSH远程连接,私有镜像依赖镜像预置安装:openssh-server。这是必须的,否则 ContainerServer 无法启动。
  • VSCode远程连接需镜像预置安装openssh-sftp-servercurl。若是开发机不需要使用 VSCode,可以不安装。
  • JupyterLab服务需镜像预置安装jupyter。若是开发机不需要使用JupyterLab,可以不安装。

基于私有镜像创建开发机

通过英博云控制台创建

你可以通过入口,英博云控制台:资源管理 -> 开发机 -> 创建开发机,然后选择:自定义镜像 或者 外部镜像 创建开发机,示例如下:

私有镜像创建cs

通过kubectl命令创建

您也可以通过kubectl基于私有镜像创建开发机,需要指定镜像地址为您的 自定义镜像 或者 外部镜像 ,示例如下:

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

创建开发机的完整的yaml示例,可以参考这里

关于command参数

command 参数,指定了pod启动的具体命令,分为:Initialize阶段Launch阶段

其中 Initialize阶段 又进一步分为:Initialize Package 子阶段Initialize Config 子阶段

为了阐述各阶段的具体功能及逻辑关系,给出一段伪代码参考,示例如下:

# 1. Initialize 阶段: 安装必要软件包,初始化环境配置
if not initialized:
    # 1.1 Initialize Package 子阶段: 安装必要软件包
    install_necessary_pkgs

    # 1.2 Initialize Config 子阶段: 初始化环境配置
    init_root_passwd
    init_k8s_env
    init_docker_config_json
fi

# 2. Launch 阶段: 启动 jupyter-lab 后台运行,启动 sshd 作为主进程运行
# 后台启动 jupyter-lab
start_jupyterlab
# 启动 sshd 服务,作为主进程
start_sshd

以下是一个详细的示例:

# 1. Initialize 阶段: 安装必要软件包,初始化环境配置
    if [ -z "${EBCS_SYS_INITIALIZED}"] || [ "${EBCS_SYS_INITIALIZED}" = "False" ]; then
    # 1.1 Initialize Package 子阶段: 安装必要软件包
    # 允许 root 用户基于密码登录
    mkdir -p /etc/ssh
    echo "PasswordAuthentication yes" >> /etc/ssh/sshd_config
    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 相关服务,这里 '/public' 目录是自动 mount 到开发机内的,内含必要的安装文件
    PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" dpkg -i /public/shared-resources/openssh-server/ubuntu_22.04_amd64/*.deb

    # 安装 docker 客户端
    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)' >> /etc/profile
        echo "Init k8s env complete."
    fi
fi

# 2. Launch 阶段: 启动 jupyter-lab 后台运行,启动 sshd 作为主进程运行
    # 后台启动 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 > /dev/null 2>&1 &
    fi

    # 启动 sshd 服务,作为主进程
    if service ssh start -D; then
        echo "service ssh start failed."
    else
        /usr/sbin/sshd -D
        echo "sshd start as daemon failed."
    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信息