쿠버네티스에서 Ingress는 외부 트래픽을 내부 서비스로 전달하는 역할을 합니다.
이번 글에서는 Ingress 리소스에 TLS 인증서를 적용하여 HTTPS를 활성화하는 방법과 보안 강화를 위한 설정을 다룹니다.
📌 글에서 다루는 상황들
1️⃣ Ingress에 TLS 인증서를 적용하여 HTTPS 활성화
2️⃣ Ingress 보안 강화 (Redirect, CORS, Rate Limit 설정)
각 문제를 실무에서 바로 활용할 수 있도록 Manifest 템플릿과 예상 결과 값을 제공합니다.
1️⃣ Ingress에 TLS 인증서를 적용하여 HTTPS 활성화
❓ 문제 상황
운영팀에서 Ingress를 통해 제공되는 서비스에 HTTPS를 적용해야 하는 요구사항이 생겼습니다.
클라이언트가 HTTP가 아닌 HTTPS를 통해 접근할 수 있도록 TLS 인증서를 설정해야 합니다.
• example.com 도메인을 사용하며 HTTPS를 지원해야 합니다.
• tls-secret이라는 Secret을 생성하여 TLS 인증서를 적용해야 합니다.
• HTTP 요청이 들어오면 자동으로 HTTPS로 리디렉션되어야 합니다.
✅ 어떻게 해결할 수 있을까요?
🛠️ 해결 방법
1. TLS 인증서를 Secret으로 생성하여 Ingress에서 사용할 수 있도록 해야 합니다.
kubectl create secret tls tls-secret --cert=cert.pem --key=key.pem
• cert.pem과 key.pem은 도메인 인증서 파일
2. Ingress 리소스에서 tls 섹션을 추가하여 HTTPS를 활성화해야 합니다.
• spec.tls 항목에 tls-secret을 지정하여 TLS 설정
3. HTTP 요청이 들어오면 HTTPS로 자동 리디렉션하도록 설정해야 합니다.
• nginx.ingress.kubernetes.io/force-ssl-redirect: "true" 어노테이션 추가
✅ 정답 Manifest (TLS 적용된 Ingress 설정)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: secure-ingress # Ingress 리소스 이름
annotations:
nginx.ingress.kubernetes.io/force-ssl-redirect: "true" # HTTP → HTTPS 자동 리디렉션
spec:
tls:
- hosts:
- example.com # HTTPS를 적용할 도메인
secretName: tls-secret # TLS 인증서가 저장된 Secret
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-service # 트래픽을 전달할 서비스
port:
number: 80
📌 적용 후 예상 결과 값
1. TLS Secret 생성 확인
kubectl get secrets
💡 예상 출력 값
NAME TYPE DATA AGE
tls-secret kubernetes.io/tls 2 5s
2. Ingress 생성 확인
kubectl get ingress
💡 예상 출력 값
NAME CLASS HOSTS ADDRESS PORTS AGE
secure-ingress nginx example.com 203.0.113.50 80, 443 5s
3. HTTPS로 서비스 접근 테스트
curl -k https://example.com
💡 예상 출력 값
<!DOCTYPE html>
<html>
<head><title>Welcome to nginx!</title></head>
<body>
<h1>Welcome to nginx!</h1>
</body>
</html>
4. HTTP 요청이 HTTPS로 리디렉션되는지 확인
curl -I http://example.com
💡 예상 출력 값
HTTP/1.1 308 Permanent Redirect
Location: https://example.com/
2️⃣ Ingress 보안 강화 (Redirect, CORS, Rate Limit 설정)
❓ 문제 상황
운영팀에서 Ingress 트래픽을 보다 안전하게 보호하기 위한 추가 설정이 필요합니다.
보안 강화를 위해 다음과 같은 기능을 적용해야 합니다.
• HTTP 요청을 자동으로 HTTPS로 리디렉션해야 합니다.
• CORS(Cross-Origin Resource Sharing) 설정을 적용해야 합니다.
• 특정 클라이언트의 과도한 요청을 차단하기 위해 Rate Limit을 설정해야 합니다.
✅ 어떻게 해결할 수 있을까요?
🛠️ 해결 방법
1. HTTP → HTTPS 리디렉션을 활성화해야 합니다.
• nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
2. CORS 설정을 적용하여 특정 도메인만 허용해야 합니다.
• nginx.ingress.kubernetes.io/enable-cors: "true"
• nginx.ingress.kubernetes.io/cors-allow-origin: "https://allowed-origin.com"
3. Rate Limit을 설정하여 특정 클라이언트의 과도한 요청을 방지해야 합니다.
• nginx.ingress.kubernetes.io/limit-rps: "10" (초당 10개 요청 제한)
✅ 정답 Manifest (보안 설정이 적용된 Ingress)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: secure-ingress-advanced # Ingress 리소스 이름
annotations:
nginx.ingress.kubernetes.io/force-ssl-redirect: "true" # HTTP → HTTPS 자동 리디렉션
nginx.ingress.kubernetes.io/enable-cors: "true" # CORS 활성화
nginx.ingress.kubernetes.io/cors-allow-origin: "https://allowed-origin.com" # 허용할 도메인
nginx.ingress.kubernetes.io/limit-rps: "10" # 초당 요청 제한
spec:
tls:
- hosts:
- example.com
secretName: tls-secret
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
📌 적용 후 예상 결과 값
1. Ingress 생성 확인
kubectl get ingress
💡 예상 출력 값
NAME CLASS HOSTS ADDRESS PORTS AGE
secure-ingress-advanced nginx example.com 203.0.113.50 80, 443 5s
2. HTTPS로 서비스 접근 테스트
curl -k https://example.com
💡 예상 출력 값
<!DOCTYPE html>
<html>
<head><title>Welcome to nginx!</title></head>
<body>
<h1>Welcome to nginx!</h1>
</body>
</html>
3. CORS 설정 확인
curl -I -H "Origin: https://allowed-origin.com" https://example.com
💡 예상 출력 값
Access-Control-Allow-Origin: https://allowed-origin.com
4. Rate Limit 확인 (초당 10개 이상 요청 시 차단)
for i in {1..15}; do curl -s https://example.com; done
💡 예상 출력 값
429 Too Many Requests