跳到主要内容

使用rsync上传本地文件至VKS(推荐T级别的文件)

SSH(Secure Shell)是一种安全通道协议,主要用于实现字符界面的远程登录、远程复制等功能。 本文档将部署一个开启了ssh服务的容器,通过 rsync 命令,将本地的文件同步到弹性容器集群的文件系统中。

前置条件

本教程假定您已经具备以下条件:

  • 在您的系统上安装了kubectl
  • 开通了AlayaNeW弹性容器集群,具体步骤参考:开通弹性容器集群

教程源代码

首先下载本教程所需要的源码文件

清单

本教程包含的文件以及作用说明。

文件名说明
Dockerfile镜像构建文件:用来构建docker镜像
ssh_pod.yaml定义如何启停pod
portfoword.sh端口转发脚本
rsync.sh文件同步脚本

Dockerfile

基于Pytorch的基础镜像,自定义镜像:

  1. 安装基础工具包和SSH服务等;
  2. 配置root用户及密码;
  3. 配置ssh 服务:开启openssh-server 服务,配置ssh免密登录。
  4. 暴露 22端口;
  5. 启动 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 \
net-tools \
rsync \
&& apt-get clean

# 配置SSH服务
RUN mkdir /var/run/sshd

# 设置root用户密码
RUN echo 'root:root' | chpasswd

# 配置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"]

ssh_pod.yaml

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

apiVersion: v1
kind: Pod
metadata:
name: ssh-pod
namespace: deepseek
labels:
app: ssh
spec:
restartPolicy: Never
containers:
- name: dev-container
image: registry.hd-01.alayanew.com:8443/vc-huangxs/pytorch/pytorch:2.5.1-cuda12.4-cudnn9-devel-ssh-2.0
imagePullPolicy: Always
resources:
requests: # Added resource requests
memory: "4G"
cpu: "2"
limits:
memory: "4G" # Added memory limit
cpu: "2" # Added CPU limit
ports: # 添加端口映射
- containerPort: 22 # 容器内应用的端口
name: ssh-port
protocol: TCP
command: ["/usr/sbin/sshd", "-D"]
volumeMounts:
- name: workspace
mountPath: "/workspace"
imagePullSecrets:
- name: harbor-secret
volumes:
- name: workspace
persistentVolumeClaim:
claimName: pvc-capacity-userdata

注意: 编写ssh_pod.yaml文件时,注意将镜像替换成你自己的:

变量名说明来源示例
image镜像名称自定义镜像registry.hd-01.alayanew.com:8443/***/pytorch/pytorch:2.5.1-cuda12.4-cudnn9-devel-ssh-2.0

portfoword.sh

端口转发脚本

#!/bin/bash

NAMESPACE="deepseek"
POD_NAME="ssh-pod"
LOCAL_PORT=1022
POD_PORT=22

while true; do
echo "Starting port-forward to $POD_NAME:$POD_PORT on local port $LOCAL_PORT..."
kubectl port-forward pod/$POD_NAME $LOCAL_PORT:$POD_PORT -n $NAMESPACE
echo "Port-forward disconnected. Retrying in 5 seconds..."
sleep 1
done

注意: 修改 portfoword.sh 文件时,将以下信息替换成你自己的:

变量名说明来源示例
NAMESPACE命名空间自定义deepseek
POD_NAMEpod名称自定义ssh-pod
LOCAL_PORT本地端口自定义1022
POD_PORTpod中sshd服务使用的端口自定义22

rsync.sh

文件同步脚本

#!/bin/bash

# 设置远程主机、端口、源路径和目标路径
REMOTE_HOST="127.0.0.1"
REMOTE_PORT="1022"
SOURCE_PATH="/data/docker"
DEST_PATH="/workspace"

while true; do
# 执行rsync命令
rsync -avP --partial -e "ssh -p $REMOTE_PORT" "${SOURCE_PATH}" "${REMOTE_HOST}:${DEST_PATH}" && break || echo "Rsync failed, retrying in 1 second..."

# 如果上面的命令失败了(非零退出状态),则等待1秒后重试
sleep 1
done

注意: 修改 rsync.sh 脚本时,将以下信息替换成你自己的:

变量名说明来源示例
REMOTE_HOST远程地址自定义deepseek
REMOTE_PORT远程端口(本地转发端口)自定义ssh-pod
SOURCE_PATH本地路径自定义/data/docker
DEST_PATH目标路径自定义/workspace

操作步骤

部署

您可以通过kubectl命令手动部署;也可以通过私有应用部署一键部署。

文件准备

首先下载本教程所需要的源码文件

