GKE上SFTPGo+Nginx-Ingress部署后SFTP连接失败求助
核心问题根源
Nginx Ingress Controller默认仅处理HTTP/HTTPS流量,SFTP基于纯TCP协议,无法通过普通的Ingress HTTP路径规则进行转发。你当前的Ingress配置将SFTP端口22加入HTTP规则中,这是完全无效的,也是连接失败的核心原因。
解决方案:配置Nginx Ingress的TCP代理
要暴露SFTP服务,需通过Nginx Ingress的TCP端口转发功能实现:
修改Nginx Ingress Controller的ConfigMap
在Ingress Controller所在命名空间(通常为ingress-nginx)下,添加TCP端口映射规则:apiVersion: v1 kind: ConfigMap metadata: name: nginx-ingress-controller namespace: ingress-nginx data: # 格式:外部端口:目标命名空间/服务名:服务端口 2222: "sftpgo/release-name-sftpgo:22"这里用外部端口2222避免与默认SSH端口冲突,可根据需求调整。
更新Nginx Ingress Controller的Service
确保Ingress Controller的LoadBalancer Service暴露刚才配置的TCP端口:spec: ports: - name: http port: 80 targetPort: http - name: https port: 443 targetPort: https - name: sftp-proxy port: 2222 targetPort: 2222 protocol: TCP清理Ingress中的无效规则
删除Ingress里针对SFTP的HTTP路径规则,保留Web服务的规则即可:spec: rules: - host: "sample.domain" http: paths: - backend: service: name: release-name-sftpgo port: number: 80 path: / pathType: Prefix
其他配置问题修正
Deployment重复探针定义
你在Deployment中重复定义了livenessProbe和readinessProbe,会导致配置冲突,保留一组有效探针即可:livenessProbe: httpGet: path: /healthz port: telemetry readinessProbe: httpGet: path: /healthz port: telemetryBackendConfig重复健康检查
BackendConfig中不能同时定义两个healthCheck,只会生效最后一个,保留适合Web服务的HTTP健康检查即可:spec: healthCheck: timeoutSec: 1 type: HTTP requestPath: /healthz port: 8080
测试SFTP连接
配置完成后,使用Ingress LoadBalancer的外部IP+指定的TCP端口连接:
sftp -P 2222 你的用户名@<Ingress-LB-IP>
额外:GKE上Nginx Ingress结合证书管理
你提到的GKE托管证书(Google Managed Certificate)仅适配GCE Ingress Controller,若使用Nginx Ingress,建议通过cert-manager实现证书自动化管理:
- 安装cert-manager到集群
- 创建
ClusterIssuer或Issuer(对接Let's Encrypt等CA) - 在Ingress中添加注解:
cert-manager.io/cluster-issuer: "你的Issuer名称",并配置TLS规则
若坚持使用GKE托管证书,需切换到GCE Ingress(将Ingress注解kubernetes.io/ingress.class改为gce),但会失去Nginx Ingress的自定义能力,需根据业务需求选择。
内容的提问来源于stack exchange,提问作者kubexplore

