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策略:
自定义策略时,确保包含客户端支持的TLS版本(如TLS 1.2、TLS 1.3),避免仅启用单一版本导致的握手失败。apiVersion: networking.gke.io/v1beta1 kind: FrontendConfig metadata: name: frontend-config spec: sslPolicy: "custom-ssl-policy"
4. 优化Pod就绪探针配置
- Pod副本变更时,若就绪探针配置不合理,未完全就绪的Pod可能被加入后端池引发连接中断。检查Deployment的就绪探针:
确保Pod真正就绪后才接收流量。readinessProbe: httpGet: path: /readiness port: 8080 initialDelaySeconds: 10 periodSeconds: 5
5. 切换为GCP托管证书
如你计划的那样,更换为GCP托管的非通配符证书。GCP托管证书会自动管理证书链和更新,减少配置错误概率,与GKE Ingress兼容性更好。
6. 借助GCP日志定位问题
- 查看负载均衡器的SSL相关日志,过滤握手失败的具体原因(如证书不匹配、协议不支持、后端超时等)。
- 监控负载均衡器的TCP连接数和SSL握手成功率,确认问题是否与Pod副本变更时间点对应。
内容的提问来源于stack exchange,提问作者Dmitri Zamysloff
相关产品推荐
相关产品推荐

