无法使用 Kubernetes 上的 Node.Js 连接到 Elasticsearch(证书链中的自签名证书)

flo*_*olu 10 node.js elasticsearch typescript kubernetes microk8s

我有一个在 Kubernetes 集群中运行的 NodeJs 应用程序(我使用的是microk8s)。我还按照官方步骤在 Kubernetes 上设置 Elasticsearch。

问题

但是我无法连接到 Elasticsearch 集群。我收到此错误:

ConnectionError: self signed certificate in certificate chain
Run Code Online (Sandbox Code Playgroud)

这是我的连接的代码片段

ConnectionError: self signed certificate in certificate chain
Run Code Online (Sandbox Code Playgroud)

最小化复制

我在这里创建了这个问题的最小复制:https : //github.com/flolu/elasticsearch-k8s-connection。(设置说明在自述文件中)

基本上,在 Docker compose 中运行 Elasticsearch 时一切正常,但在 Kubernetes 中运行时无法连接。

造成这种情况的原因可能是我没有正确设置TLS证书,但我还没有找到任何相关信息。在创建 ES 客户端或在集群级别时,我是否在我的 NodeJs 应用程序中配置它?

flo*_*olu 5

解决方法是在创建时配置 SSL 和 Elastic 用户 Client

const client = new elasticsearch.Client({
  node: process.env.elasticsearch_node,
  auth: {
    username: "elastic",
    password: process.env.elasticsearch_password || "changeme",
  },
  ssl: {
    ca: process.env.elasticsearch_certificate,
    rejectUnauthorized: false,
  },
});
Run Code Online (Sandbox Code Playgroud)

密码和证书由 Elastic 提供。它们存储在 Kubernetes Secret 中。所以我刚刚通过这样的环境变量将密码和证书传递到我的 NodeJs 服务中:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: search-deployment
spec:
  selector:
    matchLabels:
      app: search
  replicas: 1
  template:
    metadata:
      labels:
        app: search
    spec:
      containers:
        - name: search
          image: search:placeholder_name
          imagePullPolicy: Always
          env:
            - name: elasticsearch_node
              value: https://elasticsearch-es-http.default.svc.cluster.local:9200
            - name: elasticsearch_certificate
              valueFrom:
                secretKeyRef:
                  name: elasticsearch-es-http-ca-internal
                  key: tls.crt
            - name: elasticsearch_password
              valueFrom:
                secretKeyRef:
                  name: elasticsearch-es-elastic-user
                  key: elastic
Run Code Online (Sandbox Code Playgroud)