背景
我们的项目要接管各种容器化中间件服务,之前容器化sftp相当顺利,在dockerhub上找了一个most popular image 通过kubernetes deployment 一部署分分钟搞定。这次部署ftp本以为更加简单,结果遇到一些坑,费了些劲。在此记录一下。
ftp核心要点
磨刀不误砍柴工,用好一个中间件,或者我们这里容器化之前需要先对它有个大致的了解,不然不同的搜索答案然后尝试,盲人摸象,反而浪费时间,也不利于自己的进步。
FTP是基于TCP协议的服务,而在FTP服务器和客户端建立连接时,有两种模式主动模式(Active)和被动模式(Passive)。
通过以下两张图就可以了解ftp两种模式的工作流程
容器化部署
镜像相关信息及获取方式参见dockerhub
这里我对该镜像稍微进行了改动,主要在ftp配置文件中增加了以下配置,关于配置的解释我已经加到注释中,因为涉及安全问题,请根据自己情况评估
#If the pasv_promiscuous is off (the default), the vsftpd server checks that the client (IP address), which is connecting to the transfer port is the same, as the client connected to the FTP control connection (which requested the transfer).
#When the pasv_promiscuous is on, no check is done. So if a potential attacker guesses the random port number (which may not be random, but incremental, hence easy to guess), he/she can connect to the transfer port before a legitimate client does and steal the data (in case of a download) or sneak in his/her own data (in case of an upload).
pasv_promiscuous=YES
以上配置主要是避免一些安全检测使连接失败的问题,比如如下提示
425 Security: Bad IP connecting
需要镜像及改动后的镜像请留言
docker
docker run -d -v /my/data/directory:/home/vsftpd \
-p 20:20 -p 21:21 -p 21100-21110:21100-21110 \
-e FTP_USER=myuser -e FTP_PASS=mypass \
-e PASV_ADDRESS=127.0.0.1 -e PASV_MIN_PORT=21100 -e PASV_MAX_PORT=21110 \
--name vsftpd --restart=always fauria/vsftpd
在本地运行以上命令可以快速启动ftp服务,注意修改一下本地的挂载目录,另外环境变量PASV_ADDRESS如果是在本地无需修改,如果部署在其他服务器或者暴露在公网,要修改为对应的host ip 或 公网ip
有些文章中说需要进入到容器容器去修改或者增加一些用户信息,其实这里通过环境变量就已经搞定。docker部署方式相对简单很多。
kubernetes
今天主要遇到的问题就是我们是基于阿里云的kubernetes服务来部署的,service服务暴露是基于阿里云的负载均衡方式实现。
先说一下最终实现方案:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-ftp
namespace: default
spec:
progressDeadlin