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';