将下载的压缩包放到宿主机的开发目录,这里我们放到了"/home/dev"目录下,您可以根据实际情况改您的开发目录。

# 进入工作目录
cd /home/dev

image-20250218111809340

解压文件

# 解压文件
unzip sshPod-fa775e757f948b2ef34efe5807e80cb3.zip -d ./sshpod

ls -l sshpod

image-20250218112300996

自定义镜像

注意: 以下命令中,请将账号,密码,镜像名称,以及镜像访问地址等信息替换成你自己的。

# 进入sshpod目录
cd sshpod

# 登陆Harbor账号,请将账号,密码替换成你自己的
docker login https://registry.hd-01.alayanew.com:8443/ -u [user] -p [passwd]

image-20250218113813056

# 拉取基础镜像,这里我们以 pytorch/pytorch:2.5.1-cuda12.4-cudnn9-devel这个镜像做示例,如果您需要改变基础镜像,请对应修改Dockerfile中的基础镜像
docker pull pytorch/pytorch:2.5.1-cuda12.4-cudnn9-devel

image-20250218113850904

# 构建镜像
docker build --platform=linux/amd64 -t pytorch/pytorch:2.5.1-cuda12.4-cudnn9-devel-ssh-2.0 -f Dockerfile .

image-20250218113923176

# tag 这里注意将“registry.hd-01.alayanew.com:8443/***”替换成你的镜像仓库访问地址
docker tag pytorch/pytorch:2.5.1-cuda12.4-cudnn9-devel-ssh-2.0 registry.hd-01.alayanew.com:8443/***/pytorch/pytorch:2.5.1-cuda12.4-cudnn9-devel-ssh-2.0

# push 这里注意将“registry.hd-01.alayanew.com:8443/***”替换成你的镜像仓库访问地址
docker push registry.hd-01.alayanew.com:8443/***/pytorch/pytorch:2.5.1-cuda12.4-cudnn9-devel-ssh-2.0

image-20250218114306372

k8s资源部署

# 声明弹性容器集群配置:注意将路径替换成你kubeconfig文件的实际路径
export KUBECONFIG="[/path/to/kubeconfig]"

image-20250218114756914

# 创建namespace,这里命名空间以"deepseek"为例
kubectl create namespace deepseek

# 创建secret,注意将用户,密码,email替换成你自己的
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 deepseek

image-20250218115146077

# 创建ssh-pod
kubectl create -f ssh_pod.yaml

image-20250218115239896

端口转发

在宿主机进行端口转发

1. 根据清单提示修改portfoword.sh文件内容

#!/bin/bash

NAMESPACE="deepseek"
POD_NAME="ssh-pod"
LOCAL_PORT=1022
POD_PORT=22

while true; do
echo "Starting port-forward to $POD_NAME:$POD_PORT on local port $LOCAL_PORT..."
kubectl port-forward pod/$POD_NAME $LOCAL_PORT:$POD_PORT -n $NAMESPACE
echo "Port-forward disconnected. Retrying in 5 seconds..."
sleep 1
done

2. 转发

bash portfoword.sh

image-20250218115350342

3. 测试

ssh root@127.0.0.1 -p 1022 

image-20250218115421672

**提示:**用户名:root,密码:root。

使用rsync同步文件

在宿主机上使用rsync命令同步本地文件到VKS(弹性容器集群)文件系统

1. 宿主机安装rsync

1.1 使用 apt(Debian/Ubuntu)
# 更新包列表
sudo apt update
# 安装 rsync
sudo apt install rsync
# 验证安装
rsync --version
1.2 使用 yum(CentOS/RHEL)
# # 更新包列表
sudo yum update
#安装 rsync
sudo yum install rsync
#验证安装
rsync --version
1.3 使用 dnf(Fedora)
sudo dnf update
# 安装 rsync
sudo dnf install rsync
# 验证安装
rsync --version

2. 修改 rsync.sh 脚本

根据清单 提示修改 rsync.sh 脚本

#!/bin/bash

# 设置远程主机、端口、源路径和目标路径
REMOTE_HOST="127.0.0.1"
REMOTE_PORT="1022"
SOURCE_PATH="/data/docker"
DEST_PATH="/workspace"

while true; do
# 执行rsync命令
rsync -avP --partial -e "ssh -p $REMOTE_PORT" "${SOURCE_PATH}" "${REMOTE_HOST}:${DEST_PATH}" && break || echo "Rsync failed, retrying in 1 second..."

# 如果上面的命令失败了(非零退出状态),则等待1秒后重试
sleep 1
done

3. 执行脚本,将文件同步到远端

bash  rsync.sh

image-20250218115534166

image-20250218115618150