쿠버네티스 클러스터 내부에서 실행되는 웹 애플리케이션을 외부에 HTTPS 보안 연결로 노출하기 위해 Ingress Nginx Controller와 Cert-Manager(Let’s Encrypt 자동 갱신)를 구축하는 실무 가이드입니다.


1. 아키텍처 흐름

[[[클NCC라gle이iur언nst트xt-│▼│▼eM(IraBHnHInrTgTPaoTrTgwPePSesSseres(r:r(Pv)PCoiCoorcl]rnteuttsr8]t4o0e4l)─r3l─I)e>srs[u]ePr─o를─d(s통T해L]SLeTte'rsmiEnnactriyopnt/서버S와ec통r신e하t여)SSL인증서를자동으로발급및K8sSecret으로저장.

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가 알아서 신규 인증서로 갱신하므로 무중단 보안 운영이 가능해집니다.