Istio Ingress配置ACM证书后出现上游连接终止错误求助
排查 Istio + AWS ELB SSL 配置导致的上游连接错误
根据你的描述,之前无SSL的配置正常,添加ELB SSL后出现upstream connect error or disconnect/reset before headers. reset reason: connection termination错误,核心问题出在ELB与Istio IngressGateway的流量协议不匹配,结合你的配置细节,我整理了以下排查步骤和解决方法:
核心原因分析
Istio IngressGateway容器默认在80端口监听HTTP流量,443端口监听HTTPS流量。而你的配置中:
- ELB在
443端口终止SSL后,用HTTP协议转发流量到IngressGateway的443端口 - 你在Gateway配置里把
443端口的协议设为HTTP,但IngressGateway容器的443端口默认期望的是HTTPS流量 - 两者协议不匹配导致IngressGateway无法解析流量,直接断开连接,进而触发上游连接错误
解决方法(推荐方案)
调整ELB到IngressGateway的端口映射,让ELB终止SSL后的HTTP流量转发到IngressGateway的80端口(默认监听HTTP),同时修正Gateway配置避免循环重定向:
1. 更新Istio IngressGateway的Helm values配置
修改你的values.yaml中istio-ingressgateway部分,调整Service端口映射:
istio-ingressgateway: serviceAnnotations: service.beta.kubernetes.io/aws-load-balancer-ssl-cert: "arn:aws:acm:ap-southeast-1:xxxxx:certificate/my-crt" service.beta.kubernetes.io/aws-load-balancer-backend-protocol: "http" service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "https" # 可选:让ELB自动把HTTP请求重定向到HTTPS(替代Gateway的redirect配置) service.beta.kubernetes.io/aws-load-balancer-redirect-http-to-https: "true" service: ports: - name: http port: 80 targetPort: 80 - name: https port: 443 targetPort: 80 # 将ELB的HTTPS流量转发到IngressGateway的HTTP监听端口
2. 修正Gateway配置
移除80端口的httpsRedirect配置(避免ELB转发后出现循环重定向):
apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: istio-gateway spec: selector: istio: ingressgateway #default istio ingressgateway servers: - port: number: 80 name: http-istio-gateway protocol: HTTP hosts: - "*" # 移除httpsRedirect,因为ELB已处理SSL重定向 - port: number: 443 name: https-istio-gateway protocol: HTTP hosts: - "*"
3. 重新部署Istio和Gateway配置
# 重新生成Istio配置并应用 helm template ./istio/install/kubernetes/helm/istio --name istio --namespace istio-system --values ./mesh/values.yaml | kubectl apply -f - # 重新应用Gateway配置 kubectl apply -f gateway.yaml
额外排查步骤
如果问题仍然存在,可以检查以下内容:
- 后端服务状态:确认
api-gateway和api-gateway-ws的Pod处于Running状态:kubectl get pods -n default - 服务Endpoint可用性:检查后端服务的Endpoint是否正常:
kubectl get endpoints api-gateway -n default kubectl get endpoints api-gateway-ws -n default - IngressGateway日志:查看IngressGateway的日志获取更详细的错误信息:
kubectl logs -n istio-system -l istio=ingressgateway --tail=50
内容的提问来源于stack exchange,提问作者pham cuong
相关产品推荐
相关产品推荐

