쿠버네티스 cert-manager Helm 설치 및 Let’s Encrypt 연동

💡 핵심 요약 (Executive Summary)

본 가이드는 쿠버네티스 Helm 패키지 매니저 cert manager 핵심 가이드 및 실전 아키텍처의 핵심 개념, 실전 구성 명령어 및 아키텍처 베스트 프랙티스를 다룹니다. 클라우드 네이티브 및 인프라 엔지니어링 실무에 즉시 활용 가능하도록 체계적으로 정리했습니다.

📑 Table of Contents
Installation
Reference & Guidelines (NOTE)

CA키페어 또는 외부 DNS(클라우드 공급자 등)을 이용하여 k8s애플리케이션을 위한 TLS를 쉽게 추가하거나 갱신할 수 있다.

폐쇄망 환경에서는 LB의 TLS를 이용하고 k8s내부는 http통신을 하는것으로도 충분히 신뢰할 수 있지만, 퍼블릭 도메인 환경의 MSA 납품의 경우 반드시 도메인별 TLS보안을 신경써야 할 것이다.

아래의 테스트 절차는 CA-keypair를 가진 채로 Issuer를 생성하고 인증을 진행하는 절차이다.

실제 구축시에는 HTTP01 또는 DNS01로 생성된 Issuer를 사용하게 될 것이다.

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 Secret (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) — ingress annotation으로 생성
Reference & Guidelines (NOTE)

ingress annotation cert-manager.io/cluster-issuer 를 사용하여 ingress 생성과 동시에 tls 생성을 요청할 수 있다.

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
신뢰하기 위한 self-signed rootCA를 생성하고, 애플리케이션 인증서를 각각 발급.
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}
pem파일 얻기
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
client p12 파일 얻기
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"
로컬에서 신뢰하기
  • 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 *