首页 > 解决方案 > GKE GCE-Internal Ingress 不适用于 Elasticsearch REST 客户端

问题描述

当通过 curl 或 python 的请求库使用标准 HTTP REST 请求时,我有一个gce-internal按预期工作的入口。但是,通过Java Elasticsearch RestHighLevelClient,所有请求都返回一个404 (backend NotFound), service rules for [ /... ] non-existent. 我已经通过 curl 尝试了完全相同的路线并且没有问题。通过 Apache Beam/Google Cloud Dataflow 的 ElasticsearchIO 库也存在同样的问题。两者都使用相同的org.elasticsearch.client.RestClient,而后者又使用org.apache.http.nio.client.CloseableHttpAsyncClient.

入口配置是:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: es-ingress
  annotations:
    kubernetes.io/ingress.class: "gce-internal"
spec:
  rules:
    - host: host.com
      http:
        paths:
          - path: /*
            backend:
              serviceName: elasticsearch-coordinating-only
              servicePort: 9200

标签: javaelasticsearchgoogle-kubernetes-enginekubernetes-ingress

解决方案


对于碰巧遇到此问题或类似问题的任何人,我都解决了这个问题。

原来 ES 客户端使用的 Apache HTTP 客户端添加了一个Host标头:

Host: host.com:80

这似乎至少打破了 GCE Ingress 课程。

RequestOption我通过设置 a来覆盖标题来修复。

String host = "host.com";
RequestOptions.Builder options = RequestOptions.DEFAULT.toBuilder();
options.addHeader("Host", host);
SearchResponse response = client.search(searchRequest, options.build());

我没有用其他端口测试过这个问题是否仍然存在。


推荐阅读