문서 목차
QKS · Networking
Services
Service 는 파드 집합을 안정적인 네트워크 엔드포인트로 노출하는 Kubernetes 오브젝트입니다. 파드는 재시작될 때마다 IP 주소가 변경되지만, Service는 고정된 ClusterIP와 DNS 이름을 제공하여 안정적인 통신을 가능하게 합니다.
QUANTUM C&S
개요
Service는 파드 집합을 안정적인 네트워크 엔드포인트로 노출하는 Kubernetes 오브젝트입니다. 파드는 재시작될 때마다 IP 주소가 변경되지만, Service는 고정된 ClusterIP와 DNS 이름을 제공하여 안정적인 통신을 가능하게 합니다.
QKS 콘솔에서 Service 확인
- 왼쪽 메뉴에서 Networking > Services를 선택합니다.
- 네임스페이스를 선택하면 Service 목록이 표시됩니다.
목록에서 확인할 수 있는 정보:
- 이름: Service 이름
- 타입: ClusterIP / NodePort / LoadBalancer
- ClusterIP: 클러스터 내부 IP
- 외부 IP: LoadBalancer 타입의 경우 외부에서 접근 가능한 IP
- 포트: 노출된 포트 번호
Service 타입
ClusterIP (기본값)
클러스터 내부에서만 접근 가능한 가상 IP를 Service에 부여합니다. 외부에서는 직접 접근할 수 없으며, 클러스터 내 다른 파드끼리 통신할 때 사용합니다.
spec:
type: ClusterIP
selector:
app: my-app
ports:
- port: 80 # Service 포트
targetPort: 8080 # 파드 포트
내부 DNS: my-service.my-namespace.svc.cluster.local
NodePort
각 노드의 특정 포트를 통해 외부에서 Service에 접근할 수 있습니다. 포트 범위는 30000~32767입니다.
spec:
type: NodePort
selector:
app: my-app
ports:
- port: 80
targetPort: 8080
nodePort: 30080 # 명시적 지정 (생략 시 자동 할당)
접근 방법: http://<node-ip>:30080
LoadBalancer
외부 로드 밸런서를 프로비저닝하고 고정 외부 IP를 Service에 할당합니다. 외부 트래픽을 클러스터 안으로 가져오는 가장 일반적인 방법입니다.
spec:
type: LoadBalancer
selector:
app: my-app
ports:
- port: 80
targetPort: 8080
LoadBalancer IP는 할당 후 Service의 EXTERNAL-IP 필드에서 확인할 수 있습니다.
kubectl로 관리
# Service 목록
kubectl get services -n <namespace>
# Service 상세 정보 (Endpoints 포함)
kubectl describe service <name> -n <namespace>
# Endpoints 확인 (실제 파드 IP 목록)
kubectl get endpoints <name> -n <namespace>
# Service 생성
kubectl apply -f service.yaml
# Service 삭제
kubectl delete service <name> -n <namespace>
Service YAML 전체 예시
apiVersion: v1
kind: Service
metadata:
name: my-app-service
namespace: production
labels:
app: my-app
spec:
type: LoadBalancer
selector:
app: my-app # 이 라벨을 가진 파드로 트래픽 전달
ports:
- name: http
protocol: TCP
port: 80 # Service 포트 (외부 또는 내부에서 접근하는 포트)
targetPort: 8080 # 파드가 실제로 리스닝하는 포트
트러블슈팅
Service에 접근이 안 되는 경우
# 1. Service가 실제 파드와 연결되어 있는지 확인
kubectl get endpoints <service-name> -n <namespace>
# ENDPOINTS가 <none>이면 selector 라벨 불일치 확인
# 2. 파드의 라벨 확인
kubectl get pods -n <namespace> --show-labels
# 3. 파드가 정상 실행 중인지 확인
kubectl get pods -n <namespace>
Endpoints가 비어 있다면 Service의 selector와 파드의 labels가 일치하지 않는 경우가 대부분입니다.