Elastic Cloud on Kubernetes (ECK)のElasticsearchとKibanaにcert-managerとIngressを使ってLet's Encryptの証明書を適用するメモ

Elastic Cloud on Kubernetesで cert-managerを使う方法はドキュメントに説明されているが、 self-signed certificateの方法しか載っていないので、Let's Encryptを使う方法をメモ。 type: LoadBalancerのServiceを使わず、またIngress Nginxを使ってElasticsearch、Kibanaにアクセスするようにしている。

certificate.yml

apiVersion: cert-manager.io/v1alpha2
kind: Certificate
metadata:
  name: certificate
spec:
  secretName: certificate-tls
  issuerRef:
    name: letsencrypt-maki-lol
    kind: ClusterIssuer
  dnsNames:
  - '*.eck.maki.lol'

elasticsearch.yml

apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
  name: quickstart
spec:
  version: 7.11.1
  nodeSets:
  - name: default
    count: 3
    config:
      node.store.allow_mmap: false
  http:
    tls:
      certificate:
        secretName: certificate-tls
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: quickstart-es
  annotations:
    ingress.kubernetes.io/force-ssl-redirect: "true"
    nginx.ingress.kubernetes.io/backend-protocol: HTTPS
spec:
  tls:
  - secretName: certificate-tls
    hosts:
    - elasticsearch.eck.maki.lol
  rules:
  - host: elasticsearch.eck.maki.lol
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: quickstart-es-http
            port:
              number: 9200

kibana.yml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: quickstart-kibana
  annotations:
    ingress.kubernetes.io/force-ssl-redirect: "true"
    nginx.ingress.kubernetes.io/backend-protocol: HTTPS
spec:
  tls:
  - secretName: certificate-tls
    hosts:
    - kibana.eck.maki.lol
  rules:
  - host: kibana.eck.maki.lol
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: quickstart-kb-http
            port:
              number: 5601
---
apiVersion: kibana.k8s.elastic.co/v1
kind: Kibana
metadata:
  name: quickstart
spec:
  version: 7.11.1
  count: 1
  elasticsearchRef:
    name: quickstart
  http:
    tls:
      certificate:
        secretName: certificate-tls
kubectl apply -f certificate.yml -f elasticsearch.yml -f kibana.yml

でOK

image

同じ値の設定を繰り返したくないので、yttを使ってtemplate化する場合は、

values.yml

#@data/values
---
name: quickstart
cluster_issuer_name: letsencrypt-maki-lol
tls_secret_name: certificate-tls
subdomain: eck.maki.lol

certificate.yml

#@ load("@ytt:data", "data")

apiVersion: cert-manager.io/v1alpha2
kind: Certificate
metadata:
  name: certificate
spec:
  secretName: #@ data.values.tls_secret_name
  issuerRef:
    name: #@ data.values.cluster_issuer_name
    kind: ClusterIssuer
  dnsNames:
  - #@ "*.{}".format(data.values.subdomain)

elasticsearch.yml

#@ load("@ytt:data", "data")

apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
  name: #@ data.values.name
spec:
  version: 7.11.1
  nodeSets:
  - name: default
    count: 3
    config:
      node.store.allow_mmap: false
  http:
    tls:
      certificate:
        secretName: #@ data.values.tls_secret_name
---
#@ domain_name = "elasticsearch.{}".format(data.values.subdomain)

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: #@ "{}-es".format(data.values.name)
  annotations:
    ingress.kubernetes.io/force-ssl-redirect: "true"
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
  tls:
  - secretName: #@ data.values.tls_secret_name
    hosts:
    - #@ domain_name
  rules:
  - host: #@ domain_name
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: #@ "{}-es-http".format(data.values.name)
            port:
              number: 9200

kibana.yml

#@ load("@ytt:data", "data")

apiVersion: kibana.k8s.elastic.co/v1
kind: Kibana
metadata:
  name: #@ data.values.name
spec:
  version: 7.11.1
  count: 1
  elasticsearchRef:
    name: #@ data.values.name
  http:
    tls:
      certificate:
        secretName: #@ data.values.tls_secret_name
---
#@ domain_name = "kibana.{}".format(data.values.subdomain)

kind: Ingress
metadata:
  name: #@ "{}-kibana".format(data.values.name)
  annotations:
    ingress.kubernetes.io/force-ssl-redirect: "true"
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
  tls:
  - secretName: #@ data.values.tls_secret_name
    hosts:
    - #@ domain_name
  rules:
  - host: #@ domain_name
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: #@ "{}-kb-http".format(data.values.name)
            port:
              number: 5601
ytt -f certificate.yml -f elasticsearch.yml -f kibana.yml -f values.yml | kubectl apply -f-

でOK