Service
k8s에 다양한 어플리케이션을 올리고 어플리케이션간 통신이 필요한 경우에 Service를 오픈하여 외부에 오픈하거나 다른 어플레케이션 간 통신에 활용할 수 있습니다.
서비스는 지정된 IP로 생성이 가능하고, 여러 Pod를 묶어서 로드밸런싱이 가능하며, 고유한 DNS 이름을 가질 수 있습니다.
- Pod의 IP는 동적이라 재시작 시 바뀔 수 있음 → 직접 접근 어려움
- Service는 Pod 앞단에 고정된 가상 IP를 만들어 일관된 접근 방식을 제공
- label selector를 기반으로 어떤 Pod에 요청을 보낼지 결정
Kubernetes Service 타입 요약표
타입 | 접근 범위 | 외부 노출 | 설명 |
---|---|---|---|
ClusterIP (기본) | 클러스터 내부 | ❌ 없음 | >클러스터 내부에서만 접근 가능. 내부 서비스 통신에 사용됨. |
NodePort | 클러스터 외부 가능 | ✅ 노드 IP+포트 | 클러스터의 노드 IP와 포트를 통해 외부 접근 가능. 포트는 30000~32767 범위. |
LoadBalancer | 클라우드 외부 공개용 | ✅ 퍼블릭 IP | 클라우드 로드밸런서를 통해 외부 접근. NodePort 포함된 상위 타입. |
ExternalName | 클러스터 외부 서비스 | ✅ DNS 사용 | 외부 DNS 이름으로 리다이렉트. 실제 Pod은 없음. |
Headless | 클러스터 내부 | ❌ 없음 | DNS 레코드만 제공하며 로드밸런싱 없이 직접 Pod에 연결됨. |
주요 필드 설명
필드명 | 설명 |
---|---|
selector | 라벨을 기준으로 연결할 Pod을 지정 |
port | 클라이언트가 요청하는 포트 |
targetPort | 실제 컨테이너가 사용하는 포트 |
nodePort | (NodePort/LoadBalancer용) 노드 외부에서 열리는 고정 포트 |
type | 서비스 타입 (ClusterIP, NodePort, LoadBalancer 등) |
서비스 타입별 예시 정리
서비스 타입 | 서비스 이름 | 외부 접근 방법 |
---|---|---|
ClusterIP | my-service | 내부 DNS: my-service.default.svc.cluster.local |
NodePort | my-service | http://<노드IP>:30080 |
LoadBalancer | my-lb-service | 클라우드 제공 외부 IP |
ExternalName | external-service | DNS 요청시 example.com 으로 리디렉션 |
Headless | headless-service | 각 Pod 개별 IP로 직접 연결 (로드밸런싱 없음) |
예시
기본예시
클러스터 내 다른 Pod나 서비스가 my-service:80으로 접근 가능
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: my-app # 이 라벨을 가진 Pod들 대상으로
ports:
- protocol: TCP
port: 80 # 서비스의 포트
targetPort: 8080 # 실제 Pod 컨테이너의 포트
type: ClusterIP
ports:
- name: http
protocol: TCP
port: 80 # 서비스의 포트
targetPort: 8080 # 실제 Pod 컨테이너의 포트
- name: https
protocol: TCP
port: 443
targetPort:4300
NodePort 예시
클러스터 외부에서 [노드IP]:30080 으로 접속 가능
(노드 IP는 클러스터를 구성하는 서버의 IP)
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 8080
nodePort: 30080
type: NodePort
LoadBalancer 예시 (클라우드 환경용)
AWS, GCP, Azure 같은 클라우드 환경에서는 외부 IP가 자동으로 할당됨
apiVersion: v1
kind: Service
metadata:
name: my-lb-service
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: LoadBalancer
ExternalName 예시
external-service.default.svc.cluster.local 로 DNS 요청하면 example.com으로 리다이렉트됨
apiVersion: v1
kind: Service
metadata:
name: external-service
spec:
type: ExternalName
externalName: example.com