쿠버네티스(Kubernetes)에서 **서비스(Service)**는 클러스터 내에서 실행되는 파드(Pod)들 간의 네트워크 통신을 안정적으로 제공하는 핵심 기능입니다. 쿠버네티스에서는 파드가 지속적으로 생성되고 삭제되며, 재배포될 때마다 IP가 변경될 수 있습니다. 이처럼 동적으로 변하는 파드들과 안정적인 네트워크 연결을 유지하는 것이 서비스의 역할입니다.
이 글에서는 쿠버네티스 서비스의 개념, 유형, 동작 방식, 그리고 실전 예제까지 자세히 설명합니다.
📌 목차
- 쿠버네티스 서비스란?
- 서비스가 필요한 이유
- 쿠버네티스 서비스의 주요 유형
- ClusterIP
- NodePort
- LoadBalancer
- ExternalName
- 서비스와 셀렉터(Selector)
- 서비스의 네트워크 동작 방식
- 서비스 생성 및 관리 (실전 예제)
- 결론
1. 쿠버네티스 서비스란?
**서비스(Service)**는 쿠버네티스에서 네트워크 내에서 여러 개의 파드를 하나의 논리적인 엔드포인트로 묶어주는 기능을 합니다.
✅ 서비스의 주요 역할
- 클러스터 내에서 파드 간 네트워크 통신을 안정적으로 유지.
- 특정 파드가 종료되고 새로운 파드가 생성되더라도 일관된 네트워크 주소 제공.
- 로드 밸런싱 기능을 수행하여 여러 개의 파드에 트래픽을 분배.
💡 한마디로?
➡️ 파드의 IP 변경에도 불구하고, 서비스는 지속적인 접근점을 유지하는 가상 IP 역할을 수행합니다.
2. 서비스가 필요한 이유
쿠버네티스에서 파드는 다음과 같은 이유로 네트워크 통신이 어렵습니다.
🔹 1) 파드는 동적으로 생성 및 삭제됨
- 쿠버네티스에서 파드는 컨트롤러(Deployment, ReplicaSet 등)에 의해 자동으로 생성 및 삭제됩니다.
- 새로운 파드가 생성될 때마다 IP 주소가 변경될 수 있습니다.
🔹 2) 파드 간 직접 통신이 어렵다
- 각 노드에 배포된 파드는 클러스터 네트워크를 통해 통신해야 하지만, 특정 파드의 IP를 알기 어렵습니다.
🔹 3) 로드 밸런싱이 필요
- 여러 개의 파드가 동일한 애플리케이션을 실행하는 경우, 트래픽을 분산하는 기능이 필요합니다.
✅ 해결책: 서비스를 사용하여 특정 파드에 관계없이 일관된 네트워크 엔드포인트를 제공!
3. 쿠버네티스 서비스의 주요 유형
쿠버네티스에서 서비스는 네트워크 접근 방식에 따라 네 가지 유형으로 구분됩니다.
서비스 유형 | 설명 |
---|---|
ClusterIP | 기본 설정, 클러스터 내부에서만 접근 가능 |
NodePort | 각 노드의 특정 포트를 개방하여 외부에서 접근 가능 |
LoadBalancer | 클라우드 환경에서 외부 로드 밸런서를 통해 접근 가능 |
ExternalName | 클러스터 외부의 DNS 이름을 서비스로 매핑 |
🔹 1) ClusterIP (기본 서비스 유형)
✅ 설명
- 클러스터 내부에서만 접근 가능 (
kubectl port-forward
로 외부에서도 테스트 가능). - 외부에서는 접근할 수 없고, 내부 애플리케이션 간의 통신에 주로 사용됨.
✅ 사용 사례
- 마이크로서비스 간 내부 통신 (예: 프론트엔드 → 백엔드 API 호출).
✅ YAML 예제
<yaml>apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 8080
port: 80
→ 서비스가 클러스터 내부에서 노출하는 포트.targetPort: 8080
→ 실제 파드에서 실행되는 포트.
<bash>kubectl apply -f my-service.yaml
kubectl get svc
🔹 2) NodePort (외부 접근 가능)
✅ 설명
- 각 노드의 특정 포트를 개방하여 클러스터 외부에서도 접근 가능.
- 기본적으로 30000~32767 범위의 포트를 사용.
✅ 사용 사례
- 개발 및 테스트 환경에서 간단한 외부 접근이 필요할 때.
✅ YAML 예제
<yaml>apiVersion: v1
kind: Service
metadata:
name: my-nodeport-service
spec:
type: NodePort
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 8080
nodePort: 30007 # 노드에서 열리는 포트
<bash>kubectl apply -f my-nodeport-service.yaml
kubectl get svc
🌍 접속 방법http://<노드IP>:30007
🔹 3) LoadBalancer (클라우드 환경에서 사용)
✅ 설명
- 클라우드 환경(AWS, GCP, Azure 등)에서 외부 로드 밸런서를 자동 생성.
- NodePort와 함께 작동하여 외부 트래픽을 클러스터 내부로 라우팅.
✅ 사용 사례
- 프로덕션 환경에서 외부 사용자가 애플리케이션에 접근할 때.
✅ YAML 예제
<yaml>apiVersion: v1
kind: Service
metadata:
name: my-loadbalancer-service
spec:
type: LoadBalancer
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 8080
<bash>kubectl apply -f my-loadbalancer-service.yaml
kubectl get svc
🔗 접속 방법
쿠버네티스가 할당한 공인 IP를 통해 외부에서 접근 가능.
🔹 4) ExternalName (외부 DNS 서비스와 연동)
✅ 설명
- 내부에서 특정 **외부 서비스(DNS 주소)**를 가리킬 때 사용.
✅ 사용 사례
- 내부 애플리케이션이 외부 API(예:
example.com
)를 서비스처럼 사용.
✅ YAML 예제
<yaml>apiVersion: v1
kind: Service
metadata:
name: external-service
spec:
type: ExternalName
externalName: example.com
4. 서비스와 셀렉터(Selector)
✅ 서비스는 특정 파드와 연결되어야 하며, selector
를 사용하여 이를 정의.
<yaml>spec:
selector:
app: my-app
selector
가 있는 경우, 일치하는 레이블을 가진 파드들이 서비스에 연결.selector
없이도 서비스 생성 가능하지만, 수동으로 엔드포인트를 지정해야 함.
5. 서비스의 네트워크 동작 방식
쿠버네티스 서비스는 내부적으로 kube-proxy를 사용하여 파드 간 통신을 관리합니다.
- 클러스터 내에서 DNS를 통해 서비스명을 사용하여 통신 가능 (
my-service.default.svc.cluster.local
). iptables
또는IPVS
를 사용하여 로드 밸런싱 수행.
6. 서비스 생성 및 관리 (실전 예제)
<bash># 서비스 목록 조회
kubectl get services
# 특정 서비스 상세 정보
kubectl describe service my-service
# 서비스 삭제
kubectl delete service my-service
7. 결론
쿠버네티스 서비스는 파드 간 안정적인 통신을 보장하는 중요한 역할을 합니다.
✅ 서비스 유형 정리
- ClusterIP: 클러스터 내부에서만 접근 가능.
- NodePort: 외부에서 특정 노드 포트를 통해 접근 가능.
- LoadBalancer: 클라우드 환경에서 외부 로드 밸런싱 지원.
- ExternalName: 외부 DNS 서비스를 내부 서비스로 매핑.
📌 쿠버네티스에서 네트워크를 효과적으로 관리하려면, 서비스 개념을 확실히 이해하고 적절한 유형을 선택하는 것이 중요합니다! 🚀