미니큐브
로 쿠버네틱스
를 구동시키고 cert-manager
를 사용하여 서버에 HTTPS
를 적용하는 방법을 공유하려 한다.
나는 아무리 가이드를 찾아봐도 내 환경에서는 제대로 동작되지 않아 삽질을 3일간 했다... 개념에 대한 내용은 좋은 자료가 많아서 넘기려한다. 글의 최하단 참고자료 참고하시면 좋다..!
바로 실습을 해보자.
기본적으로 미니큐브로 진행한다.
선제조건 :
- 쿠버네티스가 설치되어 있어야 한다.
- Public Network 와 연결되어 있어야 한다.
$ minikube start
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
사유 : ingress 생성 시 문제를 발생켜서 제거함
kubectl delete validatingwebhookconfiguration ingress-nginx-admission
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
가비아 등에서 도메인을 구입하고 자신의 공용 인터넷 IP 에 연결한다.
라우터의 설정들 들어가 자신의 컴퓨터로 포트포워딩을 설정해준다.
라우터: 443 => 내 컴퓨터 : 4343
80 => 8080
kubectl port-forward --namespace=ingress-nginx service/ingress-nginx-controller 8080:80 4343:443 --address='0.0.0.0'
# 샘플 예제 다운
$ git clone https://github.com/SangYunLeee/kubernetics-example.git
# 예제로 이동
$ cd ssl-certification-example
ingress.yaml
파일 내에 www.enttolog.shop
를 자신의 도메인(ex: www.example.com
)으로 교체한다.
- hosts:
- www.enttolog.shop
=>
- hosts:
- www.example.com
주의할 점
ingress
리소스와issuer
리소스의 네임스페이스가 동일하여야 한다.
$ 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
아래와 같이 브라우저에서 접속해보면 잠금자물쇠 표시가 되어 있다면 제대로 된 것이다.
제대로 동작했을 때의 결과값을 공유한다.
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