Technical architectural analysis, practical configuration manifests, and deployment instructions for Cert-Manager Helm Setup & Let’s Encrypt.
Installation
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.
## 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
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
#์ธ์ฆ์์์น์ ๋ฐ๋ผ ๋ณ๊ฒฝ, "ํ
์คํธ์ฉ 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)
#์ํ ์ฐธ์กฐํ์ฌ 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
You can request TLS creation at the same time as ingress creation using the ingress annotation cert-manager.io/cluster-issuer.
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.
# 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
# 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
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
sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain $my.pem




Leave a Reply