java - 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
解决方案
对于碰巧遇到此问题或类似问题的任何人,我都解决了这个问题。
原来 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());
我没有用其他端口测试过这个问题是否仍然存在。
推荐阅读
- wordpress - How to remove Blank screen in wordpress website on click anywhere on screen
- python - Killing a Function
- javafx - Proper way to add nodes using loop
- excel-formula - Subtotal with 2 criteria
- opencv - findChessboardCorners does not work in opencv 4.5.2 python
- javascript - 减少 if else javascript 中的一些行
- azure - Azure 数据资源管理器具有流式传输的高摄取延迟
- node.js - npm install and ng serve taking CPU to 100%
- javascript - Windows Defender slowing down Electron startup
- reactjs - How to display banner images using react-multi-carousel in react?