使用rsync上传本地文件至VKS(推荐T级别的文件)
SSH(Secure Shell)是一种安全通道协议,主要用于实现字符界面的远程登录、远程复制等功能。 本文档将部署一个开启了ssh服务的容器,通过 rsync 命令,将本地的文件同步到弹性容器集群的文件系统中。
前置条件
本教程假定您已经具备以下条件:
- 在您的系统上安装了kubectl
- 开通了AlayaNeW弹性容器集群,具体步骤参考:开通弹性容器集群
教程源代码
首先下载本教程所需要的源码文件
清单
本教程包含的文件以及作用说明。
文件名 | 说明 |
---|---|
Dockerfile | 镜像构建文件:用来构建docker镜像 |
ssh_pod.yaml | 定义如何启停pod |
portfoword.sh | 端口转发脚本 |
rsync.sh | 文件同步脚本 |
Dockerfile
基于Pytorch的基础镜像,自定义镜像:
- 安装基础工具包和SSH服务等;
- 配置root用户及密码;
- 配置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 \
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_NAME | pod名称 | 自定义 | ssh-pod |
LOCAL_PORT | 本地端口 | 自定义 | 1022 |
POD_PORT | pod中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
解压文件
# 解压文件
unzip sshPod-fa775e757f948b2ef34efe5807e80cb3.zip -d ./sshpod
ls -l sshpod
自定义镜像
注意: 以下命令中,请将账号,密码,镜像名称,以及镜像访问地址等信息替换成你自己的。
# 进入sshpod目录
cd sshpod
# 登陆Harbor账号,请将账号,密码替换成你自己的
docker login https://registry.hd-01.alayanew.com:8443/ -u [user] -p [passwd]
# 拉取基础镜像,这里我们以 pytorch/pytorch:2.5.1-cuda12.4-cudnn9-devel这个镜像做示例,如果您需要改变基础镜像,请对应修改Dockerfile中的基础镜像
docker pull pytorch/pytorch:2.5.1-cuda12.4-cudnn9-devel
# 构建镜像
docker build --platform=linux/amd64 -t pytorch/pytorch:2.5.1-cuda12.4-cudnn9-devel-ssh-2.0 -f Dockerfile .
# 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
k8s资源部署
# 声明弹性容器集群配置:注意将路径替换成你kubeconfig文件的实际路径
export KUBECONFIG="[/path/to/kubeconfig]"
# 创建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
# 创建ssh-pod
kubectl create -f ssh_pod.yaml
端口转发
在宿主机进行端口转发
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
3. 测试
ssh root@127.0.0.1 -p 1022
**提示:**用户名:root,密码:root。
使用rsync同步文件
在宿主机上使用rsync命令同步本地文件到VKS(弹性容器集群)文件系统
1. 宿主机安装rsync
- Linux
- macOS
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
使用 Homebrew 安装:
# 更新Homebrew,确保Homebrew是最新版本
brew update
brew upgrade
# 安装 rsync
brew 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