在 Kubernetes 环境中连接 ElasticSearch 服务抛出 TLS 错误

问题描述 投票:0回答:1

我目前正在使用 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 的错误。

如有任何帮助,我们将不胜感激,如果需要,请询问更多详细信息。

elasticsearch kubernetes kubernetes-helm
1个回答
0
投票

您在从同一 Kubernetes 集群中的不同 Python 服务连接到 Elasticsearch 时遇到的问题似乎与 SSL/TLS 验证有关。以下是帮助诊断和解决此问题的一些步骤和注意事项:

  1. 检查服务连接和网络策略

    • 确保 Kubernetes 集群中的网络策略不会限制 Pod 之间的流量。这可以通过检查集群中应用的网络策略来验证。
    • 验证 DNS 解析在您的 Kubernetes 集群中是否正常工作。尝试使用
      nslookup
      dig
      从 Python 服务 pod 到 Elasticsearch 服务,以确保 DNS 名称
      elasticsearch-master-headless
      正确解析。
  2. TLS 配置

    • 既然可以使用
      curl -k
      连接,说明TLS/SSL证书验证有问题。这表明您的 Elasticsearch 实例正在使用自签名证书。
    • 您可以在 Python 代码中禁用 SSL 验证,看看这是否可以暂时解决问题。但是,出于安全原因,不建议在生产中这样做。
  3. 在 Python 中禁用 SSL 验证:

    • 使用 Elasticsearch 客户端配置中的
      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
      )
      
  4. 使用证书:

    • 如果您需要维护 SSL 验证,您应该将 Python 客户端配置为信任自签名证书。您可以通过提供 Elasticsearch 正在使用的 CA 证书来实现此目的。
    • 首先,从 Elasticsearch pod 中导出 CA 证书。
      kubectl cp <elasticsearch_pod>:/usr/share/elasticsearch/config/certs/ca.crt /path/to/local/ca.crt
      
    • 然后,将此 CA 证书挂载到您的 Python 服务 pod 中并配置 Elasticsearch 客户端以使用它。
      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'
      )
      
  5. 使用 Curl 进行调试:

    • 要使用
      curl
      进一步调试,您可以使用
      --cacert
      选项指定 CA 证书,而不是绕过 SSL 验证。
      curl --cacert /path/to/ca.crt -u elastic https://elasticsearch-master-headless:9200
      
  6. 日志和事件:

    • 检查 Elasticsearch pod 和 Python 服务 pod 的日志中是否有任何其他错误消息或线索。
    • 使用
      kubectl logs <pod-name>
      获取日志。
    • 使用
      kubectl get events
      检查 Kubernetes 事件是否报告任何异常或问题。

通过执行这些步骤,您应该能够确定问题是否是由网络策略、DNS 解析或 SSL/TLS 证书验证引起的,并采取适当的操作来解决它。

© www.soinside.com 2019 - 2024. All rights reserved.