typescript - Kan inte ansluta till Elasticsearch med Node.Js på Kubernetes (självsignerat certifikat i certifikatkedjan)


Jag har en NodeJs-applikation som körs inuti ett Kubernetes-kluster (jag använder microk8s). Jag har också följt de officiella stegen för att sätta upp Elasticsearch på Kubernetes.

Problem

Men jag kan inte ansluta till Elasticsearch-klustret. Jag får detta fel:

ConnectionError: self signed certificate in certificate chain

Detta är ett kodavsnitt av min anslutning:

const client = new elasticsearch.Client({
  node: process.env.elasticsearch_node,
  // https://elasticsearch-es-http.default.svc.cluster.local:9200
});

Minimal reproduktion

Jag har skapat en minimal reproduktion av detta problem här: https://github.com/flolu/elasticsearch-k8s-connection. (Installationsinstruktioner finns i README)

I princip fungerar allt bra när man kör Elasticsearch i Docker Compose, men jag kan inte ansluta när jag kör det i Kubernetes.

Anledningen till detta är förmodligen att jag inte konfigurerade TLS-certifikat korrekt, men jag har inte hittat någon information om det. Konfigurerar jag det inne i min NodeJs-applikation när jag skapar ES-klienten eller på en klusternivå?

Svar #1

Lösningen är att konfigurera SSL och Elastic-användaren när du skapar 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,
  },
});

Lösenordet och certifikatet tillhandahålls av Elastic. De är lagrade i Kubernetes-hemligheter. Så jag har precis skickat lösenordet och certifikatet till min NodeJs-tjänst via miljövariabler på detta sätt:

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

Svar #2

Detta är ett SSL-problem. Försök att inaktivera verifiering av SSL eller ansök om ett SSL från CA. Cloudflare SSL är också ett bra val.

Här är hur man inaktiverar verifiering av SSL för NodeJs

process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';

Relaterade artiklar