본문으로 건너뛰기

5.1. Services (서비스)

개요

Services 페이지는 MCM 컨트롤 플레인에서 관리하는 모든 Service를 통합적으로 관리하는 페이지입니다. Service는 파드 집합에 대한 안정적인 네트워크 엔드포인트를 제공하는 Kubernetes 리소스입니다.

주요 목적:

  • 멀티클러스터 Service 통합 관리
  • 애플리케이션 간 네트워크 통신 설정
  • 서비스 디스커버리 및 로드 밸런싱
  • PropagationPolicy를 통한 Service 배포

Service 사용 사례:

  • 파드 간 내부 통신 (ClusterIP)
  • 외부 트래픽 노출 (NodePort, LoadBalancer)
  • 외부 서비스 연결 (ExternalName)
  • 마이크로서비스 아키텍처 구성

화면 구성

Services 페이지는 테이블 형태로 Service 목록을 표시합니다.

Services 메인 화면

페이지 상단 요소

요소설명
네임스페이스 필터특정 네임스페이스의 Service만 표시
새로고침 버튼Service 목록 갱신
생성 버튼새 Service 생성 다이얼로그 열기
검색창Service 이름으로 검색

테이블 컬럼

컬럼설명정렬
이름Service 이름
네임스페이스Service가 속한 네임스페이스
타입Service 타입 (ClusterIP/NodePort/LoadBalancer/ExternalName)
클러스터 IPService에 할당된 클러스터 내부 IP
포트포트 매핑 (예: 80→80/TCP)
경과시간Service 생성 후 경과 시간
작업편집/삭제 버튼-

Service 타입

타입설명
ClusterIP클러스터 내부 IP로만 접근 가능 (기본값)
NodePort각 노드의 고정 포트로 외부 접근 가능
LoadBalancer클라우드 로드 밸런서를 통한 외부 접근
ExternalName외부 DNS 이름으로 매핑

포트 표시

포트 컬럼은 Service의 포트 매핑을 표시합니다:

  • 형식: [포트]→[타겟포트]/[프로토콜]
  • 예: 80→80/TCP - Service 포트 80이 파드의 포트 80으로 연결, TCP 프로토콜

Service 상세 정보

Service 행을 클릭하면 상세 정보 패널이 열립니다.

Service 상세 정보

상세 패널 헤더

요소설명
Service 이름선택한 Service 이름
네임스페이스Service가 속한 네임스페이스
타입Service 타입 (예: ClusterIP)

액션 버튼

버튼기능
새로고침Service 정보 갱신
편집YAML 편집 모드
삭제Service 삭제

탭 메뉴

개요 탭

Service의 기본 정보, 셀렉터, 포트 정보를 표시합니다.

기본 정보:

항목설명
이름Service 이름
네임스페이스Service가 속한 네임스페이스
타입Service 타입
클러스터 IP할당된 클러스터 내부 IP
호스트 이름Service의 DNS 이름 (예: my-service.namespace.svc.cluster.local)
경과시간생성 후 경과 시간
생성일Service 생성 일시
세션 어피니티세션 고정 설정 (None/ClientIP)

셀렉터:

Service가 트래픽을 전달할 파드를 선택하는 레이블 셀렉터를 표시합니다:

  • 검색 기능으로 레이블 필터링
  • 복사 버튼으로 레이블 복사

포트:

Service에 정의된 포트 매핑을 테이블로 표시합니다:

컬럼설명
이름포트 이름 (선택 사항)
프로토콜통신 프로토콜 (TCP/UDP)
포트Service가 노출하는 포트
타겟 포트파드의 실제 포트

엔드포인트 탭

Service에 연결된 엔드포인트 정보를 표시합니다.

엔드포인트 탭

내부 엔드포인트:

클러스터 내부에서 접근 가능한 엔드포인트를 표시합니다:

  • DNS 이름: [service-name].[namespace]
  • 포트 정보: [포트]/[프로토콜]

외부 엔드포인트:

외부에서 접근 가능한 엔드포인트를 표시합니다:

  • NodePort 또는 LoadBalancer 타입인 경우 표시
  • 외부 IP 및 포트 정보
  • 엔드포인트가 없으면 "외부 엔드포인트가 없습니다" 메시지 표시

