九章智算云

VS Code SSH 远程开发

VS Code(Visual Studio Code)是一款由微软开发的轻量级、跨平台的代码编辑器,支持多种编程语言和丰富的扩展功能。本文档将演示使用VS Code通过ssh连接弹性容器集群,以便于直接在弹性容器集群的环境中进行开发和调试。

前提条件

  • 本次部署会用到Kubernetes,请确保本地有可用的Kubernestes客户端工具kubectl,安装请参考安装kubectl

  • 用户已开通弹性容器集群,且集群可正常使用。如尚未开通,可参考开通弹性容器集群完成开通。

教程文件清单

首先下载本教程所需要的源码文件并解压。

文件用途
id_rsa.pubssh-keygen 生成的公钥,用于 SSH 免密登录
credentialsaws 配置文件,用于管理对象存储
Dockerfile镜像构建文件
deployment.yamlDeployment 资源,定义如何启停 Pod

credentials

# credentials 文件示例
[default]
aws_access_key_id = [aws_access_key_id]      # 替换为对象存储开通短信中的 access_key
aws_secret_access_key = [aws_secret_access_key]  # 替换为对象存储开通短信中的 secret_key

SSH 公私钥对

ssh-keygen
cd /root/.ssh
ls

将公钥 id_rsa.pub 拷贝到 Dockerfile 同级目录。

Dockerfile

基于 PyTorch 基础镜像构建自定义镜像,包含:

  1. 基础工具包和 SSH 服务
  2. 创建非 root 开发用户 dev
  3. 配置 AWS CLI(对象存储访问)
  4. 启用 openssh-server 与免密登录
  5. 暴露 22 端口,启动 sshd
FROM pytorch/pytorch:2.5.1-cuda12.4-cudnn9-devel

RUN apt-get update && apt-get install -y \
    curl unzip openssh-server sudo vim nano git tmux wget \
    screen tree htop ncdu git-lfs plocate \
    && apt-get clean

RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" \
    && unzip awscliv2.zip && ./aws/install && rm -rf awscliv2.zip aws/

RUN mkdir /var/run/sshd
RUN echo 'root:root' | chpasswd
RUN useradd -m -s /bin/bash dev && echo 'dev:dev' | chpasswd
RUN usermod -aG sudo dev

RUN echo "export PATH=/usr/local/nvidia/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" >> /home/dev/.bashrc
RUN echo "export AWS_ENDPOINT_URL_S3=http://dingofs.hdd.mas.zetyun.cn:8081" >> /home/dev/.bashrc

COPY id_rsa.pub /home/dev/.ssh/authorized_keys
COPY credentials /home/dev/.aws/credentials
RUN chown -R dev:dev /home/dev

RUN sed -i 's/^#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
RUN sed -i 's/^#PasswordAuthentication yes/PasswordAuthentication yes/' /etc/ssh/sshd_config

EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]

部署 在本示例中,部署信息由deployment.yaml文件指定。

具体指示弹性容器集群的Kubernetes control plane以下信息:

  1. 确保在任何时候只有一个Pod运行。这个实例是通过清单中的 spec.replicas 键值对定义的。
  2. 在运行pod的弹性容器集群计算节点上预留GPU、CPU和内存资源。在Kubernetes Pod中运行的每个Jupyter实例分配了1个gpu,由下面的spec.template.spec.containers.resources.limits.nvidia.com/gpu-h800 键值对定义。
  3. 指定镜像,由 spec.template.spec.containers.image 键值对定义。
  4. 指定pvc的挂载目录,由 spec.template.spec.containers.volumeMounts 键值对定义。
  5. 指定pvc,由 spec.template.spec.volumes 定义。
apiVersion: apps/v1
kind: Deployment
metadata:
  name: dev-deploy
  namespace: dev
spec:
  replicas: 1 
  selector:
    matchLabels:
      app: dev
  template:
    metadata:
      labels:
        app: dev
    spec:
      restartPolicy: Always
      containers:
        - name: coding-dev-container
          image: 镜像仓库访问地址/pytorch/pytorch:2.5.1-cuda12.4-cudnn9-devel-ssh-1.0 # 替换成自己的镜像
          resources:
            requests:
              memory: "400G"
              cpu: "26"
              nvidia.com/gpu-h800: 2
            limits:
              memory: "400G"
              cpu: "26"
              nvidia.com/gpu-h800: 2
          ports:
            - containerPort: 22
              name: ssh-port
              protocol: TCP
          volumeMounts:
            - name: workspace
              mountPath: "/workspace"
            - name: workspace
              mountPath: "/models"
      imagePullSecrets:
        - name: harbor-secret
      volumes:
        - name: workspace
          persistentVolumeClaim:
            claimName: pvc-capacity-userdata
      tolerations:
        - key: nvidia.com/gpu
          operator: Exists
          effect: NoSchedule

编写deployment.yaml文件时,替换以下信息:

变量名说明来源示例
image镜像名称自定义镜像registry.hd-01.alayanew.com:8443/alayanew-******-5cfd/ubuntu2204:1.0.2
resources.requests.[GPU]GPU资源信息弹性容器集群nvidia.com/gpu-h800

操作步骤

镜像准备

用户名密码:查看开通镜像仓库时的通知短信。镜像仓库访问地址 = 访问域名/项目。

#login
docker login  镜像仓库访问地址/ -u [user] -p [passwd]

# pull image
docker pull pytorch/pytorch:2.5.1-cuda12.4-cudnn9-devel

# build image
docker build --platform=linux/amd64 -t pytorch/pytorch:2.5.1-cuda12.4-cudnn9-devel-ssh-1.0 -f [/path/to/Dockerfile] .

# tag
docker tag pytorch/pytorch:2.5.1-cuda12.4-cudnn9-devel-ssh-1.0 镜像仓库访问地址/pytorch/pytorch:2.5.1-cuda12.4-cudnn9-devel-ssh-1.0

# push
docker push 镜像仓库访问地址/pytorch/pytorch:2.5.1-cuda12.4-cudnn9-devel-ssh-1.0

K8s 资源部署

# 声明弹性容器集群配置,替换为实际的 kubeconfig 文件路径
export KUBECONFIG="[/path/to/kubeconfig]"

# 创建namespace
kubectl create namespace dev

# 创建secret
kubectl create secret docker-registry harbor-secret \
	--docker-server=registry.hd-01.alayanew.com:8443\
	--docker-username="[user]"  \
	--docker-password="[password]" \
	--docker-email="[email]" \
	--namespace dev

# 创建deploy
kubectl create -f deployment.yaml

# 端口转发
kubectl port-forward deployments/dev-deploy 10022:22 -n dev
  • 弹性容器集群kubeconfig相关文件获取方式请参考使用弹性容器集群
  • userpassword参数可从客户中心/权限管理/访问管理处查看,email可在客户中心/账号概览处查看。

SSH 登录测试

ssh dev@127.0.0.1 -p 10022

SSH 登录测试

配置 VS Code

编辑 .ssh/config,在配置文件中添加以下信息。

Host dev-pod
    HostName 127.0.0.1
    Port 10022
    User dev
  1. 配置 VS Code安装 Remote-SSH 扩展。

安装 Remote-SSH 扩展

  1. 安装完之后进入

进入 Remote-SSH

  1. 连接 Pod 并编写 hello.py

连接 Pod

  1. 进入 Pod 中验证 hello.py 创建成功:

hello.py 验证

最后更新于

这篇文档对你有帮助吗?

目录