이번에는 HTTPS 를 적용해 보겠습니다. 기존에 도메인을 Cloudflare 에서 관리하고 있어서 같이 활용해서 적용하겠습니다.
1. Cloudflare 토큰
- Cloudflare 대시보드 → My Profile → API Tokens
- Create Token → Edit zone DNS 템플릿 선택
- Zone Resources → Include - Specific zone - heejunp.com 선택

이렇게 토큰이 준비 됐습니다.
2. Cert-Manager 설치
쿠버네티스에서 HTTPS를 적용하는 방법은 크게 세 가지가 있습니다.
- 수동 관리 : openssl로 직접 인증서를 만들고, 쿠버네티스 Secret에 파일로 업로드하고, 3개월마다 알람 맞춰놓고 갱신합니다.
- 클라우드 관리형 인증서 : AWS ACM이나 Google Managed Certificate를 씁니다.
- Cert-Manager : 쿠버네티스 내부에서 인증서의 요청, 발급, 갱신을 '자동화' 해주는 표준 도구입니다.
쿠버네티스에는 인증서 발급과 갱신을 자동으로 관리해주는 'cert-manager' 가 있습니다.
# 1. Jetstack 레포지토리 추가
helm repo add jetstack https://charts.jetstack.io
helm repo update
# 2. cert-manager 설치 (CRD 포함)
helm install cert-manager jetstack/cert-manager \
--namespace cert-manager \
--create-namespace \
--set installCRDs=true

잘 설치가 됐습니다.
3. Cloudflare 연동
이제 'cert-manager' 에게 Cloudflare API 토큰을 쥐어줘야 합니다.
API 토큰을 Secret 에 저장
'cloudflare-secret.yaml' 파일을 작성 하겠습니다.
apiVersion: v1
kind: Secret
metadata:
name: cloudflare-api-token-secret
namespace: cert-manager
type: Opaque
stringData:
api-token: [복사한_토큰_붙여넣기]
아래 명령어로 생성
kubectl apply -f cloudflare-secret.yaml
ClusterIssuer 생성 (인증서 발급 대행사 설정)
Let's Encrypt 프로덕션 서버를 사용하고, 검증은 Cloudflare DNS 로 하겠습니다. 'cluster-issuer.yaml' 파일을 작성하겠습니다.
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
# 이메일은 인증서 만료 알림용
email: [본인 이메일 입력]
server: https://acme-v02.api.letsencrypt.org/directory
privateKeySecretRef:
name: letsencrypt-prod
solvers:
- dns01:
cloudflare:
email: [본인 이메일 입력]
apiTokenSecretRef:
name: cloudflare-api-token-secret
key: api-token
아래 명령어로 생성
kubectl apply -f cluster-issuer.yaml
4. Ingress 에 HTTPS 적용
지난 편에 작성한 'foundry.yaml' 의 Ingress 부분에 추가하겠습니다.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: foundry-ingress
annotations:
# 1. 아까 만든 발급 대행사(ClusterIssuer)를 지정
cert-manager.io/cluster-issuer: "letsencrypt-prod"
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
ingressClassName: nginx
# 2. TLS 설정 추가
tls:
- hosts:
- foundry.heejunp.com
secretName: foundry-tls-secret # 인증서가 저장될 곳 이름 (자동 생성됨)
rules:
- host: foundry.heejunp.com
http:
# ... (기존 라우팅 규칙들) ...
아래 명령어로 업데이트
kubectl apply -f foundry.yaml
하지만 역시 한 번에 되지 않습니다...
kubectl describe challenge [챌린지이름]
위의 명령어로 확인해보니

원인을 찾아보니
- DNS 해석의 오류: 쿠버네티스 클러스터 내부의 DNS(CoreDNS)는 기본적으로 호스트(노드)의 /etc/resolv.conf 설정을 상속받습니다
- ISP DNS의 개입: 홈랩 환경(LG U+ 인터넷)이다 보니, 공유기가 DHCP를 통해 통신사 기본 DNS 주소를 할당해 줬습니다.
- 충돌 발생: LG U+ DNS 서버가 Let's Encrypt의 도메인(acme-v02...)을 제대로 해석하지 못하고, 자사의 엉뚱한 IP(아마도 차단 페이지나 내부 라우팅 IP)로 응답해버렸습니다.
- 결과: Cert-Manager는 Let's Encrypt가 아닌 LG U+ 서버의 443 포트로 접속을 시도하다가 연결 거부(Timeout)를 당했습니다.
해결하기 위해
CoreDNS 설정 수정
kubectl edit cm coredns -n kube-system
Upstream DNS 변경
# 수정 전
forward . /etc/resolv.conf
# 수정 후 (직접 지정)
forward . 8.8.8.8 1.1.1.1
CoreDNS 재시작 및 챌린지 갱신
kubectl delete pod -n kube-system -l k8s-app=kube-dns
kubectl delete pod -n cert-manager --all
# 전체 삭제
kubectl delete challenge --all
확인
kubectl get certificate

성공 했습니다.
'project > 본투비엔지니어' 카테고리의 다른 글
| [본투비엔지니어] 나에게 베어본만 주어진다면?? (11) (0) | 2026.02.03 |
|---|---|
| [본투비엔지니어] 나에게 베어본만 주어진다면?? (9) (0) | 2026.01.31 |
| [본투비엔지니어] 나에게 베어본만 주어진다면?? (8) (0) | 2026.01.29 |
| [본투비엔지니어] 나에게 베어본만 주어진다면?? (7) (0) | 2026.01.29 |
| [본투비엔지니어] 나에게 베어본만 주어진다면?? (6) (0) | 2026.01.29 |