Cert-Manager Helm Setup & Let’s Encrypt

๐Ÿ’ก Cert-Manager Helm Setup & Let’s Encrypt โ€” Executive Summary

Technical architectural analysis, practical configuration manifests, and deployment instructions for Cert-Manager Helm Setup & Let’s Encrypt.

Installation
References and Guidelines (NOTE)

You can easily add or update TLS for k8s applications using a CA key pair or an external DNS (cloud provider, etc.).

In a closed network environment, using LB’s TLS and http communication inside k8s can be sufficiently trusted, but in the case of MSA delivery in a public domain environment, you must pay attention to TLS security for each domain.

The test procedure below involves creating an issuer with a CA-keypair and proceeding with authentication.

In actual construction, the issuer created as HTTP01 or DNS01 will be used.

bash
## CA์ธ์ฆ์„œ ํ•„์š”! :: ํ…Œ์ŠคํŠธํ•  rootca ์ธ์ฆ์„œ๊ฐ€ ์—†๋‹ค๋ฉด ๋ฌธ์„œ ํ•˜๋‹จ์˜ "ํ…Œ์ŠคํŠธ์šฉ ca keypair ๋ฐœํ–‰ ๋ฐฉ๋ฒ•" ์ฐธ์กฐ

#์›Œํฌ์ŠคํŽ˜์ด์Šค๋กœ ์ด๋™
cd ~

#namespace ์ƒ์„ฑ
kubectl create ns cert-manager

#ํ—ฌ๋ฆ„์ฐจํŠธ ๋‹ค์šด๋กœ๋“œ
helm pull bitnami/cert-manager --untar

cd cert-manager

#cert-manager crd ์ƒ์„ฑ ($appVersion ๊ต์ฒด ํ›„ ์‹คํ–‰)
#vi Chart.yaml #appVersion ํ™•์ธ
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v$(cat Chart.yaml | yq .appVersion)/cert-manager.crds.yaml

#cert-manager ์„ค์น˜
vi values.yaml #storageClass ๋“ฑ ํ•„์š”์ •๋ณด ๋ณ€๊ฒฝ
helm install -n cert-manager cert-manager .
Exec
Setting Self-Signed Issuer
bash
k apply -f - <<EOF
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: selfsigned-issuer
spec:
  selfSigned: {}
EOF
kubectl get clusterissuers.cert-manager.io #READY=True ํ™•์ธ
Setting CA Issuer
bash
#์ธ์ฆ์„œ์œ„์น˜์— ๋”ฐ๋ผ ๋ณ€๊ฒฝ, "ํ…Œ์ŠคํŠธ์šฉ ca keypair ๋ฐœํ–‰ ๋ฐฉ๋ฒ•"์„ ๋”ฐ๋ผ ์ง„ํ–‰ํ–ˆ๋‹ค๋ฉด ์•„๋ž˜ ์˜ˆ๋ฌธ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ
sudo kubectl create secret tls -n cert-manager ca-key-pair --cert=/etc/ssl/test/v1/rootca.crt --key=/etc/ssl/test/v1/rootca.key

#์ƒ˜ํ”Œ ์ฐธ์กฐํ•˜์—ฌ clusterIssure ์ƒ์„ฑ
kubectl apply -f ClusterIssuer.yaml
kubectl get clusterissuers.cert-manager.io #READY=True ํ™•์ธ
Generate Certs and Secrets (TLS)
bash
#์ƒ˜ํ”Œ ์ฐธ์กฐํ•˜์—ฌ certificate ์ƒ์„ฑ (generate-certificate.sh)
#$name, $namespace, $domain์„ ์ˆ˜์ •ํ•˜์—ฌ ์‹คํ–‰ํ•จ 
#ex: bash generate-certificate.sh test-cert -n harbor harbor.dev.Enterprise Cloud.cld
bash generate-certificate.sh $name $namespace $domain #ํ‘œ์ค€์ถœ๋ ฅ์œผ๋กœ yaml ํ™•์ธ ๊ฐ€๋Šฅ
bash generate-certificate.sh $name $namespace $domain | kubectl apply -f - #certificate ์ƒ์„ฑ

