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

신고하기

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

미리보기

커뮤니티

      1,234

      badge 23.06.15

      글 등록

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

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

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

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

      임시저장함

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

      데보션 블로그 게재 요청

      CLOSE
      • *
      • *

      본인인증

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

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

      회원정보 연결

      Keycloak 활용한 SSO 구현 : #2 완벽한 HTTPS 보안: Ingress 컨트롤러와 Let's Encrypt으로 무료 인증서 설정하기

      eclipse 24.11.19
      2,447 7 2
      DEVOTEE 요약
      Kubernetes 환경에서 Ingress 컨트롤러와 CertManager를 사용하여 Let's Encrypt의 무료 인증서를 통해 웹 애플리케이션에 HTTPS 보안을 설정하는 방법을 소개하고 있습니다. Ingress 컨트롤러는 외부 HTTP(S) 요청을 내부 서비스로 라우팅하며, CertManager는 자동으로 인증서를 발급하고 관리하여 비용 부담 없이 보안을 강화할 수 있습니다. 이를 통해 사용자는 안전하고 신뢰할 수 있는 서비스를 제공할 수 있으며, 도메인 설정 및 인증서 발급 과정을 상세히 설명하고 있습니다.
      DEVOTEE 추천 블로그

      Ingress 컨트롤러와 Let's Encrypt으로 무료 인증서 설정하기

      Kubernetes 환경에서 Ingress 컨트롤러를 사용하여 웹 애플리케이션에 HTTPS 보안을 완벽하게 설정하는 방법에 대해 소개해드리려고 합니다.

      특히, 무료 인증서 제공 서비스인 Let's Encrypt을 활용하여 손쉽게 인증서를 발급받는 방법을 다뤄보겠습니다.


      Ingress 컨트롤러와 HTTPS

      Kubernetes에서 다양한 애플리케이션을 외부에서 접근할 수 있도록 하려면 보통 Ingress를 사용합니다.

      Ingress는 외부 Http(s) 요청을 내부의 적절한 서비스로 라우팅해주는 역할을 하는데요,

      이때 HTTPS를 지원하도록 설정하면 사용자와 서버 간의 통신이 암호화되어 보안을 강화할 수 있습니다.


      하지만 HTTPS를 적용하기 위해서는 인증서가 필요합니다.

      이때 인증서를 유료로 구매할 수도 있지만, Let's Encrypt라는 무료 인증서 발급 서비스를 이용하면 비용 부담 없이 HTTPS 보안을 구현할 수 있습니다.

      이를 Kubernetes 환경에서 손쉽게 적용할 수 있도록 Ingress 컨트롤러와 CertManager라는 도구를 함께 사용하겠습니다.


      [연재순서]
      1. eksctl로 손쉽게 시작하는 Kubernetes 클러스터 및 노드그룹 생성 방법

      2. 완벽한 HTTPS 보안: Ingress 컨트롤러와 Let's Encrypt으로 무료 인증서 설정하기

      3. Keycloak 설치부터 설정까지: SSO를 위한 첫걸음

      4. SSO 연동 샘플 애플리케이션 구성하기: 실전 가이드

      5. SSO 연동 테스트: Keycloak과 애플리케이션의 완벽한 통합


      준비 사항

      Keycloak을 설정하기 위해서는 사용할 도메인이 필요합니다. 본 가이드에서는 예시로 cloudradar.kr 도메인을 사용합니다.

      실제 설정 시에는 회사 또는 프로젝트에 맞는 도메인을 사용해야 합니다.


      1. Ingress 컨트롤러 설치하기

      먼저 Kubernetes 클러스터에 Ingress 컨트롤러를 설치합니다. Nginx Ingress 컨트롤러는 Helm을 사용하면 쉽게 설치할 수 있습니다.

      helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
      helm repo update
      helm upgrade --install ingress ingress-nginx/ingress-nginx --create-namespace -n devops-nginx-ingress --set controller.service.annotations."service\.beta\.kubernetes\.io/aws-load-balancer-name"="eks-lb"

      이 명령어로 Nginx Ingress 컨트롤러가 K8s 클러스터에 설치되며, 외부 요청을 처리할 준비를 마치게 됩니다. 로드 밸런서가 생성된 것을 확인할 수 있습니다.

      aws elb describe-load-balancers --query "LoadBalancerDescriptions[*].{Name:LoadBalancerName,DNSName:DNSName}"
      [
          {
              "Name": "eks-lb",
              "DNSName": "dualstack.a061dd5a8ee12457783ffeae0911afee-111823484.ap-northeast-2.elb.amazonaws.com"
          }
      ]


      2. Cert Manager 설치하기

      다음으로 Let's Encrypt 인증서를 자동으로 발급받고 관리해주는 Cert-Manager를 설치합니다. 역시 Helm을 사용하여 설치할 수 있습니다.

      helm repo add jetstack https://charts.jetstack.io
      helm repo update
      
      helm upgrade --install cert-manager jetstack/cert-manager --create-namespace --namespace devops-certmanager \
      	--set crds.enabled=true


      3. Let's Encrypt 인증서 발급하기

      이제 Ingress 리소스에 HTTPS를 설정하고 Let's Encrypt을 통해 인증서를 발급받아봅시다. 먼저 ClusterIssuer를 생성하도록 하겠습니다.

      cert-manager

      Kubernetes에서 SSL/TLS 인증서를 자동으로 발급하고 관리해주는 오픈소스 도구입니다.

      Issuer

      특정 네임스페이스 내에서 인증서를 발급하는 데 사용되는 리소스입니다.

      ClusterIssuer

      클러스터 전체에서 인증서를 발급하는 리소스입니다. 네임스페이스에 국한되지 않고 모든 네임스페이스에서 사용 가능하다는 점에서 Issuer와 차이가 있습니다.


      파일 작성하기 - issuer-stg.yaml
      apiVersion: cert-manager.io/v1
      kind: ClusterIssuer
      metadata:
        name: letsencrypt-stg
      spec:
        acme:
          server: https://acme-staging-v02.api.letsencrypt.org/directory
          email: << YOUR_EMAIL >>
          privateKeySecretRef:
            name: letsencrypt-stg
          solvers:
          - http01:
              ingress:
                class: nginx
            selector: {}


      파일 작성하기 - issuer-prd.yaml
      apiVersion: cert-manager.io/v1
      kind: ClusterIssuer
      metadata:
        name: letsencrypt-prd
      spec:
        acme:
          server: https://acme-v02.api.letsencrypt.org/directory
          email: << YOUR_EMAIL >>
          privateKeySecretRef:
            name: letsencrypt-prd
          solvers:
          - http01:
              ingress:
                class: nginx
            selector: {}

      위에서 생성한 ClusterIssuer 를 클러스터에 적용합니다.

      kubectl apply -f issuer-stg.yaml
      kubectl apply -f issuer-prd.yaml
      
      kubectl get clusterissuer --show-kind=true
      NAME                                            READY   AGE
      clusterissuer.cert-manager.io/letsencrypt-prd   True    1d12h
      clusterissuer.cert-manager.io/letsencrypt-stg   True    1d12h


      4. Route53 설정하기

      사용자가 도메인 호스트로 접속할 때 Nginx Ingress 컨트롤러가 설정된 로드밸런서로 트래픽을 전달하기 위한 레코드를 생성합니다.

      Route53에서 *.cloudradar.kr에 대한 A레코드를 생성하고 로드밸런서 DNS이름을 설정합니다.

      aws route53 change-resource-record-sets 명령어를 실행하여 동일하게 작업할 수 있습니다.

      image.png


      5. Welcome to nginx!

      테스트를 위한 Nginx 웹 서버를 Helm 차트로 배포하고 도메인 접속을 시도해봅니다.

      helm upgrade nginx-server bitnami/nginx --set service.type=ClusterIP
      
      kubectl describe deployment nginx-server
      
      kubectl get pods -l app.kubernetes.io/name=nginx
      NAME                          READY   STATUS    RESTARTS   AGE
      nginx-server-949fd768-rdrm9   1/1     Running   0          3m44s
      
      kubectl get svc -l app.kubernetes.io/name=nginx 
      NAME           TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
      nginx-server   ClusterIP   172.20.176.233   <none>        80/TCP,443/TCP   4m52m


      Ingress 설정을 아래와 같이 작성하여 적용합니다.

      파일 작성하기 - ingress-webserver.yaml
      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: nginx-ingresss
        namespace: default
        annotations:
          cert-manager.io/cluster-issuer: letsencrypt-stg          
          ingress.kubernetes.io/force-ssl-redirect: "true"
          kubernetes.io/tls-acme: "true"
      spec:
        ingressClassName: nginx
        rules:
        - host: hello.cloudradar.kr
          http:
            paths:
              - path: /
                pathType: Prefix
                backend:
                  service:
                    name: nginx-server
                    port: 
                      number: 80
        tls:
          - hosts:
            - hello.cloudradar.kr
            secretName: hello-acme-crt

      Ingress 배포를 진행하고 정상적으로 동작하는지 확인해봅니다.

      kubectl apply -f ingress-webserver.yaml
      ingress.networking.k8s.io/nginx-ingresss created
      
      kubectl get ing
      NAME             CLASS   HOSTS                 ADDRESS                                                                       PORTS     AGE
      nginx-ingresss   nginx   hello.cloudradar.kr   dualstack.a061dd5a8ee12457783ffeae0911afee-111823484.ap-northeast-2.elb.amazonaws.com   80, 443   3m5s


      접속화면

      image.png

      6. 인증서 운영용으로 업데이트 하기

      앞서 Nginx 웹 서버를 배포하여 접속을 확인했습니다.

      그러나 현재 Let's Encrypt의 인증서를 Staging 용으로 발급되어 브라우저에서 보안 경고가 표시되고 있습니다.

      이를 해결하기 위해 운영 환경용 인증서로 전환하여 안전하게 페이지에 접속할 수 있도록 설정을 진행합니다.

      image.png


      파일 수정하기 - ingress-webserver.yaml

      기존 Cluster Issuer 를 letsencrypt-prd 로 변경합니다.

      ...
      metadata:
        name: nginx-ingresss
        namespace: default
        annotations:
          cert-manager.io/cluster-issuer: letsencrypt-prd
      ...
      kubectl apply -f ingress-webserver.yaml
      ingress.networking.k8s.io/nginx-ingresss configured

      인증서가 변경되어 브라우저에서 신뢰할 수 있는 인증서로 인식하게 됩니다.

      브라우저는 자동으로 새로운 인증서를 확인하고, 안전한 연결을 보장하기 위해 이를 신뢰할 수 있는 인증 기관(CA)에서 발급된 인증서인지 검증합니다.

      이로 인해 사용자는 안전한 웹사이트 접속을 지속적으로 유지할 수 있습니다.

      image.png


      7. 마무리

      이제 여러분의 Kubernetes 클러스터에서 무료로 HTTPS를 적용할 수 있게 되었습니다.

      Let's Encrypt와 CertManager 덕분에 인증서를 발급받고 관리하는 것이 매우 간편해졌습니다.

      이를 통해 사용자들에게 안전하고 신뢰할 수 있는 서비스를 제공할 수 있습니다.


      다음 단계에서는 Keycloak 설치부터 설정까지: SSO를 위한 첫걸음 주제로 설명하도록 하겠습니다.



      1. eksctl로 손쉽게 시작하는 Kubernetes 클러스터 및 노드그룹 생성 방법

      2. 완벽한 HTTPS 보안: Ingress 컨트롤러와 Let's Encrypt으로 무료 인증서 설정하기

      3. Keycloak 설치부터 설정까지: SSO를 위한 첫걸음

      4. SSO 연동 샘플 애플리케이션 구성하기: 실전 가이드

      5. SSO 연동 테스트: Keycloak과 애플리케이션의 완벽한 통합

      댓글 0

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

      eclipse 님의 최신 블로그

      더보기

      DEVOTEE 추천 블로그

      동영상 기고하기