쿠버네티스 클러스터에 ingress 컨트롤러가 설치되어 있는지 확인한다. 만약 없다면 설치하고 설치한 ingress 컨트롤러 타입을 기억한다.
1. cert-manager 설치하기
kubectl apply -f https://<a href="http://github.com/jetstack">github.com/jetstack</a>/cert-manager/releases/download/v1.8.0/cert-manager.yaml ... # cert-manager 설치 확인 kubectl get pod -n cert-manager
2. cluster-issuer 생성하기
아래 yaml 파일에서 이메일 주소(spec.acme.email)와 ingress 타입(spec.acme.solvers.selector[0].http01.ingrss.class)을 확인하고 nginx
또는 traefik
등 자신이 사용할 ingress 타입을 기입한다.
# vi cluster-issuer.yaml apiVersion: <a href="http://cert-manager.io/v1">cert-manager.io/v1</a> kind: ClusterIssuer metadata: name: letsencrypt-staging spec: acme: # The ACME server URL server: <a href="https://acme-staging-v02.api.letsencrypt.org/directory">https://acme-staging-v02.api.letsencrypt.org/directory</a> # Email address used for ACME registration email: abc@efg.com # 자신의 이메일 주소를 기재 # Name of a secret used to store the ACME account private key privateKeySecretRef: name: letsencrypt-staging # Enable the HTTP-01 challenge provider solvers: # An empty 'selector' means that this solver matches all domains - selector: {} http01: ingress: class: nginx # 자신의 ingress 컨트롤러 타입 기재 --- apiVersion: <a href="http://cert-manager.io/v1">cert-manager.io/v1</a> kind: ClusterIssuer metadata: name: letsencrypt-prod spec: acme: # The ACME server URL server: <a href="https://acme-v02.api.letsencrypt.org/directory">https://acme-v02.api.letsencrypt.org/directory</a> # Email address used for ACME registration email: abc@efg.com # 자신의 이메일 주소를 기재 # Name of a secret used to store the ACME account private key privateKeySecretRef: name: letsencrypt-prod # Enable the HTTP-01 challenge provider solvers: - http01: ingress: class: nginx # 자신의 ingress 컨트롤러 타입 기재
cluster issuer 생성 및 생성 여부 확인
kubectl create -f cluster-issuer.yaml kubectl get clusterissuer
3. 인증서를 사용할 web 및 ingress 배포
# vi deploy-web.yaml apiVersion: apps/v1 kind: Deployment metadata: name: web spec: replicas: 3 selector: matchLabels: app: web template: metadata: labels: app: web spec: containers: - name: web image: <a href="http://pghmv2sm.kr.private-ncr.ntruss.com/webweb:1.0">pghmv2sm.kr.private-ncr.ntruss.com/webweb:1.0</a> # 컨테이너 이미지는 알아서 변경 ports: - containerPort: 80 imagePullSecrets: - name: regcred nodeSelector: <a href="http://ncloud.com/nks-nodepool">ncloud.com/nks-nodepool</a>: kr2-node-01 --- apiVersion: v1 kind: Service metadata: name: web spec: type: NodePort selector: app: web ports: - protocol: TCP port: 80
kubectl create -f deploy-web.yaml
# vi web-ingress.yaml apiVersion: <a href="http://networking.k8s.io/v1">networking.k8s.io/v1</a> kind: Ingress metadata: name: web-ingress annotations: <a href="http://ingress.kubernetes.io/ssl-redirect">ingress.kubernetes.io/ssl-redirect</a>: "true" <a href="http://kubernetes.io/ingress.class">kubernetes.io/ingress.class</a>: nginx # 자신의 ingress 컨트롤러 타입 기재 <a href="http://kubernetes.io/tls-acme">kubernetes.io/tls-acme</a>: "true" <a href="http://cert-manager.io/cluster-issuer">cert-manager.io/cluster-issuer</a>: letsencrypt-prod spec: tls: - hosts: - <a href="http://abc.com/">abc.com</a> # 인증서를 적용할 도메인으로 변경 secretName: web-devbox-kr-cert # 인증서 key가 저장되는 secret rules: - host: <a href="http://abc.com/">abc.com</a> # 인증서를 적용할 도메인으로 변경 http: paths: - path: / backend: service: name: web port: number: 80
kubectl create -f web-ingress.yaml