ECK 1.5.0 配置Ingress暴露Elasticsearch出现502网关错误如何解决?
问题根因
ECK 1.5.0默认创建的Elasticsearch集群开启了HTTP层TLS加密,对外暴露的9200端口走HTTPS协议,你当前的Ingress配置默认用HTTP协议转发请求到上游HTTPS端口,协议不匹配导致Nginx返回502网关错误。另外Nginx默认会校验上游服务的TLS证书,ECK自签的证书不在信任列表里,也会触发502错误。
解决方案
方案一:配置Ingress兼容HTTPS上游(推荐,不修改ES原生安全配置)
给Ingress新增两个注解即可:
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS":指定向上游转发用HTTPS协议nginx.ingress.kubernetes.io/proxy-ssl-verify: "off":关闭上游证书校验,兼容ECK自签证书
修改后的完整Ingress配置如下:
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: my-db-ingress namespace: my-namespace annotations: nginx.ingress.kubernetes.io/proxy-connect-timeout: "300" nginx.ingress.kubernetes.io/upstream-vhost: "$http_host" # 新增以下两个配置 nginx.ingress.kubernetes.io/backend-protocol: "HTTPS" nginx.ingress.kubernetes.io/proxy-ssl-verify: "off" spec: rules: - host: my-db-url.com http: paths: - backend: serviceName: my-db-es-http servicePort: 9200
方案二:关闭Elasticsearch HTTP层TLS(仅测试环境使用)
修改Elasticsearch资源配置,关闭TLS,Ingress不需要额外改动:
apiVersion: elasticsearch.k8s.elastic.co/v1 kind: Elasticsearch metadata: name: my-db spec: version: 7.12.0 # 新增以下配置关闭HTTP TLS http: tls: selfSignedCertificate: disabled: true volumeClaimDeletePolicy: DeleteOnScaledownOnly nodeSets: - name: default count: 3 config: node.store.allow_mmap: false volumeClaimTemplates: - metadata: name: elasticsearch-data spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi storageClassName: longhorn
验证操作
配置生效后,访问Elasticsearch需要携带认证信息:
- 先获取默认elastic用户的密码:
kubectl get secret my-db-es-elastic-user -n my-namespace -o go-template='{{.data.elastic | base64decode}}' - 访问测试:
curl -u elastic:<上一步获取的密码> http://my-db-url.com
正常会返回Elasticsearch的版本、集群名称等基础信息。
内容的提问来源于stack exchange,提问作者pear
相关产品推荐
相关产品推荐

