인증서
- CA는 디지털 인증서를 발행하고 관리하는 기관
- 특정 주체(웹사이트, 사용자, 조직 등)에 대해 디지털 인증서 발행
- 발행된 인증서 관리하고 만료되거나 유효하지 않은 인증서 폐기
- 사용자나 웹 브라우저가 웹사이트에 접속할때, CA가 발행한 인증서를 확인하여 해당 웹사이트가 실제로 자신이 주장하는 주체인지
- 디지털 인증서의 구조
- 주체 정보 : 인증서 소유한 주체의 정보
- CA 정보 : 인증서를 발행한 CA 정보
- 공개 키 : 주체의 공개 키 이는 암호화 통신에 사용
- 서명 : CA가 인증서에 서명한 디지털 서명
- 인증서 발행 과정
- CSR 생성 : 주체는 자신의 공개키와 도메인 이름 등의 정보를 포함한 CSR을 생성
- 검증 : CA는 주체가 해당 도메인의 소유자인지 확인
- 인증서 발행 : 검증 완료 되면 , CA는 주체에게 인증서 발행하여 전달
- 배포 : 주체는 인증서를 서버에 설치하고 사용자가 웹사이트에 접속할떄 이 인증서를 제시하여 신뢰성을 보증
Kubernetes cert-manager

- Issuer (CA)
- Issuer는 CA와의 연결 방식을 정의하는 리소스 (CA는 Let's Encrypt와 같은 공인 인증 기관을 말한다.)
- CSR 요청 받으면 Issuer에 정의한 CA를 통해 인증서에 서명 진행
- 따라서 Cert Manager의 모든 인증서들은 어떤 Issuer를 통할지 명시되어야함.
- Issuer는 namespace에 종속되지 않고 사용할 수 있는 ClusterIssuer와 특정 Namespace에 종속되는 Issuer로 나뉨.
- certificate
- certificate는 Issuer를 통해 생성된 하나의 인정서
- Certificate는 namespace에 종속되고 인증서 정보는 Secret에 저장되어 있음
- 인증서 유효기간, 갱신시기, 생성할 Secret명 등을 정의할 수 있음
- 인증서 갱신 시기가 되면 CertificateRequest라는 Component를 생성하여 Issuer를 통해 인증서 갱신 수행
- Secret(TLS Secret)
- K8S의 Secret
- Certificate가 관리하며 내부에는 CA인증서를 비롯한 TLS 인증서와 키 파일이 포함 되어 있음
- CA 인증서는 Issuer에 정의된 CA 인증서라 같은 Issuer를 통해 생성된 인증서의 Secret들은 모두 같은 값을 가지게 됨.
- TLS 인증서와 키는 인증서 별로 생성되어 서로 다른 값을 가짐
- Pod에 해당 Secret을 mount 하여 사용할 수 있음
Azure Kubernetes Service & Cert-manager & Let's Encrypt 인증서 테스트
1. 개요Let’s Encrypt에서 서명된 인증서를 가져오도록 cert-manager를 구성하는 방법을 알아봅니다.
2. Azure kubernetes Service에 cert-manager를 배포하고 구성하는 방법과 HTTPS 웹 서버를 배포하여 인터넷에서 사용할 수 있도록 하는 방법을 알아봅니다.
- cert-manager : kubernetes에서 Pod 단위로 실행됩니다. TLS/SSL 인증서를 획득하고 인증서가 유효하고 최신 상태인지 확인합니다.
- Let’s Encrypt : 인터넷 서비스입니다. 무료 단기 SSL 인증서를 생성할 수 있습니다.
3. 아키텍처 (참고)

4. 테스트 과정
1) Ingress Controller 생성
helm을 이용해서 Ingress Controller 생성
# Create a namespace for ingress resources
kubectl create namespace ingress-nginx
# Add the Helm repository
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
# Use Helm to deploy an NGINX ingress controller
helm install ingress-nginx ingress-nginx/ingress-nginx \
--namespace ingress-nginx \
--set controller.replicaCount=1

2) ClusterIssuer 생성
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: cloudlsc0406@mz.co.kr
# 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

3) Deployment 생성
apiVersion: apps/v1
kind: Deployment
metadata:
name: webweb
spec:
replicas: 3
selector:
matchLabels:
app: webweb
template:
metadata:
labels:
app: webweb
spec:
containers:
- name: webweb
image: nginx:latest
ports:
- containerPort: 80
nodeSelector:
agentpool: nodepool1

4) Service 생성
apiVersion: v1
kind: Service
metadata:
name: webweb
spec:
type: ClusterIP
selector:
app: webweb
ports:
- protocol: TCP
port: 80
targetPort: 80

5) Ingress 생성
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: webweb-ingress
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "true"
cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
ingressClassName: nginx
tls:
- hosts:
- cheolee.store
secretName: webweb-devbox-kr-cert
rules:
- host: cheolee.store
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: webweb
port:
number: 80


6) 도메인 작업
cheolee.store는 내가 가비아에서 구매한 도메인이다.
A 레코드를 Ingress External IP 주소로 설정해준다 .


7) HTTP로 접근 테스트

'Azure' 카테고리의 다른 글
| AKS에서 Grafana Loki & Prometheus를 이용해서 모니터링 (0) | 2024.10.01 |
|---|---|
| GitLab & Jenkins를 이용한 AKS CI/CD (0) | 2024.09.25 |
| AWS EC2(docker swarm)에서 Azure Kubernetes Service Migration (0) | 2024.07.17 |
| Azure DataFactory를 통한 Azure Cosmos DB 데이터 적재 (0) | 2024.07.17 |
| Private Link를 통한 Azure PostgreSQL의 Private Networking (0) | 2024.07.03 |