쿠버네티스에서 애플리케이션을 외부에 노출하려면 Service와 Ingress를 올바르게 설정해야 합니다.
이 글에서는 ClusterIP, NodePort, LoadBalancer 유형의 Service를 활용하여 트래픽을 라우팅하는 방법과, Ingress를 이용한 도메인 기반 라우팅 적용 방법을 다룹니다.
📌 글에서 다루는 상황들
1. ClusterIP, NodePort, LoadBalancer를 이용한 트래픽 노출 방법
2. Ingress를 활용하여 도메인 기반 라우팅 적용
3. Ingress TLS 설정을 통한 HTTPS 적용
각 문제를 실무에서 바로 활용할 수 있도록 Manifest 템플릿과 예상 결과 값을 제공합니다.
1️⃣ ClusterIP, NodePort, LoadBalancer를 이용한 트래픽 노출 방법
❓ 문제 상황
운영팀에서 애플리케이션을 외부에서 접근할 수 있도록 서비스 유형을 설정해야 합니다.
ClusterIP, NodePort, LoadBalancer를 활용하여 적절한 트래픽 노출 방법을 선택해야 합니다.
• 서비스 이름: web-service
• 노출할 포트: 80 -> 8080
• ClusterIP: 내부에서만 접근 가능
• NodePort: 외부에서 특정 노드의 포트로 접근 가능
• LoadBalancer: 클라우드 환경에서 공인 IP를 부여하여 외부 접근 가능
✅ 어떻게 해결할 수 있을까요?
🛠️ 해결 방법
1. 각각의 서비스 유형에 맞게 Service 리소스를 생성합니다.
2. kubectl을 사용하여 서비스가 정상적으로 생성되었는지 확인합니다.
✅ 정답 Manifest (Service 생성 - ClusterIP, NodePort, LoadBalancer)
🔹 ClusterIP (내부 접근)
apiVersion: v1
kind: Service
metadata:
name: web-service-clusterip
spec:
type: ClusterIP # 내부 네트워크에서만 접근 가능
selector:
app: web
ports:
- protocol: TCP
port: 80 # Service가 받을 포트
targetPort: 8080 # Pod 내부 포트
🔹 NodePort (외부 접근)
apiVersion: v1
kind: Service
metadata:
name: web-service-nodeport
spec:
type: NodePort # 특정 노드의 포트로 외부 접근 허용
selector:
app: web
ports:
- protocol: TCP
port: 80
targetPort: 8080
nodePort: 30080 # 외부에서 접근할 포트 (30000-32767 범위)
🔹 LoadBalancer (외부 접근)
apiVersion: v1
kind: Service
metadata:
name: web-service-loadbalancer
spec:
type: LoadBalancer # 공인 IP 부여하여 외부에서 접근 가능
selector:
app: web
ports:
- protocol: TCP
port: 80
targetPort: 8080
📌 적용 후 예상 결과 값
1. Service 목록 확인
kubectl get svc
💡 예상 출력 값
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
web-service-clusterip ClusterIP 10.96.120.12 <none> 80/TCP 5s
web-service-nodeport NodePort 10.96.120.14 <none> 80:30080/TCP 5s
web-service-loadbalancer LoadBalancer 10.96.120.20 <pending> 80/TCP 5s
2. NodePort를 통해 외부에서 접근 테스트
curl http://<노드 IP>:30080
💡 예상 출력 값
<!DOCTYPE html>
<html>
<head><title>Welcome to nginx!</title></head>
<body>
<h1>Success!</h1>
</body>
</html>
2️⃣ Ingress를 활용하여 도메인 기반 라우팅 적용
❓ 문제 상황
운영팀에서 하나의 LoadBalancer를 여러 서비스가 공유할 수 있도록 Ingress를 설정해야 합니다.
/app1 요청은 app1 서비스로, /app2 요청은 app2 서비스로 전달되도록 해야 합니다.
• 도메인: example.com
• /app1 → app1-service
• /app2 → app2-service
✅ 어떻게 해결할 수 있을까요?
🛠️ 해결 방법
1. Ingress 리소스를 생성하여 요청을 올바른 서비스로 전달하도록 설정합니다.
2. kubectl을 사용하여 Ingress가 정상적으로 동작하는지 확인합니다.
✅ 정답 Manifest (Ingress 생성 - 도메인 기반 라우팅 적용)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-ingress
spec:
rules:
- host: example.com # 도메인 지정
http:
paths:
- path: /app1
pathType: Prefix
backend:
service:
name: app1-service
port:
number: 80
- path: /app2
pathType: Prefix
backend:
service:
name: app2-service
port:
number: 80
📌 적용 후 예상 결과 값
1. Ingress 리소스 확인
kubectl get ingress
💡 예상 출력 값
NAME CLASS HOSTS ADDRESS PORTS AGE
web-ingress nginx example.com 192.168.1.100 80 5s
2. 도메인 기반 라우팅 테스트
curl -H "Host: example.com" http://192.168.1.100/app1
💡 예상 출력 값
Welcome to App1!
curl -H "Host: example.com" http://192.168.1.100/app2
💡 예상 출력 값
Welcome to App2!
3️⃣ Ingress TLS 설정을 통한 HTTPS 적용
❓ 문제 상황
운영팀에서 보안 강화를 위해 HTTPS를 적용해야 합니다.
Ingress에 TLS 인증서를 설정하여 HTTPS 트래픽을 지원해야 합니다.
• TLS 인증서 Secret 이름: web-tls
• HTTPS 포트로만 접속 가능해야 함
✅ 어떻게 해결할 수 있을까요?
🛠️ 해결 방법
1. TLS 인증서를 Secret으로 생성합니다.
2. Ingress 리소스에서 TLS를 적용합니다.
✅ 정답 Manifest (Ingress에 TLS 적용)
🔹 TLS 인증서 Secret 생성
kubectl create secret tls web-tls --cert=cert.pem --key=key.pem
🔹 Ingress 리소스에서 TLS 적용
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-ingress-tls
spec:
tls:
- hosts:
- example.com
secretName: web-tls # 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
web-ingress-tls nginx example.com 192.168.1.100 80, 443 5s
2. HTTPS 요청 테스트
curl -k https://example.com
💡 예상 출력 값
Welcome to Secure Web!