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 변경에도 안정적인 네트워크 연결을 유지할 수 있습니다!
🔥 로드 밸런싱을 통해 트래픽을 자동으로 분산할 수 있습니다!
'Kubernetes > Kubernetes Basics' 카테고리의 다른 글
📌 Kubernetes Helm: 애플리케이션 배포 자동화하기 (0) | 2025.03.03 |
---|---|
📌 Kubernetes Ingress: 도메인 기반 트래픽 관리 이해하기 (0) | 2025.03.03 |
📌 Kubernetes 아키텍처 완벽 분석: Master Node와 Worker Node의 역할 (0) | 2025.03.02 |
📌 Kubernetes 핵심 개념: Pod, Node, Cluster 에 대한 이해 (0) | 2025.03.02 |
📌 Monolithic vs. Microservices: Kubernetes가 왜 마이크로서비스와 잘 맞을까? (0) | 2025.03.02 |