쿠버네티스 클러스터 내부에서 실행되는 웹 애플리케이션을 외부에 HTTPS 보안 연결로 노출하기 위해 Ingress Nginx Controller와 Cert-Manager(Let’s Encrypt 자동 갱신)를 구축하는 실무 가이드입니다.
1. 아키텍처 흐름
2. Nginx Ingress Controller 설치
Helm을 사용하여 Nginx Ingress Controller를 설치합니다.
# Helm 저장소 추가
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
# ingress-nginx 네임스페이스에 설치
helm install ingress-nginx ingress-nginx/ingress-nginx \
--create-namespace \
--namespace ingress-nginx
# External-IP 또는 NodePort 할당 확인
kubectl get svc -n ingress-nginx ingress-nginx-controller
3. Cert-Manager 설치
Kubernetes 내부에서 TLS 인증서를 생명주기 관리해 주는 Cert-Manager를 설치합니다.
# Helm 저장소 추가
helm repo add jetstack https://charts.jetstack.io
helm repo update
# CRD 설치와 함께 cert-manager 설치
helm install cert-manager jetstack/cert-manager \
--create-namespace \
--namespace cert-manager \
--version v1.13.3 \
--set installCRDs=true
# 정상 실행 확인
kubectl get pods -n cert-manager
4. Let’s Encrypt ClusterIssuer 생성
ClusterIssuer는 클러스터 전체에서 인증서를 요청할 수 있는 발급 기관(CA) 설정입니다.
# cluster-issuer.yaml
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
# Let's Encrypt 프로덕션 서버 주소
server: https://acme-v02.api.letsencrypt.org/directory
email: your-email@example.com # 만료 알림을 받을 이메일 주소 입력
privateKeySecretRef:
name: letsencrypt-prod-private-key
solvers:
- http01:
ingress:
class: nginx
kubectl apply -f cluster-issuer.yaml
5. Ingress 리소스 작성 및 SSL 자동 발급 적용
애플리케이션 Ingress 정의 시 cert-manager.io/cluster-issuer 어노테이션을 추가하면, Cert-Manager가 자동으로 HTTP-01 챌린지를 진행하고 SSL 인증서를 K8s Secret으로 발급해 줍니다.
# app-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-app-ingress
namespace: default
annotations:
kubernetes.io/ingress.class: "nginx"
cert-manager.io/cluster-issuer: "letsencrypt-prod"
nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
tls:
- hosts:
- app.yourdomain.com # 실제 도메인 주소
secretName: my-app-tls-secret # 인증서가 저장될 K8s Secret 이름
rules:
- host: app.yourdomain.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-app-service
port:
number: 80
kubectl apply -f app-ingress.yaml
6. 발급 상태 및 트러블슈팅 확인
# 인증서 발급 진행 상태 확인 (READY가 True여야 함)
kubectl get certificate -n default
# Cert-Manager 발급 요청 및 챌린지 상세 확인
kubectl describe certificate my-app-tls-secret
kubectl get challenges,orders -n default
# 발급된 TLS 시크릿 확인
kubectl get secret my-app-tls-secret -o yaml
마무리
이 설정을 완료하면 도메인에 대한 HTTPS 암호화 통신이 적용되며, Let’s Encrypt 인증서 만료일 30일 전 Cert-Manager가 알아서 신규 인증서로 갱신하므로 무중단 보안 운영이 가능해집니다.