23.06.15
DEVOTEE를 활성화 시키면
지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.
버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.
| 컨텐츠 유형 | 제목 | 저장일 | 삭제 |
|---|
본인인증 로그인에 실패하였습니다.
회원이 아니시거나 본인인증 등록이
완료되지 않은 사용자입니다.
이번 세션에서는 Kubernetes 환경에서 Cert-manager와 Let's encrypt를 이용하여 만료 걱정이 없는 TLS 인증서를 만들어 봅니다.
또한 Emberstack의 Reflector를 이용하여 Let's encrypt가 만든 인증서를 특정 또는 모든 Namespace에 복사를 해봅니다.
Cert-manager 및 Reflector 설치를 위해 Helm 도구를 설치합니다.
### Helm 설치
$ curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
$ chmod 700 get_helm.sh
$ ./get_helm.sh
### Repository 추가
$ helm repo add jetstack https://charts.jetstack.io
$ helm repo add emberstack https://emberstack.github.io/helm-charts
$ helm repo update
### 확인
$ helm repo ls
NAME URL
jetstack https://charts.jetstack.io
emberstack https://emberstack.github.io/helm-chartsCert-manager GitHub Link: Link
2024.08.31 현재 Cert-manager 최신 버전은 1.15.3 입니다.
Cert-manager를 Kubernetes에 Helm을 이용하여 설치합니다.
### Namespace 추가
$ kubectl create ns cert-manager
### Cert-manager CRD 설치
$ kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.15.3/cert-manager.crds.yaml
### Cert-manager 설치
$ helm install cert-manager --namespace cert-manager --version v1.15.3 jetstack/cert-managerEmberstack Reflector GitHub Link: Link
Emberstack에서 개발/배포하는 Reflector는 Kubernetes에서 ConfigMap과 Secret를 Namespace간 복제해주는 도구입니다.
TLS 인증서는 Kubernetes 상에서는 Secret으로 관리가 됩니다.
우리는 Let's Encrypt 통해서 TLS 인증서를 발급 받을 예정인데요
아시다시피 Let't Encrypt 인증서는 만료기간이 최대 3개월 입니다.
다행스럽게 Cert-manager는 Let's Encrypt 인증서를 3개월 만료가 되기 전에 자동으로 갱신을 수행합니다.
문제는 다른 Namespace에 이미 복제하여 배포한 Let's Encrypt 인증서가 있다면 이 인증서들 역시 갱신해 주지 않는다면 만료된 인증서라고 오류가 발생할 것입니다.
Emberstack의 Reflector 는 Let's Encrypt 인증서가 자동으로 갱신이 되면
특정 또는 모든 Namespace에 이 인증서 Secret를 복제하여, 이 문제를 해결할 수 있습니다.
이제 Emberstack Reflector를 설치해봅니다.
### Namespace 추가
$ kubectl create ns emberstack
### Reflector 설치
$ helm upgrade --install --namespace emberstack reflector emberstack/reflectorLet's Encrypt 인증서 설정을 시작해 봅니다.
인증서를 발급받기 위해서는 Domain 소유권에 대한 증명이 필요합니다.
Domain의 대한 소유권을 증명하는 방법은 여러가지가 있습니다.
Let's Encrypt에서는 이 과정을 Challenge 라고 합니다.
Challenge Type 종류는 다음과 같습니다.
저 같은 경우 aiweaver.io 라는 도메인을 소유하고 있으며, AWS Route53을 이용하여 Domain Control을 하고 있습니다.
따라서, Let's Encrypt Challenge Type을 DNS를 통해 Verification 받는 것으로 설정합니다.
AWS IAM에서 route53-user 와 CertManagerRoute53AccessPolicy 를 아래와 같이 등록합니다.
CertManagerRoute53AccessPolicy 내용
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "route53:GetChange",
"Resource": "arn:aws:route53:::change/*"
},
{
"Effect": "Allow",
"Action": [
"route53:ChangeResourceRecordSets",
"route53:ListResourceRecordSets"
],
"Resource": "arn:aws:route53:::hostedzone/*"
},
{
"Effect": "Allow",
"Action": "route53:ListHostedZonesByName",
"Resource": "*"
}
]
}권한은 위에서 등록한 CertManagerRoute53AccessPolicy 를 선택합니다.
신뢰 관계에서는 아래와 같이 등록을 합니다.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::{$YOUR_AWS_ACCOUNT_ID}:user/route53-user"
},
"Action": "sts:AssumeRole",
"Condition": {}
}
]
}아래와 같이 AWS Credential Secret을 등록합니다.
$ cat aws-route53-credential.yml
apiVersion: v1
kind: Secret
metadata:
name: aws-route53-credential
namespace: cert-manager
type: Opaque
stringData:
secret-access-key: YOUR_AWS_ROUTE53_USER_SECRET_ACCESS_KEY
# kubectl -n cert-manager apply -f aws-route53-credential.yml### Cluster Issuer를 등록합니다.
$ cat cluster-issuer-letsencrypt.yml
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: cluster-issuer-letsencrypt
spec:
acme:
email: aiweaver@sk.com
server: https://acme-v02.api.letsencrypt.org/directory
privateKeySecretRef:
name: cluster-issuer-letsencrypt
solvers:
- selector:
dnsZones:
- "aiweaver.io"
dns01:
route53:
region: ap-northeast-2
accessKeyID: YOUR_AWS_ROUTE53_USER_ACCESS_ID
secretAccessKeySecretRef:
name: aws-route53-credential
key: secret-access-key
role: arn:aws:iam::{$YOUR_AWS_ACCOUNT_ID}:role/CertManagerRoute53AccessRole
$ kubectl -n cert-manager apply -f cluster-issuer-letsencrypt.yml
### Cluster Issuer 상태 확인 - READY 가 True 면 정상
$ kubectl get ClusterIssuer -n cert-manager
NAME READY AGE
cluster-issuer-letsencrypt True 1dCluterIssuer를 기반으로 제가 소유하고 있는 aiweaver.io Let's Encrypt Wildcard 인증서를 발급합니다.
여기서 증요한 점은, 인증서를 발급하면서 Reflector Annotation을 이용하여 특정 또는 모든 Namespace에 복사하는 설정을 함께 추가합니다.
Reflector Annotation 설정 방법은 아래 링크를 참조하십시오.
여기서는 모든 Namespace에 복사로 설정하였습니다. (즉, 비어있는 값으로 설정)
### 아래와 같이 내용을 작성합니다.
$ cat tls-wildcard-aiweaver-io.yml
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: tls-wildcard-aiweaver-io
namespace: cert-manager
spec:
secretName: cert-manager-tls-wildcard-aiweaver-io
issuerRef:
name: cluster-issuer-letsencrypt
kind: ClusterIssuer
commonName: '*.aiweaver.io'
dnsNames:
- '*.aiweaver.io'
- 'aiweaver.io'
secretTemplate:
annotations:
reflector.v1.k8s.emberstack.com/reflection-allowed: "true"
reflector.v1.k8s.emberstack.com/reflection-allowed-namespaces: ""
reflector.v1.k8s.emberstack.com/reflection-auto-enabled: "true"
reflector.v1.k8s.emberstack.com/reflection-auto-namespaces: ""
### 인증서 발행
$ kubectl -n cert-manager apply -f tls-wildcard-aiweaver-io.yml
### 요청 한 인증서 상태 확인 - 활성화 까지 1분 정도 소요 됩니다.
### READY가 False 였다가 True로 변경이 되면 정상적으로 인증서가 발급 된 것입니다.
$ watch -n 5 -c 'kubectl get Certificate -n cert-manager'
NAME READY SECRET AGE
tls-wildcard-aiweaver-io True cert-manager-tls-wildcard-aiweaver-io 1d
### 다른 Namespace에도 복제가 되었는지 확인 해 봅니다.
### cert-manager-tls-wildcard-aiweaver-io 라는 Secret이 있으면 정상입니다.
$ kubectl get secret -n cert-manager
NAME TYPE DATA AGE
aws-route53-credential Opaque 1 1d
cert-manager-tls-wildcard-aiweaver-io kubernetes.io/tls 1 1d
cert-manager-webhook-ca Opaque 1 1d
cluster-issuer-letsencrypt Opaque 1 1d
sh.helm.release.v1.cert-manager.v1 helm.sh/release.v1 1 1d
$ kubectl get secret -n aiweaver-platform
NAME TYPE DATA AGE
api6-gateway-etcd-jwt-token Opaque 1 1d
cert-manager-tls-wildcard-aiweaver-io kubernetes.io/tls 1 1d여기까지 Cert-manager와 Let'e Encrypt를 통해서 자신이 소유한 도메인에 대해서 Wildcard 인증서를 발급하는 방법에 대해서 알아보았습니다.
이런 방식으로 인증서를 등록하면 3개월 마다 Cert-manager가 Let's Encrypt 인증서를 자동으로 갱신합니다.
만약에 갱신에 실패를 하게 되면 ClusterIssuer에 등록 한 spec.acme.email 주소로 갱신하지 못했다는 메일을 받게 됩니다. (무소식이 희소식)
지금까지 영원히 걱정없이 사용할 수 있는 Wildcard TLS 인증서 등록/자동갱신 방법에 대해서 알아보았습니다.
질문이 있다면 언제든지 댓글 부탁드립니다.
마지막으로 Rancher 에서는 아래 그림과 같이 인증서를 Ingress에 등록해 주면 쉽게 끝납니다.
DEVOTEE를 활성화 시키면
지금 작성한 댓글에 AI가 댓글을 달아줍니다.