한국외대 클러스터에 Spring 프로젝트 배포하기 - 왜 Let's Encrypt를 쓸 수 없었을까?

Kychann·2025년 4월 18일
post-thumbnail

🔐 왜 Let's Encrypt를 쓸 수 없었을까?

원래 계획은 cert-manager와 Let's Encrypt를 이용해
자동으로 TLS 인증서를 발급받고 관리하는 구조를 만들고 싶었다.
하지만 다음과 같은 클러스터 특성상 제약으로 인해 사용할 수 없었다.

🧱 문제점 요약

  1. HTTP-01 인증 방식 사용 불가

    • Let's Encrypt는 DNS 또는 HTTP를 통해 도메인 소유권을 확인하는데,
      내가 사용한 방법은 HTTP-01 방식.
    • 이 방식은 /.well-known/acme-challenge 경로로 인증 요청을 보내고,
      Ingress가 이 요청을 cm-acme-http-solver라는 임시 Pod로 전달해야 한다.
  2. cm-acme-http-solver Pod가 특정 노드에만 생성되어야 했음

    • 내 클러스터는 외부에서 접근 가능한 IP가
      오직 cpu-node1에만 할당되어 있음.
    • 그런데 cert-manager가 solver Pod를 아무 노드에나 띄우면,
      외부에서 접근이 불가능해서 인증 실패!

🧗‍♂️ 해결을 위한 시도들

✅ 방법 1. Node Affinity 적용

  • 인증용 solver Pod가 반드시 cpu-node1에서 실행되도록,
    cert-manager 설정 파일에 다음처럼 node affinity 조건을 명시했다.
podTemplate:
  spec:
    affinity:
      nodeAffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
          nodeSelectorTerms:
            - matchExpressions:
                - key: kubernetes.io/hostname
                  operator: In
                  values:
                    - cpu-node1

하지만 cert-manager Helm Chart에서는 이 설정이 잘 먹히지 않거나,
버전에 따라 달라서 완벽하게 제어하기가 어려웠다.

✅ 방법 2. Istio 대신 NGINX Ingress 사용

  • 기존에는 istio도 고려했지만, 설정이 복잡하고 인증 경로를 직접 제어하기 어려워서
  • Ingress-NGINX를 Helm으로 설치하고, HTTP 인증 경로를 처리할 수 있게 구성했다.

✅ 방법 3. 결국 Self-Signed 인증서로 대체

  • 즉시 배포가 필요했기 때문에, 우선 다음처럼 self-signed 인증서로 대체했다.
openssl req -x509 -nodes -days 365 \
  -newkey rsa:2048 \
  -keyout tls.key \
  -out tls.crt \
  -subj "/CN=api.hufspetition.hufs.ac.kr" \
  -addext "subjectAltName=DNS:api.hufspetition.hufs.ac.kr"
  • 생성된 인증서를 secret으로 등록해서 Ingress에 적용 완료.
kubectl create secret tls hufspetition-selfsigned-tls \
  --cert=tls.crt \
  --key=tls.key

📢 이 외에 해봤던 것들

🔥 NodePort 외부 접근 안되던 문제

  • Ingress Controller를 NodePort로 띄웠는데도,
    외부에서 curl -k https://<노드 IP>:32710 요청이 계속 실패
  • 심지어 Ingress 내부에서는 서비스까지 잘 연결되는 걸 확인했지만,
    외부에선 연결 자체가 안 됨 😢

    아니 그러니까 let's encrypt로 요청을 보내는 건 되는데 응답이 자꾸 안넘어왔다.
    속이 터질 지경에 이르러서 결국 교수님 몰래 일을 저지르고 마는데...

  1. 방화벽 꺼버리기
  2. iptable에 규칙을 수동으로 확인하기

🫢 놀라운 사실은 이래도 안된다는 것!


이 문제를 해결하고 돌아오겠습니다..

돌아올 수 있겟지..?

profile
어,, 저 아닌데요?

0개의 댓글