【问题标题】:GKE GCE-Internal Ingress does not work with Elasticsearch REST ClientGKE GCE-Internal Ingress 不适用于 Elasticsearch REST 客户端
【发布时间】:2021-04-08 18:34:24
【问题描述】:

当通过 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

【问题讨论】:

    标签: java elasticsearch google-kubernetes-engine kubernetes-ingress


    【解决方案1】:

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

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

    Host: host.com:80
    

    这似乎至少破坏了 GCE Ingress 类。

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-06-25
      • 1970-01-01
      • 2014-06-23
      • 2021-03-02
      • 1970-01-01
      • 1970-01-01
      • 2019-12-01
      • 1970-01-01
      • 2017-12-21
      相关资源
      最近更新 更多