k8s部署ftp后,连接时出现time out 解决
在docker部署ftp没问题,但是按常规步骤部署到k8s后出现连接问题。
一种解决方案是修改客户端连接配置,将连接模式改为主动模式。但是有些客户端不方便修改,还是需要调整为支持被动模式。
推荐先理解主动模式和被动模式: FTP协议主动模式与被动模式的详解
简单来说对于FTP被动模式来说,除了需要默认的21端口用于客户端登录,还需要一个随机端口(1024以上)用于读取数据。而我们可以通过配置随机端口的范围,明确需要映射哪些端口。
核心在于这些随机的端口一定要与映射出去的端口一致
ftp-pvc.yaml
# 存储按自己环境修改,此次使用Longhorn
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: ftp-pvc
namespace: ftp
spec:
storageClassName: longhorn
accessModes:
- ReadWriteMany
resources:
requests:
storage: 20Gi
ftp-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: ftp
namespace: ftp
spec:
replicas: 1
selector:
matchLabels:
app: ftp
template:
metadata:
labels:
app: ftp
spec:
# 存储按自己环境修改,此次使用Longhorn
volumes:
- name: ftp-pv-storage
persistentVolumeClaim:
claimName: ftp-pvc
containers:
- name: ftp-container
image: fauria/vsftpd
# 除21端口外 此处的端口要与下方设置的被动模式最大端口和最小端口匹配,例如设置随机端口范围为 31110-31115。因为此处容器内的随机端口要与映射后的一致,所以设置为30000以上,在k8s设置端口范围内
ports:
- containerPort: 31110
protocol: TCP
- containerPort: 31111
protocol: TCP
- containerPort: 31112
protocol: TCP
- containerPort: 31113
protocol: TCP
- containerPort: 31114
protocol: TCP
- containerPort: 31115
protocol: TCP
- containerPort: 21
protocol: TCP
volumeMounts:
- mountPath: "/home/vsftpd"
name: ftp-pv-storage
env:
- name: FTP_USER
value: "ftpuser"
- name: FTP_PASS
value: "xxxxxxx"
# 随机最大端口与最小端口,要与上面设置的匹配
- name: PASV_MIN_PORT
value: "31110"
- name: PASV_MAX_PORT
value: "31115"
- name: PASV_ENABLE
value: "yes"
# 服务器传回的IP地址,一般为对外公网地址,即客户端连接ftp所用的地址。
- name: PASV_ADDRESS
value: "172.xx.xx.xx"
#- name: PASV_ADDRESS
# valueFrom:
# fieldRef:
# fieldPath: status.hostIP
ftp-service.yaml
apiVersion: v1
kind: Service
metadata:
name: ftp-service
labels:
app: ftp-service
namespace: ftp
spec:
type: NodePort
# 除21端口映射外,其他端口需保持一致
ports:
- name: ftp-21
nodePort: 30021
port: 21
- name: ftp-31110
nodePort: 31110
port: 31110
- name: ftp-31111
nodePort: 31111
port: 31111
- name: ftp-31112
nodePort: 31112
port: 31112
- name: ftp-31113
nodePort: 31113
port: 31113
- name: ftp-31114
nodePort: 31114
port: 31114
- name: ftp-31115
nodePort: 31115
port: 31115
selector:
app: ftp