쿠버네티스에서 외부 트래픽을 효과적으로 관리하는 방법은 중요합니다.
이번 글에서는 LoadBalancer 서비스를 활용하여 외부 트래픽을 노드로 전달하는 방법과
ExternalName 서비스를 활용하여 외부 도메인을 내부에서 사용할 수 있도록 설정하는 방법을 다룹니다.
📌 글에서 다루는 상황들
1️⃣ LoadBalancer 서비스를 활용한 외부 트래픽 처리
2️⃣ ExternalName 서비스를 활용한 외부 도메인 연결
각 문제를 실무에서 바로 활용할 수 있도록 Manifest 템플릿과 예상 결과 값을 제공합니다.
1️⃣ LoadBalancer 서비스를 활용한 외부 트래픽 처리
❓ 문제 상황
운영팀에서 클러스터 외부에서 접근 가능한 웹 애플리케이션을 배포해야 합니다.
이 애플리케이션은 고정된 외부 IP를 가지고 있어야 하며, 부하 분산을 지원해야 합니다.
• Deployment의 이름은 web-loadbalancer이어야 합니다.
• 서비스 이름은 web-loadbalancer-service이어야 하며, LoadBalancer를 사용하여 외부에서 접근 가능해야 합니다.
• 고정된 외부 IP를 할당하여 클러스터 외부에서 접속 가능해야 합니다.
✅ 어떻게 해결할 수 있을까요?
🛠️ 해결 방법
1. LoadBalancer 타입의 Service를 생성하여 외부 접근을 허용해야 합니다.
• type: LoadBalancer를 설정하여 클라우드 환경에서 외부 IP를 자동 할당
• Kubernetes 클러스터 외부에서 접속 가능
2. 트래픽을 특정 Deployment에 전달할 수 있도록 설정해야 합니다.
• selector를 사용하여 app: web-loadbalancer 레이블을 가진 Pod을 대상으로 설정
✅ 정답 Manifest (LoadBalancer 서비스 적용된 Deployment & Service)
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-loadbalancer # Deployment의 이름
spec:
replicas: 2 # 실행할 Pod 개수
selector:
matchLabels:
app: web-loadbalancer
template:
metadata:
labels:
app: web-loadbalancer
spec:
containers:
- name: nginx
image: nginx:latest # 웹 애플리케이션 컨테이너
ports:
- containerPort: 80 # 컨테이너 내부 포트
---
apiVersion: v1
kind: Service
metadata:
name: web-loadbalancer-service # LoadBalancer 서비스 이름
spec:
selector:
app: web-loadbalancer # 레이블이 일치하는 Pod 대상으로 트래픽 전달
ports:
- protocol: TCP
port: 80 # 서비스 포트
targetPort: 80 # Pod 내부 컨테이너 포트
type: LoadBalancer # 외부에서 접근 가능하도록 설정
📌 적용 후 예상 결과 값
1. Service 생성 확인
kubectl get svc
💡 예상 출력 값
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
web-loadbalancer-service LoadBalancer 10.100.200.3 203.0.113.50 80:32080/TCP 5s
2. 외부에서 서비스 접근 테스트
curl http://203.0.113.50
💡 예상 출력 값
<!DOCTYPE html>
<html>
<head><title>Welcome to nginx!</title></head>
<body>
<h1>Welcome to nginx!</h1>
</body>
</html>
2️⃣ ExternalName 서비스를 활용한 외부 도메인 연결
❓ 문제 상황
운영팀에서 쿠버네티스 내부에서 외부의 특정 도메인에 접속해야 하는 상황이 발생했습니다.
애플리케이션이 외부 데이터베이스 서버(db.external.com)를 사용해야 하지만, 내부 DNS를 통해 접근해야 합니다.
• 서비스 이름은 external-db-service이어야 합니다.
• db.external.com 도메인을 내부 DNS로 등록해야 합니다.
• 내부에서 external-db-service.default.svc.cluster.local 도메인으로 접속할 수 있어야 합니다.
✅ 어떻게 해결할 수 있을까요?
🛠️ 해결 방법
1. ExternalName 타입의 Service를 생성하여 외부 도메인을 내부 DNS로 등록해야 합니다.
• type: ExternalName을 설정하여 특정 도메인(db.external.com)을 쿠버네티스 내부에서 사용할 수 있도록 구성
2. 애플리케이션이 external-db-service.default.svc.cluster.local을 사용하도록 설정해야 합니다.
✅ 정답 Manifest (ExternalName 서비스 적용된 Service)
apiVersion: v1
kind: Service
metadata:
name: external-db-service # ExternalName 서비스 이름
spec:
type: ExternalName # 외부 도메인과 연결
externalName: db.external.com # 외부 데이터베이스 도메인
📌 적용 후 예상 결과 값
1. Service 생성 확인
kubectl get svc
💡 예상 출력 값
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
external-db-service ExternalName <none> db.external.com <none> 5s
2. 내부에서 외부 도메인 접근 테스트
nslookup external-db-service.default.svc.cluster.local
💡 예상 출력 값
Server: 10.96.0.10
Address: 10.96.0.10#53
Name: external-db-service.default.svc.cluster.local
Address: 203.0.113.100