[k8s] HTTPS 배포하기 (feat: minikube)

sang yun Lee·2023년 7월 5일
0

Devops 실습

목록 보기
19/21

개요


미니큐브쿠버네틱스 를 구동시키고 cert-manager 를 사용하여 서버에 HTTPS 를 적용하는 방법을 공유하려 한다.
나는 아무리 가이드를 찾아봐도 내 환경에서는 제대로 동작되지 않아 삽질을 3일간 했다... 개념에 대한 내용은 좋은 자료가 많아서 넘기려한다. 글의 최하단 참고자료 참고하시면 좋다..!

바로 실습을 해보자.

실습


기본적으로 미니큐브로 진행한다.

선제조건 :

  • 쿠버네티스가 설치되어 있어야 한다.
  • Public Network 와 연결되어 있어야 한다.

🔸 STEP 0 : 미니큐브 시작

$ minikube start

🔸 STEP 1 : NGINX Ingress Controller 설치

  1. helm 을 통해 ingress-nginx 컨트롤러 설치 (공식 설치 정보 (설치 방법 예시 있음))
    # 헬름 저장소 추가
    $ helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx

    # 저장소 정보 갱신
    $ helm repo update

    # 저장소 리스트 확인
    $ helm repo list

    # k8s 에 ingress-nginx 컨트롤러 설치
    $ helm upgrade --install ingress-nginx ingress-nginx/ingress-nginx \
    --namespace ingress-nginx --create-namespace \

번외: 프로메테우스 메트릭과 http, https 포트를 고정하는 설정으로 설치하고 싶을 때 사용

helm upgrade --install ingress-nginx ingress-nginx/ingress-nginx \
--namespace ingress-nginx --create-namespace \
--set controller.metrics.enabled=true \
--set-string controller.podAnnotations."prometheus\.io/scrape"="true" \
--set-string controller.podAnnotations."prometheus\.io/port"="10254" \
--set controller.service.nodePorts.http=30000 \
--set controller.service.nodePorts.https=30001

validatingwebhookconfiguration 제거

사유 : ingress 생성 시 문제를 발생켜서 제거함

 kubectl delete validatingwebhookconfiguration ingress-nginx-admission

🔸 STEP 2 : cert-manager 설치

cert-manager 를 설치한다.

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


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

# 
$ my_email=sororiri@gmail.com
$ kubectl apply -f - <<EOF
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-issuer
spec:
  acme:
    email: $(echo $my_email)
    preferredChain: ""
    privateKeySecretRef:
      name: letsencrypt-issuer
    server: https://acme-v02.api.letsencrypt.org/directory
    solvers:
    - http01:
        ingress:
          ingressClassName: nginx
EOF

🔸 STEP 3 : 온프레미스 서버 설정

🔹 1. 도메인을 자신의 라우터와 연결

가비아 등에서 도메인을 구입하고 자신의 공용 인터넷 IP 에 연결한다.

🔹 2. 라우터에서 온프레미스 서버로의 포트포워딩

라우터의 설정들 들어가 자신의 컴퓨터로 포트포워딩을 설정해준다.

라우터: 443 => 내 컴퓨터 : 4343
       80  =>           8080

🔹 3. 온프레미스서버에서 미니큐브로의 포트포워딩

kubectl port-forward --namespace=ingress-nginx service/ingress-nginx-controller 8080:80 4343:443 --address='0.0.0.0'

🔸 STEP 4 : 필요한 리소스 파일들을 적용한다.

🔹 1. 리소스 파일 획득

# 샘플 예제 다운
$ git clone https://github.com/SangYunLeee/kubernetics-example.git

# 예제로 이동
$ cd ssl-certification-example

🔹 2. 인그레스 수정

ingress.yaml 파일 내에 www.enttolog.shop 를 자신의 도메인(ex: www.example.com)으로 교체한다.

   - hosts:
     - www.enttolog.shop
=>
   - hosts:
     - www.example.com

주의할 점

  • ingress 리소스와 issuer 리소스의 네임스페이스가 동일하여야 한다.

