You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GKE上SFTPGo+Nginx-Ingress部署后SFTP连接失败求助

SFTP连接失败问题排查与解决(GKE + Nginx Ingress + SFTPGo)

核心问题根源

Nginx Ingress Controller默认仅处理HTTP/HTTPS流量,SFTP基于纯TCP协议,无法通过普通的Ingress HTTP路径规则进行转发。你当前的Ingress配置将SFTP端口22加入HTTP规则中,这是完全无效的,也是连接失败的核心原因。

解决方案:配置Nginx Ingress的TCP代理

要暴露SFTP服务,需通过Nginx Ingress的TCP端口转发功能实现:

  1. 修改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端口冲突,可根据需求调整。

  2. 更新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
    
  3. 清理Ingress中的无效规则
    删除Ingress里针对SFTP的HTTP路径规则,保留Web服务的规则即可:

    spec:
      rules:
        - host: "sample.domain"
          http:
            paths:
              - backend:
                  service:
                    name: release-name-sftpgo
                    port:
                      number: 80
                path: /
                pathType: Prefix
    

其他配置问题修正

  1. Deployment重复探针定义
    你在Deployment中重复定义了livenessProbe和readinessProbe,会导致配置冲突,保留一组有效探针即可:

    livenessProbe:
      httpGet:
        path: /healthz
        port: telemetry
    readinessProbe:
      httpGet:
        path: /healthz
        port: telemetry
    
  2. BackendConfig重复健康检查
    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实现证书自动化管理:

  1. 安装cert-manager到集群
  2. 创建ClusterIssuer或Issuer(对接Let's Encrypt等CA)
  3. 在Ingress中添加注解:cert-manager.io/cluster-issuer: "你的Issuer名称",并配置TLS规则

若坚持使用GKE托管证书,需切换到GCE Ingress(将Ingress注解kubernetes.io/ingress.class改为gce),但会失去Nginx Ingress的自定义能力,需根据业务需求选择。

内容的提问来源于stack exchange,提问作者kubexplore

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 17:55:08