我目前正在使用 Helm 图表在 Kubernetes 环境中部署 Elasticsearch。 Pod 正在创建并运行,没有出现任何问题。但是,我在从不同的 Python 服务连接到 Elasticsearch 服务时遇到问题。连接尝试导致以下错误:
elastic_transport.TlsError: TLS error caused by: TlsError(TLS error caused by: SSLError([SSL: UNEXPECTED_EOF_WHILE_READING] EOF occurred in violation of protocol (_ssl.c:1006)))
我的图表看起来像
- name: elasticsearch
version: 8.5.1
repository: https://helm.elastic.co
pod 似乎运行良好
elasticsearch-master-0 2/2 Running 0 92m
elasticsearch-master-1 2/2 Running 0 92m
elasticsearch-master-2 2/2 Running 0 92m
能够绕过验证来卷曲URL
curl -k -u elastic https://elasticsearch-master-headless:9200
Enter host password for user 'elastic':
{
"name" : "elasticsearch-master-2",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "id",
"version" : {
"number" : "8.5.1",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "c1310c45fc534583afe2c1c03046491efba2bba2",
"build_date" : "2022-11-09T21:02:20.169855900Z",
"build_snapshot" : false,
"lucene_version" : "9.4.1",
"minimum_wire_compatibility_version" : "7.17.0",
"minimum_index_compatibility_version" : "7.0.0"
},
"tagline" : "You Know, for Search"
}
在同一个 Pod 内。 但越来越
curl: (35) OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to elasticsearch-master-headless:9200
来自同一集群中不同 pod 的错误。
如有任何帮助,我们将不胜感激,如果需要,请询问更多详细信息。
您在从同一 Kubernetes 集群中的不同 Python 服务连接到 Elasticsearch 时遇到的问题似乎与 SSL/TLS 验证有关。以下是帮助诊断和解决此问题的一些步骤和注意事项:
检查服务连接和网络策略:
nslookup
或 dig
从 Python 服务 pod 到 Elasticsearch 服务,以确保 DNS 名称 elasticsearch-master-headless
正确解析。TLS 配置:
curl -k
连接,说明TLS/SSL证书验证有问题。这表明您的 Elasticsearch 实例正在使用自签名证书。在 Python 中禁用 SSL 验证:
verify_certs=False
参数禁用 SSL 验证。from elasticsearch import Elasticsearch
es = Elasticsearch(
['https://elasticsearch-master-headless:9200'],
http_auth=('elastic', 'your_password'),
scheme="https",
port=9200,
verify_certs=False
)
使用证书:
kubectl cp <elasticsearch_pod>:/usr/share/elasticsearch/config/certs/ca.crt /path/to/local/ca.crt
from elasticsearch import Elasticsearch
es = Elasticsearch(
['https://elasticsearch-master-headless:9200'],
http_auth=('elastic', 'your_password'),
scheme="https",
port=9200,
ca_certs='/path/to/mounted/ca.crt'
)
使用 Curl 进行调试:
curl
进一步调试,您可以使用 --cacert
选项指定 CA 证书,而不是绕过 SSL 验证。
curl --cacert /path/to/ca.crt -u elastic https://elasticsearch-master-headless:9200
日志和事件:
kubectl logs <pod-name>
获取日志。kubectl get events
检查 Kubernetes 事件是否报告任何异常或问题。通过执行这些步骤,您应该能够确定问题是否是由网络策略、DNS 解析或 SSL/TLS 证书验证引起的,并采取适当的操作来解决它。