如何通过FileZilla访问GKE FTP服务器?配置后连接超时排查
解决Kubernetes中FTP服务连接超时的问题
看起来你遇到的核心问题是FTP被动模式的端口未正确配置,加上几个小的配置疏漏,导致客户端无法建立完整的FTP连接。我帮你梳理下需要修正的地方:
1. 补上FTP被动模式的关键配置
FTP协议分控制连接(21端口)和数据连接,现代客户端默认用被动模式,需要额外的端口范围来传输数据。你用的fauria/vsftpd镜像默认使用21100-21110作为被动端口,但你的配置里完全没处理这些端口:
修改Deployment.yaml
在容器的env和ports部分添加以下内容:
containers: - name: my-ftp-container image: fauria/vsftpd ports: - containerPort: 21 protocol: TCP name: "ftp-server" # 添加被动端口范围的容器端口暴露 - containerPort: 21100 protocol: TCP name: "ftp-passive-start" - containerPort: 21110 protocol: TCP name: "ftp-passive-end" volumeMounts: - mountPath: "/home/vsftpd" name: task-pv-storage env: - name: FTP_USER value: "user" - name: FTP_PASS value: "password" # 添加被动模式的环境变量 - name: PASV_MIN_PORT value: "21100" - name: PASV_MAX_PORT value: "21110" - name: PASV_ADDR_RESOLVE value: "YES" # 让容器自动解析外部访问的IP,适配LoadBalancer动态IP场景
2. 更新Service.yaml,映射被动端口
你的Service只开放了21端口,必须把被动端口也映射出去。GCE LoadBalancer支持端口范围配置,这样不用逐个写端口:
apiVersion: v1 kind: Service metadata: name: my-ftp-service labels: app: my-ftp spec: type: LoadBalancer ports: - port: 21 targetPort: 21 nodePort: 30080 name: ftp-control # 添加被动端口范围映射 - port: 21100 portRange: 21100-21110 targetPort: 21100-21110 name: ftp-passive selector: app: my-ftp
3. 清理无用的Ingress配置
Ingress主要是为HTTP/HTTPS服务设计的,不支持原生FTP协议,你写的Ingress.yaml不仅没用,还存在serviceName写错的问题(你实际的Service叫my-ftp-service,但Ingress里写的是ftp-ftp-service)。直接删除这个资源即可:
kubectl delete ingress ftp-ftp-ingress
4. 确认GCE防火墙规则
GCE会自动为LoadBalancer创建对应的防火墙规则,但为了保险起见,你可以手动确认:
- 允许TCP端口21和21100-21110的入站流量到你的K8s集群节点
- 如果用NodePort访问,还要确保节点的30080和32100-32110端口(对应被动端口的NodePort范围)在防火墙中开放
最后验证步骤
- 重新部署更新后的资源:
kubectl apply -f Deployment.yaml kubectl apply -f Service.yaml
- 等待LoadBalancer分配好外部IP,用
kubectl get service my-ftp-service查看 - 用FileZilla连接时,使用外部IP+21端口(或者NodePort 30080),保持默认的被动模式即可
内容的提问来源于stack exchange,提问作者黃皓哲
相关产品推荐
相关产品推荐

