Kubernetes/Kubernetes Best Practices

[Scenario Playbook Ep.11] 🚀 Service 편 #2 | LoadBalancer & ExternalName 서비스

ygtoken 2025. 3. 16. 14:19
728x90

 

쿠버네티스에서 외부 트래픽을 효과적으로 관리하는 방법은 중요합니다.

이번 글에서는 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
728x90