IT 관련 끄적끄적

Local Kubernetes 에서 cert-manager를 이용해 Let’s Encrypt 인증서를 발급받기 (AWS Route53)

kani 2025. 6. 15. 01:36

테스트용으로 끄적끄적 적어두는 것. 실무용으로는 적합하지 않다. 

 

1. Cert-Manager 설치 

최신버전의 Cert-Manager는 https://github.com/cert-manager/cert-manager/releases 여기서 확인 할 것

여기서는 1.18.0으로 진행

 

설치 

kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.18.0/cert-manager.yaml

 

2. AWS 자격 증명 Secret 생성 

aws-secret.yaml 으로 secert을 생성한다.

aws acces key id와 access key는 생성 후 생성된 값을 입력.

apiVersion: v1
kind: Secret
metadata:
  name: aws-secret
  namespace: cert-manager
type: Opaque
stringData:
  AWS_ACCESS_KEY_ID: <YOUR_ACCESS_KEY_ID>
  AWS_SECRET_ACCESS_KEY: <YOUR_SECRET_ACCESS_KEY>

 

적용

kubectl apply -f aws-secret.yaml

 

 

3. ClusterIssuer 생성  

cluster-issuer.yaml 파일로 생성

region과 hostedZoneId는 본인 것으로 수정할 것.

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-dns
spec:
  acme:
    email: your-email@example.com
    server: https://acme-v02.api.letsencrypt.org/directory
    privateKeySecretRef:
      name: letsencrypt-dns-account-key
    solvers:
      - dns01:
          route53:
            region: <aws-region>
            hostedZoneID: <optional-hosted-zone-id>
            accessKeyIDSecretRef:
              name: aws-secret
              key: AWS_ACCESS_KEY_ID
            secretAccessKeySecretRef:
              name: aws-secret
              key: AWS_SECRET_ACCESS_KEY

 

적용

kubectl apply -f cluster-issuer.yaml

 

 

 

4. Certificate 리소스 생성

certificate.yaml 로 생성 kani.im이라는 도메임을 가지고 있음으로 

kani.im과 *.kani.im으로 도메인을 발급 받도록 한다.

apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: kani-im-cert
  namespace: default
spec:
  privateKey:
    rotationPolicy: Always
  secretName: kani-im-cert-tls
  issuerRef:
    name: letsencrypt-dns
    kind: ClusterIssuer
  dnsNames:
    - "*.kani.im"
    - "kani.im"

 

 

적용

kubectl apply -f certificate.yaml

 

 

 

 

확인 해보자 

kubectl get certificaterequest -n default

 

잘 발급 됐다면 AWS에 _acme challenge가 생성이 되고  아래외 같이 잘 보일 것이다.

NAME             APPROVED   DENIED   READY   ISSUER            REQUESTER                                         AGE
kani-im-cert-1   True                True    letsencrypt-dns   system:serviceaccount:cert-manager:cert-manager   10m

 

무언가 잘 안되어 디버깅을 해야한다면, 잘 찾아보자.

kubectl describe certificate -n default

 

 

AWS의 SA나 권한 설정은 다루지 않았다. 만약 SA를 생성하다면 최소 권한으로 아래 policy를 이용하자. 적절하게 hostedzoneid 은 수정할 것.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowCertManagerToChangeRecords",
      "Effect": "Allow",
      "Action": [
        "route53:ChangeResourceRecordSets"
      ],
      "Resource": "arn:aws:route53:::hostedzone/<HOSTED_ZONE_ID>"
    },
    {
      "Sid": "AllowCertManagerToListAndMonitor",
      "Effect": "Allow",
      "Action": [
        "route53:ListHostedZones",
        "route53:ListResourceRecordSets",
        "route53:GetChange"
      ],
      "Resource": "*"
    }
  ]
}