본문 바로가기

가상 머신/쿠버네티스

[ 쿠버네티스 / Kurbernetes ] 서비스에 대해서 알아보기

반응형

Kubernetes의 서비스(Service)는 클러스터 내에서 실행되는 Pod에 대한 네트워크 접근을 관리하는 추상화된 리소스입니다.
서비스는 일관된 방식으로 Pod에 접근할 수 있게 하여, 동적 환경에서도 안정적인 네트워크 통신을 가능하게 합니다.
서비스는 여러 유형으로 제공되며, 각각의 기능과 특징이 다릅니다.

1. Kubernetes 서비스의 주요 개념

  1. 서비스 정의:
    • 서비스는 여러 Pod를 그룹화하여 하나의 논리적 단위로 묶습니다.
    • 각 서비스는 클러스터 내에서 고유한 IP 주소와 DNS 이름을 가집니다.
  2. 레이블 셀렉터:
    • 서비스는 레이블 셀렉터를 사용하여 대상이 되는 Pod를 선택합니다.
    • 동일한 레이블을 가진 Pod는 서비스의 백엔드로 동작합니다.
  3. 엔드포인트:
    • 서비스는 선택된 Pod의 IP 주소와 포트를 엔드포인트로 관리합니다.
    • 클라이언트는 서비스의 IP와 포트만 알면 되고, 서비스는 자동으로 엔드포인트를 갱신합니다.

2. 서비스 유형

  1. ClusterIP (기본값):
    • 클러스터 내부에서만 접근 가능한 내부 IP 주소를 할당합니다.
    • 외부에서는 접근할 수 없고, 클러스터 내의 다른 서비스나 Pod에서만 접근 가능합니다.
    • 내부 통신 및 서비스 디스커버리에 주로 사용됩니다.
  2. NodePort:
    • 각 노드의 특정 포트를 할당하여, 클러스터 외부에서 접근 가능하게 합니다.
    • NodePort는 클러스터 내의 모든 노드에서 동일한 포트를 열어둡니다.
    • 외부 트래픽은 노드의 IP 주소와 노드 포트를 통해 서비스에 접근할 수 있습니다.
  3. LoadBalancer:
    • 클라우드 제공자의 로드 밸런서를 사용하여 외부 트래픽을 서비스로 분산합니다.
    • 외부 IP 주소가 할당되며, 트래픽은 로드 밸런서를 통해 적절한 Pod로 라우팅됩니다.
    • 주로 클라우드 환경에서 외부에 서비스를 노출할 때 사용됩니다.
  4. ExternalName:
    • CNAME 레코드를 통해 외부 서비스에 접근할 수 있게 합니다.
    • 클러스터 외부의 서비스 이름을 DNS로 해결하여 사용합니다.
    • 주로 외부의 특정 도메인 이름을 내부 서비스로 사용하고자 할 때 사용됩니다.

3. 서비스 디스커버리

  1. DNS 기반 서비스 디스커버리:
    • Kubernetes 클러스터는 기본적으로 DNS 서버를 포함하고 있어, 서비스 이름으로 서비스에 접근할 수 있습니다.
    • 각 서비스는 클러스터 내에서 고유한 DNS 이름을 가지며, 예를 들어 my-service.my-namespace.svc.cluster.local과 같은 형식으로 접근할 수 있습니다.
  2. 환경 변수 기반 서비스 디스커버리:
    • Kubernetes는 Pod가 생성될 때, 해당 네임스페이스의 모든 서비스에 대한 환경 변수를 설정합니다.
    • 이 환경 변수는 서비스의 클러스터 IP와 포트 정보를 포함하고 있어, 애플리케이션이 이를 통해 서비스에 접근할 수 있습니다.

4. 서비스의 활용

  1. 로깅 및 모니터링:
    • 서비스는 로깅 및 모니터링 시스템과 통합되어 트래픽 분석 및 성능 모니터링에 사용됩니다.
  2. 로드 밸런싱:
    • 서비스는 여러 Pod에 트래픽을 분산하여 로드 밸런싱을 제공합니다.
    • 이를 통해 애플리케이션의 가용성과 성능을 향상시킬 수 있습니다.
  3. 서비스 메시:
    • Istio와 같은 서비스 메시를 사용하여 서비스 간의 복잡한 통신을 관리할 수 있습니다.
    • 서비스 메시를 통해 트래픽 관리, 보안, 정책 적용 등이 가능해집니다.

5. 서비스 생성 예제

다음은 ClusterIP 유형의 서비스를 정의하는 예제입니다:

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9376

이 예제에서는 app: MyApp 레이블을 가진 Pod를 선택하고, 서비스는 클러스터 내부에서 80 포트로 접근할 수 있게 합니다.
실제 트래픽은 9376 포트로 전달됩니다.
Kubernetes의 서비스는 Pod 간의 안정적이고 일관된 통신을 보장하며, 애플리케이션의 가용성과 확장성을 지원하는 핵심 요소입니다.

반응형