도메인을 DNS에 등록, CA기관으로부터 인증을 받아 브라우저를 통해 접속시 해당 인증 기관에서 발급한 인증서로 접근 가능하도록 세팅
DNS의 역할
8.8.8.8, 8.8.4.4), CF (1.1.1.1)여기선 CF(cloudeflare) 를 통해 무료로 DNS를 등록, proxy 기능 제공
등록 절차
설정
SSL/TLS : 웹 트래픽을 암호화 규칙 설정
DNS 레코드 추가
example.com. IN A 192.0.2.1example.com. IN AAAA 2001:0db8:85a3:0000:0000:8a2e:0370:7334www.example.com. IN CNAME example.com.CA(Certificate Authority)란?
여기서는 Let's Encrypt 라는 무료 CA 기관을 이용. kubenetes의 cert manager를 통해 CA를 자동으로 관리
Certificate 리소스는 특정 도메인에 대해 인증서를 요청합니다. 이 요청에는 어떤 Issuer를 사용할지에 대한 정보가 포함됩니다(issuerRef 필드).Certificate 리소스가 생성되면, cert-manager는 issuerRef 필드를 참조하여 해당 Issuer 또는 ClusterIssuer를 찾습니다. 이 예시에서는 lets-encrypt-issuer라는 이름의 Issuer를 참조합니다.Issuer 리소스는 설정된 방식(예: ACME 프로토콜)을 사용하여 도메인 소유권을 검증합니다. Let's Encrypt의 경우 HTTP-01 또는 DNS-01 챌린지를 사용하여 도메인 검증을 수행합니다.Issuer는 인증서를 발급하고, 이를 Certificate 리소스의 secretName 필드에 지정된 Kubernetes 시크릿에 저장합니다.Certificate 리소스는 만료 전에 자동으로 갱신되며, 이 과정에서도 Issuer가 사용됩니다. renewBefore 필드에 지정된 기간 전에 갱신을 시작합니다.Certificate에서 정의된 인증서 요청을 처리하고 실제 인증서를 발급하는 리소스
종류
letsencrypt를 이용하기 때문에 letsencrypt의 프로토콜인 acme을 사용
apiVersion: cert-manager.io/v1
kind: ClusterIssuer # 클러스터 전체에서 인증서를 발급하고 관리하는 리소스
metadata:
name: lets-encrypt-issuer
namespace: cert-manager # namespace 설정을 cert-manager로 하지 않으면 진행 x. RBAC 또는 secret 접근 권한 때문으로 예상
spec:
acme:
email: devops@publicai.co.kr
server: https://acme-staging-v02.api.letsencrypt.org/directory # 스테이징 환경
privateKeySecretRef:
name: lets-encrypt-certificate
solvers: # 도메인 소유권 검증 방식
- dns01: # CF DNS에서 발급받은 API key를 통해 소유권을 검증
cloudflare:
email: devops@publicai.co.kr
apiTokenSecretRef:
name: cloudflare-api-secret
key: api-token
acme 프로토콜를 위한 준비
API token 발급
cloudflare에서 API token 으로 이동 (검색)
token 권한 설정

발급된 토큰으로 secret 생성
secret 생성
apiVersion: v1
kind: Secret
metadata:
name: cloudflare-api-secret
namespace: cert-manager
stringData:
api-token: "API token"
참고
cert manager: https://cert-manager.io/docs/concepts/issuer/
letsencrypt: https://letsencrypt.org/docs/staging-environment/
인증서 요청에 대한 정의
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: haimp-cert
namespace: haimp
spec:
secretName: haimp-cert
issuerRef: # 인증서를 발급할 Issuer
name: lets-encrypt-issuer
kind: ClusterIssuer
group: cert-manager.io
commonName: pai-world.com # 인증서의 CN(commonName) 필드
dnsNames: # 도메인 이름 목록
- "pai-world.com"
- "*.pai-world.com"
참고