티스토리 뷰

 Kubernetes(K8s)는 애플리케이션의 여러 구성 요소를 파드(Pod) 형태로 모델링하여 관리합니다.

파드는 하나 이상의 컨테이너를 포함하며, K8s는 이를 클러스터 내에서 동적으로 배치하고 관리합니다.

하지만 파드는 재배포될 때마다 IP 주소가 변경되므로, K8s는 이를 해결하기 위해 서비스(Service) 리소스를 제공합니다.

 

서비스(Service)란?

 서비스는 파드 간 통신을 안정적으로 제공하기 위한 K8s의 핵심 리소스입니다.

클러스터 내부와 외부 간의 트래픽을 원활하게 처리할 수 있도록 다음과 같은 주요 기능을 수행합니다.

주요 기능

  1. 어드레스 디스커버리(Address Discovery)
    Kubernetes의 서비스는 파드의 IP가 변경될 때마다 이를 자동으로 추적하고, 클러스터 내 DNS를 통해 서비스 이름을 IP 주소로 매핑합니다. 애플리케이션은 서비스 이름을 사용하여 파드의 현재 IP 주소를 자동으로 찾을 수 있어, 파드가 재배포되더라도 중단 없이 안정적으로 통신할 수 있습니다.
  2. 트래픽 라우팅 및 레이블 셀렉터
    Kubernetes 서비스는 클러스터 내부와 외부에서 발생하는 트래픽을 적절한 파드로 연결하여 애플리케이션이 원활히 실행될 수 있도록 합니다. 이때, 레이블 셀렉터를 사용하여 특정 파드를 선택하고 해당 파드로 트래픽을 유도합니다.
    또한, 로드 밸런싱 방식을 적용해 트래픽을 여러 파드에 고르게 분산하며, 파드의 IP가 변경될 경우 자동으로 반영됩니다.
    이를 위해 
    kube-proxy는 각 노드에서 실행되며, 네트워크 규칙을 설정해 요청을 적절한 파드로 전달하는 역할을 수행합니다.
  3. 가상 주소 제공
    • ClusterIP: 클러스터 내에서만 접근 가능한 고정 IP 주소 제공합니다.
    • DNS 이름: Kubernetes는 서비스 생성 시 내부 DNS 시스템에 해당 서비스의 고유 도메인 이름을 등록합니다. 예를 들어, frontend-service.default.svc.cluster.local과 같은 도메인 네임을 제공하여, 클러스터 내부에서 일관된 방식으로 서비스에 접근할 수 있도록 합니다.
  4. 엔드포인트 관리:
    Kubernetes API 서버를 통해 대상 파드의 네트워크 정보를 자동으로 업데이트하며, 이를 동적으로 관리합니다. 이는 kubectl get endpoints 명령어를 사용하여 확인 가능합니다. 

 서비스를 사용하면 IP 주소가 변하는 파드를 안정적으로 연결할 수 있으며, 클러스터 외부에서 클러스터 내부의 애플리케이션에 접근할 수 있도록 네트워크 인터페이스를 제공합니다.

 

 

서비스 유형

 Kubernetes에서는 다양한 유형의 서비스를 제공하며, 각 유형은 특정 네트워크 요구 사항을 충족합니다.

  1. ClusterIP (기본값):
    • 클러스터 내부에서만 사용할 수 있는 고정 IP를 제공하며, 파드의 위치와 관계없이 동일한 주소로 접근할 수 있습니다. 외부 접근이 필요 없는 내부 컴포넌트에 적합하며, 기본 서비스 유형으로 내부 네트워크에서만 접근을 허용합니다. 기본적으로 kubernetes.default.svc라는 서비스가 자동으로 생성되며, 이를 통해 클러스터 내부에서 API 서버에 접근할 수 있습니다.
    • 사용 사례: 내부 데이터베이스 서비스, 클러스터 내 마이크로서비스 간 통신.
    • 예시 YAML:
    apiVersion: v1
    kind: Service
    metadata:
      name: internal-service
    spec:
      selector:
        app: my-internal-app
      ports:
        - protocol: TCP
          port: 80
          targetPort: 9376
      type: ClusterIP
  2. NodePort:
    • 클러스터 외부에서 노드의 특정 포트를 통해 서비스에 접근할 수 있습니다.
    • 사용 사례: 개발 및 테스트 환경에서 간단한 외부 접근 제공.
    • 예시 YAML:
    apiVersion: v1
    kind: Service
    metadata:
      name: nodeport-service
    spec:
      selector:
        app: my-nodeport-app
      ports:
        - protocol: TCP
          port: 80
          targetPort: 9376
          nodePort: 30080
      type: NodePort
  3. LoadBalancer:
    • 클라우드 제공자의 로드 밸런서를 통해 외부 트래픽을 분산 처리합니다.
    • 사용 사례: 사용자 트래픽을 여러 파드에 분산하여 고가용성을 제공.
    • 예시 YAML:
    apiVersion: v1
    kind: Service
    metadata:
      name: loadbalancer-service
    spec:
      selector:
        app: my-loadbalancer-app
      ports:
        - protocol: TCP
          port: 80
          targetPort: 9376
      type: LoadBalancer
  4. ExternalName:
    • 외부 DNS 이름을 내부 서비스에서 사용할 수 있도록 매핑합니다.
    • 사용 사례: 클러스터 내부 애플리케이션이 외부 데이터베이스 또는 API 서비스에 접근할 때.
    • 예시 YAML:
    apiVersion: v1
    kind: Service
    metadata:
      name: external-service
    spec:
      type: ExternalName
      externalName: example.com

 

 

Kubernetes 네트워크 프록시

 서비스 리소스가 클러스터 내에서 안정적인 통신을 보장하려면, 트래픽을 적절한 파드로 전달하고, 파드의 동적인 IP 변경을 관리할 필요가 있습니다. 네트워크 프록시는 이러한 요구 사항을 해결하기 위해 사용됩니다.

클러스터 내부에서 동적으로 변경되는 파드의 IP 주소를 숨기고, 일관된 네트워크 연결을 제공하여 애플리케이션의 안정성을 높입니다.

또한, 클러스터 외부에서 내부로의 안전한 트래픽 전달을 보장하며, 로드 밸런싱과 서비스 검색 기능을 제공합니다.

역할과 동작 방식

 네트워크 프록시는 kube-proxy라는 구성 요소를 통해 구현되어 클러스터 내 모든 노드에서 실행되며, 최신 서비스 엔드포인트 정보를 유지합니다.

클라이언트가 서비스의 고정된 클러스터 IP로 요청을 보내면, 프록시는 해당 요청을 받아 적절한 파드로 전달합니다.

파드가 삭제되거나 재배포될 경우 프록시는 Kubernetes API 서버로부터 새로운 엔드포인트 정보를 받아 최신 상태로 유지하며, 이를 통해 클러스터 내에서 지속적으로 유효한 네트워크 연결을 보장합니다.
또한 동일한 서비스를 제공하는 여러 파드가 있을 때, 프록시는 트래픽을 균등하게 분산시켜 리소스를 효율적으로 사용하고 애플리케이션의 부하를 최소화합니다.
iptables 및 IPVS와 같은 기술을 활용하여 패킷을 필터링하고 라우팅하는 기능을 수행합니다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함