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

GKE Ingress配置TLS终止时出现SSL_ERROR_SYSCALL问题求助

GKE Ingress SSL连接不稳定问题排查与解决方案

问题概述

在GKE环境中配置Service、Ingress等资源后,出现SSL连接不稳定的情况:多数请求返回OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to ...,Java客户端提示“Remote host terminated the handshake”,仅偶尔能成功连接,且该现象与Pod副本变更相关。尝试过GCP注册自管证书、Kubernetes Secret证书、通配符证书,甚至简化配置移除BackendConfig和FrontendConfig后,问题仍未解决。

相关配置回顾

初始配置

---
apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
  name: backend-config
spec:
  healthCheck:
    type: HTTP
    requestPath: /readiness
    port: 8080
---
apiVersion: v1
kind: Service
metadata:
  annotations:
    cloud.google.com/app-protocols: '{"http":"HTTP"}'
    cloud.google.com/backend-config: '{"default": "backend-config"}'
  name: app
  labels:
    app: app
spec:
  type: ClusterIP
  selector:
    app: app
  ports:
    - name: http
      port: 80
      targetPort: http
      protocol: TCP
---
apiVersion: networking.gke.io/v1beta1
kind: FrontendConfig
metadata:
  name: frontend-config
spec:
  redirectToHttps:
    enabled: true
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: app-ingress
  annotations:
    kubernetes.io/ingress.global-static-ip-name: 'app-ip'
    networking.gke.io/v1beta1.FrontendConfig: 'frontend-config'
    ingress.gcp.kubernetes.io/pre-shared-cert: 'ssl-certificate'
    kubernetes.io/ingress.allow-http: 'false'
  labels:
    app: app
spec:
#  tls:
#    - secretName: tls-secret
  rules:
    - host: myhost.com
      http:
        paths:
          - path: /*
            pathType: Prefix
            backend:
              service:
                name: app
                port:
                  name: http

更新后的简化配置

---
apiVersion: v1
kind: Service
metadata:
  name: app-service
  labels:
    app: app-service
spec:
  type: ClusterIP
  selector:
    app: app
  ports:
    - name: http
      port: 80
      targetPort: http
      protocol: TCP 
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: app-ingress
  annotations:
    kubernetes.io/ingress.global-static-ip-name: 'app-ip'
    kubernetes.io/ingress.allow-http: 'false'
  labels:
    app: app
spec:
  tls:
    - hosts:
        - sub.domain.com
      secretName: tls-secret
  rules:
    - host: sub.domain.com
      http:
        paths:
          - path: /api
            pathType: Prefix
            backend:
              service:
                name: app-service
                port:
                  name: http

排查思路与解决方案

1. 检查负载均衡器后端健康状态

  • 登录GCP控制台,找到Ingress对应的外部负载均衡器,查看后端服务的健康检查状态。若部分Pod健康检查失败,负载均衡器切换流量时可能引发SSL握手中断。
  • 确认BackendConfig中的健康检查路径/readiness是否返回200状态码,端口8080是否与Pod实际监听端口一致。

2. 验证证书配置完整性

  • 自管证书需确保包含完整链(服务器证书+中间证书+根证书),格式为PEM。可通过openssl x509 -in cert.pem -text -noout检查证书链是否完整。
  • 使用Kubernetes Secret存储证书时,确认tls.crt和tls.key内容正确,且Secret与Ingress在同一命名空间。
  • 通配符证书需确保Ingress的host字段与通配符规则匹配(如sub.domain.com匹配*.domain.com),避免证书不匹配导致握手失败。

3. 调整TLS协议兼容性配置

  • GKE Ingress默认TLS配置可能与客户端存在兼容性问题,可通过FrontendConfig指定自定义SSL策略:
    apiVersion: networking.gke.io/v1beta1
    kind: FrontendConfig
    metadata:
      name: frontend-config
    spec:
      sslPolicy: "custom-ssl-policy"
    
    自定义策略时,确保包含客户端支持的TLS版本(如TLS 1.2、TLS 1.3),避免仅启用单一版本导致的握手失败。

4. 优化Pod就绪探针配置

  • Pod副本变更时,若就绪探针配置不合理,未完全就绪的Pod可能被加入后端池引发连接中断。检查Deployment的就绪探针:
    readinessProbe:
      httpGet:
        path: /readiness
        port: 8080
      initialDelaySeconds: 10
      periodSeconds: 5
    
    确保Pod真正就绪后才接收流量。

5. 切换为GCP托管证书

如你计划的那样,更换为GCP托管的非通配符证书。GCP托管证书会自动管理证书链和更新,减少配置错误概率,与GKE Ingress兼容性更好。

6. 借助GCP日志定位问题

  • 查看负载均衡器的SSL相关日志,过滤握手失败的具体原因(如证书不匹配、协议不支持、后端超时等)。
  • 监控负载均衡器的TCP连接数和SSL握手成功率,确认问题是否与Pod副本变更时间点对应。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 19:24:19