멀티클러스터 정책 탭

Service에 적용된 멀티 클러스터 정책 정보를 표시합니다.

멀티클러스터 정책 탭

전파 정책 (PropagationPolicy):

컬럼설명
이름PropagationPolicy 이름
네임스페이스정책이 속한 네임스페이스
범위네임스페이스 범위 정책 / 클러스터 범위 정책
대상 클러스터타겟 클러스터 목록

오버라이드 정책 (OverridePolicy):

클러스터별 커스텀 설정이 있는 경우 표시됩니다.

레이블 탭

Service에 적용된 Kubernetes 레이블 목록을 표시합니다.

어노테이션 탭

Service에 적용된 어노테이션 목록을 표시합니다.

이벤트 탭

Service 관련 Kubernetes 이벤트를 표시합니다.

Service 생성

새로운 Service를 MCM 컨트롤 플레인에 생성합니다.

입력 항목

항목필수설명
이름Service 이름
네임스페이스배포할 네임스페이스
타입Service 타입 선택
셀렉터대상 파드 선택 레이블
포트포트 매핑 설정

Service 타입별 생성

ClusterIP (기본값):

apiVersion: v1
kind: Service
metadata:
name: my-service
namespace: default
spec:
type: ClusterIP
selector:
app: my-app
ports:
- port: 80
targetPort: 8080
protocol: TCP

NodePort:

apiVersion: v1
kind: Service
metadata:
name: my-nodeport-service
namespace: default
spec:
type: NodePort
selector:
app: my-app
ports:
- port: 80
targetPort: 8080
nodePort: 30080 # 30000-32767 범위
protocol: TCP

LoadBalancer:

apiVersion: v1
kind: Service
metadata:
name: my-loadbalancer-service
namespace: default
spec:
type: LoadBalancer
selector:
app: my-app
ports:
- port: 80
targetPort: 8080
protocol: TCP

ExternalName:

apiVersion: v1
kind: Service
metadata:
name: my-external-service
namespace: default
spec:
type: ExternalName
externalName: external.example.com

YAML 편집

"YAML 편집" 탭에서 Service 정의를 직접 작성할 수 있습니다.

Service 작업

Service 편집

  1. Service 선택
  2. 상세 패널에서 "편집" 버튼 클릭
  3. YAML 에디터에서 Service 정의 수정
  4. "저장" 버튼 클릭

참고: Service를 수정하면 연결된 파드에 즉시 반영됩니다.

Service 삭제

⚠️ 주의: Service를 삭제하면 해당 서비스로의 네트워크 접근이 불가능해집니다. 의존하는 애플리케이션을 확인하세요.

  1. 삭제할 Service 선택
  2. 상세 패널에서 "삭제" 버튼 클릭
  3. 확인 다이얼로그에서 Service 이름 입력
  4. "삭제" 버튼 클릭

사용 예시

시나리오 1: 내부 통신용 ClusterIP Service 생성

  1. "생성" 버튼 클릭
  2. Service 정보 입력:
    • 이름: backend-service
    • 네임스페이스: production
    • 타입: ClusterIP
    • 셀렉터: app=backend
    • 포트: 80 → 8080/TCP
  3. "생성" 버튼 클릭
  4. PropagationPolicy로 타겟 클러스터 지정
  5. Frontend에서 backend-service.production.svc.cluster.local:80으로 접근

시나리오 2: 외부 노출용 LoadBalancer Service 생성

  1. "생성" 버튼 클릭 → YAML 편집 탭 선택
  2. 다음 YAML 작성:
    apiVersion: v1
    kind: Service
    metadata:
    name: web-service
    namespace: web
    spec:
    type: LoadBalancer
    selector:
    app: web-frontend
    ports:
    - port: 80
    targetPort: 3000
  3. "생성" 버튼 클릭
  4. 엔드포인트 탭에서 외부 IP 확인
  5. 외부 IP로 서비스 접근

