Kubernetes/Kubernetes Basics

📌 Kubernetes Service: 로드 밸런싱과 네트워크 설정 이해하기

ygtoken 2025. 3. 3. 07:15
728x90

 

1️⃣ Kubernetes에서 Service가 필요한 이유?

 

Kubernetes에서 Pod는 동적으로 생성 및 삭제됩니다.

즉, Pod의 IP 주소는 변경될 수 있기 때문에, 클라이언트가 특정 Pod에 직접 접근하는 것은 어렵습니다.

 

“어떤 Pod가 살아 있는지 모르는데, 어떻게 네트워크 통신을 할 수 있을까?” 🤔

 

이 문제를 해결하기 위해 Kubernetes는 “Service”라는 개념을 제공합니다.

✅ Service를 사용하면 Pod의 IP가 변하더라도, 항상 동일한 방식으로 접근할 수 있습니다.

 


 

2️⃣ Kubernetes에서 Service란?

 

Kubernetes의 Service는 여러 개의 Pod를 하나의 네트워크 엔드포인트로 묶어주는 역할을 합니다.

즉, Service는 특정 Label을 가진 Pod로 트래픽을 라우팅하는 네트워크 엔티티입니다.

 

📌 Service 개념도

사용자 요청 ➡ Service (고정 IP) ➡ 여러 개의 Pod로 트래픽 분배

Pod의 IP가 변경되어도 Service는 항상 동일한 방식으로 접근 가능

로드 밸런싱을 통해 트래픽을 여러 Pod로 분산 가능

 


 

3️⃣ Kubernetes Service의 주요 타입

 

Kubernetes에서 제공하는 Service의 타입은 크게 4가지가 있습니다.

Service 타입설명

ClusterIP 클러스터 내부에서만 접근 가능 (기본값)
NodePort 외부에서 접근 가능 (각 Node의 고정 포트 할당)
LoadBalancer 클라우드 환경에서 L4 로드 밸런서 사용
ExternalName DNS CNAME을 반환하여 외부 서비스를 가리킴

이제 각각의 Service 타입을 자세히 살펴보겠습니다.

 


 

4️⃣ ClusterIP: 클러스터 내부 서비스

 

📌 ClusterIP는 기본적으로 클러스터 내부에서만 접근 가능한 서비스입니다.

📌 클러스터 내부의 다른 Pod만 이 서비스를 사용할 수 있습니다.

 

✅ ClusterIP 예제 (clusterip-service.yaml)

apiVersion: v1
kind: Service
metadata:
  name: my-clusterip-service
spec:
  selector:
    app: my-app  # 이 Label을 가진 Pod로 트래픽 전달
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080
  type: ClusterIP  # 기본값 (클러스터 내부에서만 접근 가능)

 

📌 배포 명령어

kubectl apply -f clusterip-service.yaml

 

📌 클러스터 내부에서만 접근 가능

kubectl exec -it <pod-name> -- curl http://my-clusterip-service:80

클러스터 내부에서만 접근 가능하며, 외부에서는 접근 불가능!

 


 

5️⃣ NodePort: 외부에서 접근 가능 (고정 포트 할당)

 

📌 NodePort는 클러스터 외부에서도 접근할 수 있도록 노드의 고정 포트를 열어줍니다.

📌 기본적으로 30000~32767 범위의 포트가 할당됩니다.

 

✅ NodePort 예제 (nodeport-service.yaml)

apiVersion: v1
kind: Service
metadata:
  name: my-nodeport-service
spec:
  selector:
    app: my-app
  ports:
  - protocol: TCP
    port: 80       # Service 내부 포트
    targetPort: 8080 # Pod 내부 컨테이너 포트
    nodePort: 30080 # Node의 고정 포트
  type: NodePort

📌 배포 명령어

kubectl apply -f nodeport-service.yaml

📌 외부에서 접근 가능

curl http://<Node IP>:30080

각 Node의 <Node IP>:30080 주소로 외부에서 접근 가능!

 


 

6️⃣ LoadBalancer: 클라우드 로드 밸런서 사용

 

📌 LoadBalancer는 클라우드 환경(AWS, GCP, Azure)에서 L4 로드 밸런서를 사용합니다.

📌 클라우드에서 퍼블릭 IP를 할당하고, 외부에서 직접 접근 가능하게 해줍니다.

 

✅ LoadBalancer 예제 (loadbalancer-service.yaml)

apiVersion: v1
kind: Service
metadata:
  name: my-loadbalancer-service
spec:
  selector:
    app: my-app
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080
  type: LoadBalancer

📌 배포 명령어

kubectl apply -f loadbalancer-service.yaml

📌 퍼블릭 IP 확인

kubectl get svc my-loadbalancer-service

클라우드에서 로드 밸런서를 자동으로 생성하고, 외부에서도 접근 가능!

 


 

7️⃣ ExternalName: 외부 DNS 서비스 사용

 

📌 ExternalName은 Kubernetes 내부에서 외부 서비스를 가리킬 때 사용됩니다.

📌 특정 도메인(CNAME 레코드)을 반환하는 역할을 합니다.

 

✅ ExternalName 예제 (externalname-service.yaml)

apiVersion: v1
kind: Service
metadata:
  name: my-external-service
spec:
  type: ExternalName
  externalName: example.com

📌 내부에서 example.com을 사용할 수 있도록 설정

kubectl apply -f externalname-service.yaml

클러스터 내부에서 my-external-service를 호출하면 example.com으로 리다이렉트됨!

 


 

8️⃣ Service의 네트워크 통신 방식

 

📌 Kubernetes에서 Service는 kube-proxy를 통해 네트워크 라우팅을 수행합니다.

📌 클러스터 내부에서 IP 기반으로 트래픽을 라우팅하는 방식입니다.

 

Service를 통한 트래픽 흐름

사용자 요청 ➡ Service ➡ 여러 개의 Pod 중 하나로 트래픽 전달

Kubernetes는 내부적으로 iptables 또는 IPVS를 사용하여 로드 밸런싱 수행

 


 

📌 결론: Kubernetes Service의 핵심 요약

Service 타입설명사용 사례

ClusterIP 클러스터 내부에서만 접근 가능 내부 서비스 간 통신
NodePort 외부에서 접근 가능 (Node의 특정 포트) 개발 및 테스트 환경
LoadBalancer 클라우드 L4 로드 밸런서 사용 프로덕션 환경
ExternalName 외부 DNS 서비스로 연결 외부 API 연동

🔥 Kubernetes Service를 사용하면 Pod의 IP 변경에도 안정적인 네트워크 연결을 유지할 수 있습니다!

🔥 로드 밸런싱을 통해 트래픽을 자동으로 분산할 수 있습니다!

 

 

728x90