VSCode客户端远程开发(RemoteSSH)
VSCode(Visual Studio Code)是一款由微软开发的轻量级、跨平台的代码编辑器,支持多种编程语言和丰富的扩展功能。
本文档教你如何使用 vscode 通过 ssh 连接弹性容器集群,以便于直接在弹性容器集群的环境中进行开发和调试。
前置条件
本教 程假定您已经具备以下条件:
- 在您的系统上安装了kubectl
- 开通了Alaya NeW弹性容器集群,具体步骤参考:开通弹性容器集群
教程源代码
首先下载本教程所需要的源码文件并解压。
清单
本教程包含以下文件,以下是文件的作用说明。
文件名 | 说明 |
---|---|
id_rsa.pub | ssh命令生成的公钥,用与ssh免密登录 |
credentials | aws配置文件,用于管理对象存储 |
Dockerfile | 镜像构建文件:用来构建docker镜像 |
deployment.yaml | 定义Deployment资源:定义如何启停pod |
credentials
aws配置文件,用于管理对象存储。
# credentials 文 件示例
[default]
aws_access_key_id = [aws_access_key_id] # 替换成 对象存储开通通知短信 中提供的对象存储access_key
aws_secret_access_key = [aws_secret_access_key] # 替换成 "对象存储开通通知短信" 中提供对象存储secret_key
ssh公私钥对
生成ssh公私钥对,用于ssh免密登录。
ssh-keygen
cd /root/.ssh/
ls
**注意: ** 将公钥id_rsa.pub拷贝到Dockerfile同级目录
Dockerfile
基于Pytorch的基础镜像,自定义 镜像:
- 安装基础工具包和SSH服务等;
- 开发用户设置:创建非 root 用户 用于开发使用,配置开发用户环境变量,权限等。
- aws cli 配置:配置 对象存储 访问权限,endpoint 地址 endpoint地址在网页->资源中心->存储管理->对象存储->访问详情页。
- 配置ssh 服务:开启openssh-server 服务,配置ssh免密登录。
- 暴露 22端口;
- 启动 sshd。
FROM pytorch/pytorch:2.5.1-cuda12.4-cudnn9-devel
# 安装基础工具包和SSH服务
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
# 安装AWS CLI工具
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/
# 配置SSH服务
RUN mkdir /var/run/sshd
# 设置root用户密码
RUN echo 'root:root' | chpasswd
# 创建dev用户并配置
RUN useradd -m -s /bin/bash dev && echo 'dev:dev' | chpasswd
# 给予dev用户sudo权限
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:/usr/games:/usr/local/games:/snap/bin" >> /home/dev/.bashrc
RUN echo "export PATH=/usr/local/nvidia/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin" >> /home/dev/.profile
# 配置AWS S3访问地址
RUN echo "export AWS_ENDPOINT_URL_S3=http://dingofs.hdd.mas.zetyun.cn:8081" >> /home/dev/.bashrc
RUN echo "export AWS_ENDPOINT_URL_S3=http://dingofs.hdd.mas.zetyun.cn:8081" >> /home/dev/.profile
# 复制用户配置文件
# ssh 免密登录
COPY id_rsa.pub /home/dev/.ssh/authorized_keys
# aws 配置
COPY credentials /home/dev/.aws/credentials
# 修改目录所有权
RUN chown -R dev:dev /home/dev
# 配置SSH服务安全设置
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
RUN sed -i 's@session required pam_loginuid.so@session optional pam_loginuid.so@g' /etc/pam.d/sshd
# 暴露SSH端口
EXPOSE 22
# 启动SSH服务
CMD ["/usr/sbin/sshd", "-D"]
部署
在本示例中,部署信息由deployment.yaml文件指定。
具体指示弹性容器集群的Kubernetes control plane以下信息:
- 确保在任何时候只有一个Pod运行。这个实例是通过清单中的 spec.replicas 键值对定义的。
- 在运行pod的弹性容器集群计算节点上预留GPU、CPU和内存资源。在Kubernetes Pod中运行的每个Jupyter实例分配了1个gpu,由下面的spec.template.spec.containers.resources.limits.nvidia.com/gpu-h800 键值对定义。
- 指定镜像,由 spec.template.spec.containers.image 键值对定义。
- 指定pvc的挂载目录,由 spec.template.spec.containers.volumeMounts 键值对定义。
- 指定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资源部署
注意: 以下命令中,请将账号,密码,emial,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
ssh登录测试
ssh dev@127.0.0.1 -p 10022
配置vscode
- 编辑.ssh/config配置文件
在配置文件中添加以下信息
Host dev-pod
HostName 127.0.0.1
Port 10022
User dev
-
vscode安装ssh扩展
安装Remote-SSH扩展
安装完之后,进入
-
连接pod,并编码"hello.py"
进入pod中,验证"hello.py"文件创建成功