Kubernetes TLS 인증서 발급: ClusterIssuer Solver 활용하기 (HTTP01 Solver, DNS01 Solver)
Kubernetes TLS 인증서 발급: ClusterIssuer Solver 활용하기
Kubernetes에서 ClusterIssuer는 Let's Encrypt와 같은 인증 기관을 통해 클러스터 전역에서 사용할 수 있는 TLS 인증서를 발급하는 데 사용됩니다. 이 글에서는 ClusterIssuer의 solver를 테스트하는 방법을 다룹니다.
ClusterIssuer의 solver는 DNS01, HTTP01, 또는 기타 인증 방법을 사용하는 경우가 많습니다. 올바르게 구성되었는지 확인하려면 적절한 테스트가 필요합니다. 이 글은 일반적인 HTTP01 및 DNS01 솔버를 테스트하는 방법에 초점을 맞춥니다.
1. ClusterIssuer 개요
ClusterIssuer는 cert-manager에서 제공하는 Custom Resource로, Kubernetes 클러스터 내 모든 네임스페이스에서 사용할 수 있는 인증서를 발급하도록 구성됩니다. 일반적으로 인증서를 요청하는 Pod나 서비스가 인증서와 연결된 비밀(Secret)을 참조하여 HTTPS 통신을 수행할 수 있도록 지원합니다.
2. ClusterIssuer 설정 방법
ClusterIssuer는 먼저 올바르게 설정되어야 합니다. 예시 YAML은 다음과 같습니다:
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
email: example@example.com
server: <https://acme-v02.api.letsencrypt.org/directory>
privateKeySecretRef:
name: letsencrypt-prod
solvers:
- http01:
ingress:
class: nginx
위 설정은 Let's Encrypt의 HTTP01 솔버를 사용하여 인증서를 발급합니다.
3. HTTP01 Solver 테스트 방법
HTTP01 솔버는 Ingress를 통해 ACME 서버가 HTTP 요청을 보내어 도메인 소유권을 검증합니다. 다음 절차를 따라 테스트할 수 있습니다:
3.1 테스트 인증서 요청 생성
ClusterIssuer를 테스트하려면 인증서를 요청해야 합니다. 다음은 테스트 Certificate 리소스입니다:
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: test-cert
namespace: default
spec:
secretName: test-cert-tls
dnsNames:
- test.example.com
issuerRef:
name: letsencrypt-prod
kind: ClusterIssuer
3.2 Ingress 리소스 생성 확인
HTTP01 솔버를 사용할 때 cert-manager는 자동으로 Ingress 리소스를 생성합니다. 다음 명령어로 이를 확인할 수 있습니다:
kubectl get ingress
생성된 Ingress가 적절히 구성되었는지 확인합니다. ACME 검증 URL이 올바른 경로(/test.example.com/.well-known/acme-challenge/...
)로 설정되어야 합니다.
3.3 ACME 검증 테스트
다음 명령으로 인증 상태를 확인합니다:
kubectl describe certificate test-cert
Ready
상태로 변경되면 인증서 발급이 성공적으로 이루어진 것입니다.
4. DNS01 Solver 테스트 방법
DNS01 솔버는 도메인의 DNS 기록에 특정 TXT 레코드를 추가하여 도메인 소유권을 검증합니다. 다음 단계를 따라 테스트할 수 있습니다:
4.1 DNS Provider 설정
DNS01 솔버는 DNS 제공자 API를 사용합니다. 예를 들어 Cloudflare를 사용하는 경우:
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
email: example@example.com
server: <https://acme-v02.api.letsencrypt.org/directory>
privateKeySecretRef:
name: letsencrypt-prod
solvers:
- dns01:
cloudflare:
email: example@example.com
apiTokenSecretRef:
name: cloudflare-api-token
key: api-token
4.2 TXT 레코드 확인
인증 요청이 제출되면 cert-manager는 도메인의 DNS에 TXT 레코드를 추가합니다. 이를 확인하려면 다음 명령어를 사용합니다:
kubectl describe challenge
또는 DNS 툴을 사용하여 TXT 레코드를 확인할 수도 있습니다:
dig TXT _acme-challenge.test.example.com
4.3 인증 상태 확인
마찬가지로 인증 상태는 다음 명령으로 확인합니다:
kubectl describe certificate test-cert
5. 문제 해결 방법
- Ingress가 생성되지 않는 경우:
- ClusterIssuer 또는 Certificate 리소스의 구성을 다시 확인합니다.
- cert-manager Pod 로그를 확인합니다:
kubectl logs -n cert-manager deploy/cert-manager
- DNS 검증 실패:
- DNS 제공자의 API 키가 올바른지 확인합니다.
- TXT 레코드가 적절히 추가되었는지 확인합니다.
6. 공식 문서
더 자세한 정보는 cert-manager 공식 문서를 참조하세요:
ClusterIssuer와 cert-manager를 제대로 테스트하고 설정하면 Kubernetes 클러스터에서 안전하고 자동화된 인증서 관리를 쉽게 구현할 수 있습니다. 위 절차를 따라 문제를 해결하고 서비스를 보호하세요!