🔹 3. 리소스 반영

$ kubectl apply --kustomize .

service/kuard created
deployment.apps/kuard created
issuer.cert-manager.io/letsencrypt-prod created
issuer.cert-manager.io/letsencrypt-staging created
ingress.networking.k8s.io/kuard created

🔸 STEP 5 : 정상 동작 테스트

아래와 같이 브라우저에서 접속해보면 잠금자물쇠 표시가 되어 있다면 제대로 된 것이다.

트러블 슈팅에 도움이 되는 것들...


🔸 리소스 분석 결과

제대로 동작했을 때의 결과값을 공유한다.

🔹 인증서 요청 관련 리소스 분석 결과

CA 에 인증서를 요청했을 때의 이벤트 결과값을 확인할 수 있다.

$ kubectl describe certificaterequests.cert-manager.io
...
Events:
  Type    Reason              Age   From                                                Message
  ----    ------              ----  ----                                                -------
  Normal  WaitingForApproval  36m   cert-manager-certificaterequests-issuer-venafi      Not signing CertificateRequest until it is Approved
  Normal  WaitingForApproval  36m   cert-manager-certificaterequests-issuer-selfsigned  Not signing CertificateRequest until it is Approved
  Normal  WaitingForApproval  36m   cert-manager-certificaterequests-issuer-vault       Not signing CertificateRequest until it is Approved
  Normal  WaitingForApproval  36m   cert-manager-certificaterequests-issuer-acme        Not signing CertificateRequest until it is Approved
  Normal  WaitingForApproval  36m   cert-manager-certificaterequests-issuer-ca          Not signing CertificateRequest until it is Approved
  Normal  IssuerNotReady      36m   cert-manager-certificaterequests-issuer-acme        Referenced issuer does not have a Ready status condition
  Normal  cert-manager.io     36m   cert-manager-certificaterequests-approver           Certificate request has been approved by cert-manager.io
  Normal  CertificateIssued   35m   cert-manager-certificaterequests-issuer-acme        Certificate fetched from issuer successfully

🔹 인그레스 리소스 분석 결과

$ kubectl describe ingress      
Name:             kuard
Labels:           app=tls-test
Namespace:        default
Address:          
Ingress Class:    nginx
Default backend:  <default>
TLS:
  quickstart-example-tls terminates www.enttolog.shop
Rules:
  Host               Path  Backends
  ----               ----  --------
  www.enttolog.shop  
                     /   kuard:80 (10.244.0.9:8080)
Annotations:         cert-manager.io/issuer: letsencrypt-prod
Events:
  Type    Reason             Age   From                       Message
  ----    ------             ----  ----                       -------
  Normal  Sync               43m   nginx-ingress-controller   Scheduled for sync
  Normal  CreateCertificate  43m   cert-manager-ingress-shim  Successfully created Certificate "quickstart-example-tls"

🔹 인증서 리소스 분석 결과

$ kubectl describe ingress    
...
Status:
  Conditions:
    Last Transition Time:  2023-07-05T16:35:09Z
    Message:               Certificate is up to date and has not expired
    Observed Generation:   1
    Reason:                Ready
    Status:                True
    Type:                  Ready
  Not After:               2023-10-03T15:35:07Z
  Not Before:              2023-07-05T15:35:08Z
  Renewal Time:            2023-09-03T15:35:07Z
  Revision:                1
Events:
  Type    Reason     Age   From                                       Message
  ----    ------     ----  ----                                       -------
  Normal  Issuing    46m   cert-manager-certificates-trigger          Issuing certificate as Secret does not exist
  Normal  Generated  46m   cert-manager-certificates-key-manager      Stored new private key in temporary Secret resource "quickstart-example-tls-vnl69"
  Normal  Requested  46m   cert-manager-certificates-request-manager  Created new CertificateRequest resource "quickstart-example-tls-9gsjr"
  Normal  Issuing    45m   cert-manager-certificates-issuing          The certificate has been successfully issued

참고자료


0개의 댓글