시나리오 3: Service 엔드포인트 확인

  1. Service 목록에서 확인할 Service 클릭
  2. 엔드포인트 탭 선택
  3. 내부 엔드포인트에서 DNS 이름 확인
  4. 외부 엔드포인트에서 외부 접근 정보 확인 (해당되는 경우)

시나리오 4: 멀티클러스터 Service 배포

  1. Service 생성
  2. PropagationPolicy 생성:
    • 리소스 셀렉터: Service 지정
    • 타겟 클러스터: 배포할 클러스터 선택
  3. 상세 패널에서 "멀티클러스터 정책" 탭 확인
  4. 대상 클러스터에 Service가 배포되었는지 확인

시나리오 5: 다중 포트 Service 구성

  1. "생성" 버튼 클릭 → YAML 편집 탭 선택
  2. 다음 YAML 작성:
    apiVersion: v1
    kind: Service
    metadata:
    name: multi-port-service
    namespace: default
    spec:
    type: ClusterIP
    selector:
    app: my-app
    ports:
    - name: http
    port: 80
    targetPort: 8080
    - name: https
    port: 443
    targetPort: 8443
    - name: metrics
    port: 9090
    targetPort: 9090
  3. "생성" 버튼 클릭
  4. 각 포트로 다른 트래픽 타입 처리

관련 개념

Service 타입 비교

타입클러스터 내부외부 접근사용 사례
ClusterIP내부 마이크로서비스 통신
NodePort✅ (노드 IP:포트)개발/테스트 환경
LoadBalancer✅ (로드밸런서 IP)프로덕션 외부 노출
ExternalName✅ (DNS)해당 없음외부 서비스 연결

Service Discovery

Kubernetes에서 Service를 찾는 방법:

1. DNS 기반:

[service-name].[namespace].svc.cluster.local
  • 예: my-service.production.svc.cluster.local
  • 같은 네임스페이스에서는 my-service만으로 접근 가능

2. 환경 변수:

MY_SERVICE_SERVICE_HOST=10.0.0.1
MY_SERVICE_SERVICE_PORT=80

셀렉터와 엔드포인트

Service는 셀렉터를 통해 파드를 선택합니다:

selector:
app: my-app
tier: backend
  • 셀렉터와 일치하는 모든 파드가 Service의 엔드포인트가 됨
  • 파드가 Ready 상태일 때만 엔드포인트에 포함
  • 엔드포인트는 자동으로 업데이트됨

세션 어피니티

동일한 클라이언트의 요청을 같은 파드로 라우팅:

옵션설명
None라운드 로빈 로드 밸런싱 (기본값)
ClientIP클라이언트 IP 기반 세션 고정
spec:
sessionAffinity: ClientIP
sessionAffinityConfig:
clientIP:
timeoutSeconds: 10800 # 3시간

Headless Service

ClusterIP가 None인 Service:

spec:
clusterIP: None
selector:
app: my-stateful-app
  • 로드 밸런싱 없이 직접 파드 DNS 제공
  • StatefulSet과 함께 사용
  • DNS 조회 시 모든 파드 IP 반환

멀티클러스터 Service 관리

MCM를 통해 Service를 멀티클러스터에 배포할 때:

PropagationPolicy:

  • 동일한 Service를 여러 클러스터에 복제
  • 클러스터 선택 및 배포 전략 설정

OverridePolicy:

  • 클러스터별로 다른 Service 설정 적용
  • 예: 클러스터별 다른 NodePort 범위

문제 해결

Service에 연결할 수 없는 경우:

  • 셀렉터가 올바른지 확인
  • 대상 파드가 Running 상태인지 확인
  • 파드의 포트가 올바른지 확인
  • 네트워크 정책이 트래픽을 차단하지 않는지 확인

외부에서 접근이 안 되는 경우:

  • Service 타입이 NodePort 또는 LoadBalancer인지 확인
  • 방화벽 규칙 확인
  • LoadBalancer의 경우 External IP 할당 확인

DNS 조회 실패:

  • CoreDNS 파드가 정상 동작하는지 확인
  • Service 이름과 네임스페이스가 올바른지 확인
  • DNS 형식: [service].[namespace].svc.cluster.local

다음 단계