데보션앱 소개페이지 바로가기
로그인 선택

신고하기

CLOSE
신고사유 (대표 사유 1개)
상세내용 (선택)
0/200
  • 신고한 게시글은 더 이상 보이지 않습니다.
  • 이용약관과 운영정책에 따라 신고사유에 해당하는지 검토 후 조치됩니다.
  • 허위 신고인 경우, 신고자의 서비스 이용이 제한될 수 있으니 유의하시어 신중하게 신고해 주세요.
(이 회원이 작성한 모든 댓글과 커뮤니티 게시물이 보이지 않고, 알림도 오지 않습니다.)

미리보기

커뮤니티

      1,234

      badge 23.06.15

      글 등록

      카테고리를 선택해주세요.

      DEVOTEE를 활성화 시키면
      지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.

      버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.

      임시저장함에 저장되었습니다. 저장일시 : 2022.5.17 14:29:08

      임시저장함

      제목을 선택하시면 이어서 작성이 가능하며,
      최대 20건까지 저장합니다.
      컨텐츠 유형, 제목, 저장일시, 삭제로 이뤄진 임시저장 목록
      컨텐츠 유형 제목 저장일 삭제

      데보션 블로그 게재 요청

      CLOSE
      • *
      • *

      본인인증

      효율적인 데보션 서비스 이용 및
      고객님의 소중한 개인정보보호를 위해
      본인인증을 진행해주세요. 본인인증 미 진행 시 로그인이 제한됩니다.
      본인인증 실패

      본인인증 로그인에 실패하였습니다.
      회원이 아니시거나 본인인증 등록이
      완료되지 않은 사용자입니다.

      회원정보 연결

      Let's encrypt w/ Cert-manager를 통해서 자동으로 갱신되는 TLS 인증서 사용하기

      AI Weaver 24.09.02
      3,545 7 1
      DEVOTEE 요약
      Kubernetes 환경에서 Cert-manager와 Let's Encrypt를 사용해 자동 갱신되는 TLS 인증서를 발급하고, Emberstack Reflector를 이용해 이 인증서를 모든 Namespace에 복사하는 방법을 설명합니다. Helm을 통해 Cert-manager와 Reflector를 설치한 후 Let's Encrypt에서 인증서를 발급받아 이를 자동 갱신 및 복사하도록 설정합니다. 이 과정에서 AWS Route53을 이용해 도메인 소유권을 증명하고, 설정된 정책과 역할을 통해 인증서 발급과 복제를 관리합니다.
      DEVOTEE 추천 블로그

      만료 걱정이 없는 TLS 인증서 만들기

      이번 세션에서는 Kubernetes 환경에서 Cert-manager와 Let's encrypt를 이용하여 만료 걱정이 없는 TLS 인증서를 만들어 봅니다.

      또한 Emberstack의 Reflector를 이용하여 Let's encrypt가 만든 인증서를 특정 또는 모든 Namespace에 복사를 해봅니다.


      Helm 설치 및 Repository 추가

      Cert-manager 및 Reflector 설치를 위해 Helm 도구를 설치합니다.

      ### Helm 설치
      $ curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
      $ chmod 700 get_helm.sh
      $ ./get_helm.sh
      
      ### Repository 추가
      $ helm repo add jetstack https://charts.jetstack.io
      $ helm repo add emberstack https://emberstack.github.io/helm-charts
      $ helm repo update
      
      ### 확인
      $ helm repo ls
      NAME          	URL
      jetstack      	https://charts.jetstack.io
      emberstack    	https://emberstack.github.io/helm-charts


      Cert-manager 설치

      • Cert-manager GitHub Link: Link

      2024.08.31 현재 Cert-manager 최신 버전은 1.15.3 입니다.

      Cert-manager를 Kubernetes에 Helm을 이용하여 설치합니다.

      ### Namespace 추가
      $ kubectl create ns cert-manager
      
      ### Cert-manager CRD 설치
      $ kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.15.3/cert-manager.crds.yaml
      
      ### Cert-manager 설치
      $ helm install cert-manager --namespace cert-manager --version v1.15.3 jetstack/cert-manager


      Emberstack Reflector 설치

      • Emberstack Reflector GitHub Link: Link

      Emberstack에서 개발/배포하는 Reflector는 Kubernetes에서 ConfigMap과 Secret를 Namespace간 복제해주는 도구입니다.

      TLS 인증서는 Kubernetes 상에서는 Secret으로 관리가 됩니다.

      우리는 Let's Encrypt 통해서 TLS 인증서를 발급 받을 예정인데요

      아시다시피 Let't Encrypt 인증서는 만료기간이 최대 3개월 입니다.

      다행스럽게 Cert-manager는 Let's Encrypt 인증서를 3개월 만료가 되기 전에 자동으로 갱신을 수행합니다.

      문제는 다른 Namespace에 이미 복제하여 배포한 Let's Encrypt 인증서가 있다면 이 인증서들 역시 갱신해 주지 않는다면 만료된 인증서라고 오류가 발생할 것입니다.

      Emberstack의 Reflector 는 Let's Encrypt 인증서가 자동으로 갱신이 되면

      특정 또는 모든 Namespace에 이 인증서 Secret를 복제하여, 이 문제를 해결할 수 있습니다.

      이제 Emberstack Reflector를 설치해봅니다.

      ### Namespace 추가
      $ kubectl create ns emberstack
      
      ### Reflector 설치
      $ helm upgrade --install --namespace emberstack reflector emberstack/reflector


      Let's Encrypt TLS 인증서 설정하기

      Let's Encrypt 인증서 설정을 시작해 봅니다.

      인증서를 발급받기 위해서는 Domain 소유권에 대한 증명이 필요합니다.

      Domain의 대한 소유권을 증명하는 방법은 여러가지가 있습니다.

      Let's Encrypt에서는 이 과정을 Challenge 라고 합니다.

      Challenge Type 종류는 다음과 같습니다.

      저 같은 경우 aiweaver.io 라는 도메인을 소유하고 있으며, AWS Route53을 이용하여 Domain Control을 하고 있습니다.

      따라서, Let's Encrypt Challenge Type을 DNS를 통해 Verification 받는 것으로 설정합니다.

      image.png

      AWS Route53 Policy / Role 구성

      AWS IAM에서 route53-user 와 CertManagerRoute53AccessPolicy 를 아래와 같이 등록합니다.


      CertManagerRoute53AccessPolicy 내용

      {
          "Version": "2012-10-17",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": "route53:GetChange",
                  "Resource": "arn:aws:route53:::change/*"
              },
              {
                  "Effect": "Allow",
                  "Action": [
                      "route53:ChangeResourceRecordSets",
                      "route53:ListResourceRecordSets"
                  ],
                  "Resource": "arn:aws:route53:::hostedzone/*"
              },
              {
                  "Effect": "Allow",
                  "Action": "route53:ListHostedZonesByName",
                  "Resource": "*"
              }
          ]
      }


      AWS IAM에서 CertManagerRoute53AccessRole 등록

      권한은 위에서 등록한 CertManagerRoute53AccessPolicy 를 선택합니다.

      image.png


      신뢰 관계에서는 아래와 같이 등록을 합니다.

      image.png

      {
          "Version": "2012-10-17",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Principal": {
                      "AWS": "arn:aws:iam::{$YOUR_AWS_ACCOUNT_ID}:user/route53-user"
                  },
                  "Action": "sts:AssumeRole",
                  "Condition": {}
              }
          ]
      }


      AWS Credential Secret 생성

      아래와 같이 AWS Credential Secret을 등록합니다.

      $ cat aws-route53-credential.yml
      apiVersion: v1
      kind: Secret
      metadata:
        name: aws-route53-credential
        namespace: cert-manager
      type: Opaque
      stringData:
        secret-access-key: YOUR_AWS_ROUTE53_USER_SECRET_ACCESS_KEY
      
      # kubectl -n cert-manager apply -f aws-route53-credential.yml


      ClusterIssuer 등록

      ### Cluster Issuer를 등록합니다.
      $ cat cluster-issuer-letsencrypt.yml
      apiVersion: cert-manager.io/v1
      kind: ClusterIssuer
      metadata:
        name: cluster-issuer-letsencrypt
      spec:
        acme:
          email: aiweaver@sk.com
          server: https://acme-v02.api.letsencrypt.org/directory
          privateKeySecretRef:
            name: cluster-issuer-letsencrypt
          solvers:
          - selector:
              dnsZones:
              - "aiweaver.io"
            dns01:
              route53:
                region: ap-northeast-2
                accessKeyID: YOUR_AWS_ROUTE53_USER_ACCESS_ID
                secretAccessKeySecretRef:
                  name: aws-route53-credential
                  key: secret-access-key
                role: arn:aws:iam::{$YOUR_AWS_ACCOUNT_ID}:role/CertManagerRoute53AccessRole
                
      $ kubectl -n cert-manager apply -f cluster-issuer-letsencrypt.yml
      
      ### Cluster Issuer 상태 확인 - READY 가 True 면 정상
      $ kubectl get ClusterIssuer -n cert-manager
      NAME                         READY   AGE
      cluster-issuer-letsencrypt   True    1d


      Let's Encrypt 인증서 발급 및 Reflector를 통한 복제 설정

      CluterIssuer를 기반으로 제가 소유하고 있는 aiweaver.io Let's Encrypt Wildcard 인증서를 발급합니다.

      여기서 증요한 점은, 인증서를 발급하면서 Reflector Annotation을 이용하여 특정 또는 모든 Namespace에 복사하는 설정을 함께 추가합니다.

      Reflector Annotation 설정 방법은 아래 링크를 참조하십시오.

      여기서는 모든 Namespace에 복사로 설정하였습니다. (즉, 비어있는 값으로 설정)

      ### 아래와 같이 내용을 작성합니다.
      $ cat tls-wildcard-aiweaver-io.yml
      apiVersion: cert-manager.io/v1
      kind: Certificate
      metadata:
        name: tls-wildcard-aiweaver-io
        namespace: cert-manager
      spec:
        secretName: cert-manager-tls-wildcard-aiweaver-io
        issuerRef:
          name: cluster-issuer-letsencrypt
          kind: ClusterIssuer
        commonName: '*.aiweaver.io'
        dnsNames:
        - '*.aiweaver.io'
        - 'aiweaver.io'
        secretTemplate:
          annotations:
            reflector.v1.k8s.emberstack.com/reflection-allowed: "true"
            reflector.v1.k8s.emberstack.com/reflection-allowed-namespaces: ""
            reflector.v1.k8s.emberstack.com/reflection-auto-enabled: "true"
            reflector.v1.k8s.emberstack.com/reflection-auto-namespaces: ""
      
      ### 인증서 발행
      $ kubectl -n cert-manager apply -f tls-wildcard-aiweaver-io.yml
      
      ### 요청 한 인증서 상태 확인 - 활성화 까지 1분 정도 소요 됩니다.
      ### READY가 False 였다가 True로 변경이 되면 정상적으로 인증서가 발급 된 것입니다.
      $ watch -n 5 -c 'kubectl get Certificate -n cert-manager'
      NAME                       READY   SECRET                                  AGE
      tls-wildcard-aiweaver-io   True    cert-manager-tls-wildcard-aiweaver-io   1d 
      
      ### 다른 Namespace에도 복제가 되었는지 확인 해 봅니다.
      ### cert-manager-tls-wildcard-aiweaver-io 라는 Secret이 있으면 정상입니다.
      $ kubectl get secret -n cert-manager
      NAME                                    TYPE                 DATA   AGE
      aws-route53-credential                  Opaque               1      1d
      cert-manager-tls-wildcard-aiweaver-io   kubernetes.io/tls    1      1d
      cert-manager-webhook-ca                 Opaque               1      1d
      cluster-issuer-letsencrypt              Opaque               1      1d
      sh.helm.release.v1.cert-manager.v1      helm.sh/release.v1   1      1d
      
      $ kubectl get secret -n aiweaver-platform
      NAME                                    TYPE                 DATA   AGE
      api6-gateway-etcd-jwt-token             Opaque               1      1d
      cert-manager-tls-wildcard-aiweaver-io   kubernetes.io/tls    1      1d


      마치며...

      여기까지 Cert-manager와 Let'e Encrypt를 통해서 자신이 소유한 도메인에 대해서 Wildcard 인증서를 발급하는 방법에 대해서 알아보았습니다.

      이런 방식으로 인증서를 등록하면 3개월 마다 Cert-manager가 Let's Encrypt 인증서를 자동으로 갱신합니다.

      만약에 갱신에 실패를 하게 되면 ClusterIssuer에 등록 한 spec.acme.email 주소로 갱신하지 못했다는 메일을 받게 됩니다. (무소식이 희소식)

      지금까지 영원히 걱정없이 사용할 수 있는 Wildcard TLS 인증서 등록/자동갱신 방법에 대해서 알아보았습니다.

      질문이 있다면 언제든지 댓글 부탁드립니다.


      마지막으로 Rancher 에서는 아래 그림과 같이 인증서를 Ingress에 등록해 주면 쉽게 끝납니다.

      image.png

      댓글 0

      DEVOTEE를 활성화 시키면
      지금 작성한 댓글에 AI가 댓글을 달아줍니다.

      AI Weaver 님의 최신 블로그

      더보기

      DEVOTEE 추천 블로그

      동영상 기고하기