7. 사용자 요청처리 요약
virtualbox
kubernetes
cert-manager
Client
① helloworld.com
IP 질의
② 집공유기 IP리턴
③ 서비스 요청
④ 포트포워딩
⑤ 응답
① 사용자가 요청한 도메인(예: helloworld.com)에 대한 IP질의
② 도메인에 해당하는 IP리턴(이 실습에서는 집 공유기 IP사용)
③ IP로 서비스를 요청하면 공유기가 쿠버네티스 ingress로 포트포워딩
④ ingress는 서비스를 처리하고 응답
집공유기
9. 컴퍼넌트
① Issuer: 인증서 주체
② certificates: 인증서 정의
③ secret: 발급된 인증서와 비밀키 저장
①
②
③
※ 공식문서: https://cert-manager.io/docs/
10. 컴퍼넌트
※ self-signed issuer: https://cert-manager.io/docs/configuration/selfsigned/
▪ 대표적인 2개 Issuer: self-signed, let's encrypt
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
name: selfsigned-issuer
namespace: sandbox
spec:
selfSigned: {}
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
name: letsencrypt-staging
spec:
acme:
# The ACME server URL
server: https://acme-staging-v02.api.letsencrypt.org/directory
# Email address used for ACME registration
email: [email protected]
# Name of a secret used to store the ACME account private key
privateKeySecretRef:
name: letsencrypt-staging
# Enable the HTTP-01 challenge provider
solvers:
- http01:
ingress:
class: nginx
<self-signed issuer>
<let's encrypt issuer>
※ let's encrypt issuer: https://cert-manager.io/docs/tutorials/acme/ingress/#step-6-configure-let-s-encrypt-issuer
11. 컴퍼넌트
▪ issuer는 issuer와 clusterissuer로 분류
▪ issuer: 같은 namespace만 인증서 참조 가능
▪ clusterissuer: 모든 namespace에서 참조 가능
12. 컴퍼넌트
※ 공식문서: https://cert-manager.io/docs/tutorials/acme/ingress/#step-6-configure-let-s-encrypt-issuer
▪ Issuer은 stage, prod환경으로 분리
▪ stage: 테스트
▪ prod: 운영
13. 컴퍼넌트
※ 공식문서: https://cert-manager.io/docs/concepts/certificate/
▪ certificates는 인증서 발급에 대한 명세를 정의
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: acme-crt
spec:
secretName: acme-crt-secret
dnsNames:
- foo.example.com
- bar.example.com
issuerRef:
name: letsencrypt-prod
# We can reference ClusterIssuers by changing the kind here.
# The default value is Issuer (i.e. a locally namespaced Issuer)
kind: Issuer
group: cert-manager.io
15. virtualbox
kubernetes
cert-manager
① ssl인증서 신청
② ssl인증서 생성
도메인 발급
③ 인증서
사용
준비
▪ 외부접속이 가능한 쿠버네티스 클러스터
▪ nginx-ingress
▪ service-type: loadbalancer
▪ 온프레미스는 metaLB사용
▪ 도메인
▪ cloudflare 네임서버 연동
16. 준비
▪ cloudflare api token을 생성하고 쿠버네티스 secret에 저장
※ toekn생성 공식문서: https://cert-manager.io/docs/configuration/acme/dns01/cloudflare/#api-keys
apiVersion: v1
kind: Secret
metadata:
name: cloudflare-api-key-secret
type: Opaque
stringData:
api-key: <API Key>
17. Issuer 발급
※ git wiki: https://github.com/choisungwook/portfolio/wiki/cert-manager-letsencrypt
▪ stage, prod clusterissuer발급
▪ 이메일 수정
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-staging
spec:
acme:
# The ACME server URL
server: https://acme-staging-v02.api.letsencrypt.org/directory
# Email address used for ACME registration
email: <your@email>
# Name of a secret used to store the ACME account private key
privateKeySecretRef:
name: letsencrypt-staging
# Enable the challenge provider
solvers:
- dns01:
cloudflare:
email: <your-email>
apiTokenSecretRef:
name: cloudflare-api-token-secret
key: api-token
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
# The ACME server URL
server: https://acme-v02.api.letsencrypt.org/directory
# Email address used for ACME registration
email: <your@email>
# Name of a secret used to store the ACME account private key
privateKeySecretRef:
name: letsencrypt-prod
# Enable the challenge provider
solvers:
- dns01:
cloudflare:
email: <your-email>
apiTokenSecretRef:
name: cloudflare-api-token-secret
key: api-token
19. deployment, 서비스 생성
▪ 요청을 처리할 pod, svc생성
▪ pod의 이미지는 nginx:latest사용
kubernetes
cert-manager
② ssl인증서 생성
※ git wiki: https://github.com/choisungwook/portfolio/wiki/cert-manager-letsencrypt#%EC%9D%B8%EC%A6%9D%EC%84%9C-
%EC%A0%81%EC%9A%A9-%EC%98%88%EC%A0%9C
20. 인증서 발급과 ingress 연동
▪ 인증서를 만들고 -> 저장된 인증서 secret을 ingress에 적용
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: acme-crt
spec:
secretName: acme-crt-secret
...
kubernetes
cert-manager
① ssl인증서 생성
② 인증서
사용 apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-test
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
tls:
- hosts:
- test.choilab.xyz
secretName: acme-crt-secret
...