updated_at: 2025-06-19 15:42

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
평점을 남겨주세요
평점 : 2.5
총 투표수 : 1

질문 및 답글