#์ƒ์„ฑ๋œ secret (์ธ๊ฐ€๋œ tls) ํ™•์ธ
kubectl get certificates.cert-manager.io -n $namespace #READY=True ํ™•์ธ
kubectl get secret #์ƒ์„ฑ๋œ tls ํ™•์ธ
Generate Certs and Secret (TLS) โ€” generated with ingress annotation
References and Guidelines (NOTE)

You can request TLS creation at the same time as ingress creation using the ingress annotation cert-manager.io/cluster-issuer.

bash
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    cert-manager.io/cluster-issuer: ca-issuer #์š”์ฒญ๋ฐ›๋Š” cluster-issuer
    kubernetes.io/ingress.class: nginx
  labels:
    app.kubernetes.io/name: grafana
  name: grafana
  namespace: monitoring
spec:
  ingressClassName: nginx
  rules:
  - host: grafana.fredric.playground.cld
    http:
      paths:
      - backend:
          service:
            name: grafana
            port:
              name: http
        path: /
        pathType: ImplementationSpecific
  tls:
  - hosts:
    - grafana.fredric.playground.cld
    secretName: grafana.fredric.playground.cld-tls #์ƒ์„ฑ๋  certs, secret name
Manifest Sample
  • certificate
Features
Create a self-signed rootCA for trust and issue an application certificate respectively.
bash
# 10๋…„์งœ๋ฆฌ ca ์ธ์ฆ์„œ ๋ฐ issuer ์ƒ์„ฑ
k apply -f - <<EOF
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: selfsigned-issuer
spec:
  selfSigned: {}
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: selfsigned-rootca
  namespace: cert-manager
spec:
  isCA: true
  secretName: selfsigned-rootca
  commonName: SelfSigned CA
  issuerRef:
    name: selfsigned-issuer
    kind: ClusterIssuer
  duration: 87600h  # 10๋…„
  renewBefore: 360h # ๋งŒ๋ฃŒ 15์ผ ์ „ ๊ฐฑ์‹  ์‹œ๋„
---
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: rootca-issuer
spec:
  ca:
    secretName: selfsigned-rootca
EOF
#READY=True ํ™•์ธ: rootca-issuer๋Š” ์ข€ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Œ.
k get secret,certs,clusterissuers.cert-manager.io -n cert-manager

# ์ดํ›„ rootCA Issuer๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Cert๋ฅผ ์ƒ์„ฑ & ์ธ๊ทธ๋ ˆ์Šค ๋“ฑ๋ก.

# rootca pemํŒŒ์ผ ์–ป๊ธฐ
secretname=
k get secret -n cert-manager $secretname -o jsonpath='{.data.tls\.crt}' | base64 -d > $secretname.pem

# scp๋กœ ๋กœ์ปฌ๋กœ ํŒŒ์ผ ์ด๋™

# ๋กœ์ปฌ์—์„œ ์‹ ๋ขฐํ•˜๊ธฐ
sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain $my.pem

# TMI: /etc/hosts ๋“ฑ๋ก ์—†์ด curl ์‚ฌ์šฉ ๊ฐ€๋Šฅ
curl -LO https://${domain}/${path}/${upstream_file} \
     --cacert ${cacert} \
     --resolve ${domain}:443:${ip}
Get pem file
bash
# rootca
secretname=
k get secret -n cert-manager $secretname -o jsonpath='{.data.tls\.crt}' | base64 -d > $secretname.pem

# server
domain=
ns=
k get secret -n $ns ${domain}-tls -o jsonpath='{.data.tls\.crt}' | base64 -d > ${ns}-${domain}-tls.pem
Get client p12 file
bash
app=
ns=
openssl pkcs12 -export \
  -in <(k get secret -n $ns ${app}-client-cert -o jsonpath='{.data.tls\.crt}' | base64 -d) \
  -inkey <(k get secret -n $ns ${app}-client-cert -o jsonpath='{.data.tls\.key}' | base64 -d) \
  -certfile <(k get secret -n cert-manager selfsigned-rootca -o jsonpath='{.data.tls\.crt}' | base64 -d) \
  -out ${ns}-${app}-client.p12 \
  -name "${ns}-${app} mTLS Client Cert"
Trust locally
  • MAC
bash
sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain $my.pem

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *