이 글을 쓰게 된 이유가, Cert-manager의 불친절한 안내 때문입니다.
wildcard 인증서 발급에는 총 3가지 단계가 필요합니다.
- Cert-manager 설치
- Cloudflare dns challenge를 통해서 wildcard 인증서 발급 받는 Issuer 생성
- Ingress 생성할 때 위에서 만든 Issuer를 통해서 인증서 발급 받고, 사용하도록 설정
그러나 아무리 봐도 3번을 찾을 수가 없었습니다.
그래서 이 글을 작성하게 되었어요.
먼저 Cert-manager는 helm으로 설치할 예정입니다.
저는 Rancher를 사용하기 위해서 이미 Cert-manager가 설치되어있지만, 간단하게 Cert-manager부터 시작해보겠습니다.
Cert-manager 설치
이건 정말 쉬워요.
Helm 설치
fedora는 dns install helm
SUSE 계열은 zypper in helm
Redhat 계열은 EPEL 설치한 후에 dns install helm
해야 했던 것으로 기억합니다.
cert-manager repo를 helm에 추가
helm repo add jetstack https://charts.jetstack.io
cert-manager 설치
helm install cert-manager jetstack/cert-manager \
--namespace cert-manager \
--create-namespace \
--set installCRDs=true
조금 기다리면 끝났다고 메세지가 나올것입니다.
Issuer 생성
Issuer에는 Cloudflare API token이 필요합니다.
Secret: cloudflare api token
apiVersion: v1
kind: Secret
metadata:
name: cloudflare-api-token-secret-cola
namespace: cert-manager
type: Opaque
stringData:
api-token: <Cloudflare API 발급>
클라우드 플레어는 API token 방식과 API key 방식이 있습니다.
Key는 계정 내 모든 접근이 가능하기 때문에 권한이 제한 된 Token이 좋습니다.
Key 방식은 계정과 key가 필요하고, Token 방식은 Token만 있으면 됩니다.
그래서 secret과 Issuer yaml 코드를 보면 cloudflare 이메일이 없습니다.
Cert-manager Issuer
이제 cloudflare api token을 활용하여 인증서를 발급하기 위한 Issuer를 생성합니다.
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: cloudflare-clusterissuer-cola
spec:
acme:
privateKeySecretRef:
name: cloudflare-clusterissuer-account-key-cola
email: <Let's encrypt email>
server: https://acme-v02.api.letsencrypt.org/directory
# server: https://acme-staging-v02.api.letsencrypt.org/directory
# 인증서 발급 테스트용. let's encrypt 인증서 발급은 갯수 제한이 있기 때문에 staging에서 먼저 테스트해야 합니다.
solvers:
- dns01:
cloudflare:
apiTokenSecretRef:
name: cloudflare-api-token-secret-cola
key: api-token
먼저는 staging에 주석 해제, 기본 server는 주석해두어야 합니다.
spec.acme.solvers.dns01.cloudflare.apiTokenSecretRef에는 위에서 생성한 secret 이름과 key를 적어줍니다.
Ingress에 issuer 지정
가장 중요한 부분입니다.
왜냐하면 wildcard 인증서를 위해서 꼭 알아야 하느 ㄴ부분이기 때문입니다.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
cert-manager.io/cluster-issuer: "cloudflare-clusterissuer-cola"
name: rancher
namespace: cattle-system
spec:
tls:
- hosts:
- "*.cola16.app"
- "cola16.app"
- "*.cola16.dev"
- "cola16.dev"
secretName: <인증서저장secret>
바로 spec.tls.hosts에 wildcard 도메인을 적고, secret을 모든 ingress가 공유해야 한다는 것입니다.
spec.rules.host에 cola16.app
이던 asdf.cola16.app
이던, spec.tls.hosts에는 동일한 값을 넣어야 합니다.
발급 확인
발급에는 순서가 있습니다.
처음에 ingress의 annotation을 확인하고, 발급 요청 큐에 넣고, 요청 후에 secret에 저장하죠.
그래서 이 정보들을 확인 하는 방법이 있습니다.
kubectl get clusterissuer
kubectl describe clusterissuer
# cluster issuer이기 때문에 namespace 안에 할당되지 않습니다.
kubectl get certificaterequests.cert-manager.io -A
kubectl describe certificaterequests.cert-manager.io
kubectl get orders.acme.cert-manager.io -A
kubectl describe orders.acme.cert-manager.io
kubectl get certificates.cert-manager.io -A
kubectl describe certificates.cert-manager.io
마무리
ingress의 annotations와 spec.tls.hosts와 spec.tls.secretName을 알지 못해서 얼마나 고생 많이 했는지 모릅니다.
도저히 이 방법이 소개된 곳이 없더군요.ㅠㅠ
다른 분들은 쉽게 해결하면 좋겠습니다.
답글 남기기