Services

2024. 12. 31. 00:45카테고리 없음

728x90
반응형
clusterIP nodePort loadBalancer
클러스터 외부에서는 접근이 불가능 NodePort Service는 모든 쿠버네티스 노드의 동일 포트를 개방한다. 그리고 실제로 해당 포트로 트래픽이 들어오면, 결국 ClusterIP로 전달되어 Pod로 로드밸런싱 LoadBalancer 타입 Service는 NodePort 타입 Service를 한 번 더 감싸서 만들어진 것

 

https://seongjin.me/kubernetes-service-types/

 

쿠버네티스에서 반드시 알아야 할 서비스(Service) 유형

파드는 특성상 생성될 때마다 내부 IP 주소가 계속 변화하게 된다. 쿠버네티스의 서비스(Service)는 이러한 파드에 탑재된 애플리케이션이 외부와 상호 통신이 가능하도록 만들어준다. 이번 글에

seongjin.me

https://velog.io/@pinion7/Kubernetes-%EB%A6%AC%EC%86%8C%EC%8A%A4-Service%EC%97%90-%EB%8C%80%ED%95%B4-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B3%A0-%EC%8B%A4%EC%8A%B5%ED%95%B4%EB%B3%B4%EA%B8%B0

 

Kubernetes 리소스 Service에 대해 이해하고 실습해보기

- Service 정의, 주요 기능 및 종류를 이해한다. - ClusterIP 타입과 서비스 디스커버리를 이해하고 실습한다. - NodePort 타입과 외부에 노출하는 방법을 이해하고 실습한다. - LoadBalancer 타입과 클라우드

velog.io


Cluster IP

https://kodekloud.com/blog/clusterip-nodeport-loadbalancer/

1. ClusterIP 서비스란?

  • 정의:
    • Kubernetes의 기본 서비스 유형으로, 클러스터 내부에서만 접근 가능한 가상 IP를 제공.
    • Pod 간 통신을 지원하며, 외부에서는 접근할 수 없음.
  • 필요성:
    • Pod의 IP 주소는 동적으로 변경되므로, 안정적인 통신을 위해 고정된 인터페이스가 필요.
    • ClusterIP는 Pod 그룹을 묶어 단일 IP로 접근 가능하게 하여 안정적인 내부 통신 제공.

2. ClusterIP 서비스의 특징

  1. 내부 통신 지원:
    • 러스터 내 애플리케이션의 마이크로서비스 간 통신에 적합.
    • 예: 프론트엔드 Pod가 백엔드 Pod에 API 요청을 보낼 때 사용.
  2. 자동 부하 분산:
    • 동일한 레이블을 가진 여러 Pod에 트래픽을 무작위로 분산.
    • 장된 로드 밸런서를 통해 고가용성 제공.
  3. 고정 IP 제공:
    • 서비스 생성 시 고유한 가상 IP 주소(ClusterIP)를 자동 할당.
    • Pod가 삭제되거나 재생성되어도 서비스의 IP는 변경되지 않음.
  4. DNS 이름으로 접근 가능:
    • 각 서비스는 클러스터 내에서 DNS 이름으로도 접근 가능.
    • 예: http://backend-service로 백엔드 서비스에 연결.
apiVersion: v1
kind: Service
metadata:
  name: backend-service
spec:
  selector:
    app: backend
  ports:
  - name: http
    protocol: TCP
    port: 80        # 서비스가 노출하는 포트
    targetPort: 8080 # Pod에서 애플리케이션이 실행 중인 포트
  type: ClusterIP    # 생략 가능 (기본값)
  • Pod와 연결:
    • selector 필드로 특정 레이블을 가진 Pod를 그룹화하여 서비스와 연결.

주요 필드 설명

  • spec.selector:
    • 특정 레이블을 가진 Pod를 선택하여 서비스와 연결.
    • 예: app: backend 레이블을 가진 모든 Pod를 연결.
  • spec.ports:
    • port: 클라이언트가 서비스를 호출할 때 사용하는 포트.
    • targetPort: 트래픽이 전달될 Pod 내부 애플리케이션 포트.
    • protocol: 기본값은 TCP.
  • spec.type:
    • 기본값은 ClusterIP. 명시하지 않아도 자동으로 설정됨.

 ClusterIP 서비스의 동작

  1. Pod 그룹화:
    • 동일한 레이블을 가진 여러 Pod를 하나의 서비스로 묶음.
  2. 트래픽 분산:
    • 서비스는 요청을 무작위로 선택된 Pod로 전달(랜덤 알고리즘).
  3. 다중 노드 지원:
    • 여러 노드에 분산된 Pod도 동일한 방식으로 연결 가능.
  4. DNS 기반 접근:
    • 클러스터 내 다른 Pod는 DNS 이름(http://service-name) 또는 ClusterIP를 통해 접근 가능.

활용 사례

  • 마이크로서비스 아키텍처:
    • 프론트엔드, 백엔드, 데이터베이스 등 서로 다른 계층 간 통신.
  • 내부 데이터 처리:
    • 데이터 처리 및 분석을 위한 내부 API 호출.
  • 고가용성 애플리케이션:
    • 여러 인스턴스(Pod)를 실행하여 부하 분산 및 장애 복구 지원.

NodePort

https://yoonchang.tistory.com/49

  1. NodePort:
    • 노드의 특정 포트를 통해 외부에서 Pod에 접근 가능.
    • 노드 포트 범위: 30,000~32,767 (기본값).
    • 외부 사용자가 노드 IP와 NodePort를 통해 웹 서버에 접근.
  • Pod와 서비스 연결:
    • 서비스는 레이블과 셀렉터를 사용하여 특정 Pod를 식별하고 연결.
    • 예: Pod 레이블이 app=myapp인 경우, 서비스 셀렉터에 동일한 레이블을 지정.
  • 다중 Pod 지원:
    • 동일한 레이블을 가진 여러 Pod가 있을 경우, 서비스는 모든 Pod를 엔드포인트로 설정.
    • 부하 분산 알고리즘으로 랜덤 방식 사용.

다중 노드 환경에서의 서비스

  • 여러 노드에 분산된 Pod를 지원하기 위해, Kubernetes는 모든 노드에 동일한 NodePort를 자동으로 설정.
  • 클러스터 내 어떤 노드 IP와 NodePort를 사용해도 애플리케이션에 접근 가능.
apiVersion: v1
kind: Service
metadata:
  name: myapp-service
spec:
  type: NodePort
  ports:
    - targetPort: 80 #지정하지않으면 port와 같은포트 지정됨
      port: 80 # 필수로 적어줘야 함
      nodePort: 30008 #지정하지 않으면 랜덤으로 포트 지정됨
  selector:
    app: myapp #pod의 labels.app 적용
    type: front-end #pod의 labels.type 적용
    
 #pod yaml
 apiVersion: v1
 kind: Pod
 metadata:
   name: myapp-pod
   labels:
     app: myapp
     type: front-end
 sepc:
   containers:
   - name: nginx-containers
     image: nginx
  • 같은 레벨이 있는 포드를 찾아 자동으로 배치, 무작위 알고리즘 사용
  • 여러노드에 파드가 분산되어 있어도 서비스는 타깃 포트로 모든 노드로 알아서 보내 줌 

Loadbalnacer

https://hgk5722.tistory.com/541
https://hgk5722.tistory.com/541

apiVersion: v1
kind: Service
metadata:
  name: nginx-loadbalancer
spec:
  selector:
    app: nginx
  type: LoadBalancer
  ports:
    - name: http
      port: 80        # 서비스가 노출하는 포트
      targetPort: 8080 # Pod에서 애플리케이션이 실행 중인 포트
      protocol: TCP
  • 필수 필드 설명:
    • type: LoadBalancer: 서비스 유형을 LoadBalancer로 설정.
    • selector: 연결할 Pod를 식별하는 레이블.
    • ports:
      • port: 클라이언트가 요청을 보낼 서비스 포트.
      • targetPort: Pod 내부 애플리케이션 포트.

LoadBalancer 서비스란?

    • 정의:
      • Kubernetes의 서비스 유형 중 하나로, 클라우드 제공자의 외부 로드 밸런서를 통해 애플리케이션을 외부 네트워크에 노출.
      • 러스터 내부의 여러 Pod에 대한 트래픽을 분산 처리하며, 단일 IP 주소를 통해 접근 가능.
    • 필요성:
      • NodePort 서비스는 각 노드의 IP와 포트를 통해 접근해야 하므로 사용자 경험이 불편.
      • LoadBalancer는 단일 URL 또는 IP를 제공하여 사용자 접근을 간소화.

주요 특징

      1. 단일 진입점 제공:
        • 외부 사용자가 단일 IP 주소 또는 도메인 이름으로 애플리케이션에 접근 가능.
        • 예: votingapp.com 또는 resultapp.com.
      2. 자동 부하 분산:
        • 여러 Pod에 트래픽을 균등하게 분산하여 고가용성과 성능 보장.
      3. 클라우드 통합:
        • AWS, GCP, Azure와 같은 클라우드 플랫폼에서 네이티브 로드 밸런서를 자동으로 생성 및 구성.
      4. 노드 간 트래픽 라우팅:
        • 클러스터 내 모든 노드에서 동일한 포트를 통해 애플리케이션에 접근 가능.
      5. 건강 상태 확인:
        • Pod의 상태를 실시간으로 모니터링하고, 비정상적인 Pod로의 트래픽을 차단.

LoadBalancer 서비스 동작 방식

  1. 클라우드 환경에서의 동작:
    • 클라우드 제공자의 API와 통합하여 로드 밸런서를 생성.
    • 로드 밸런서는 NodePort를 통해 클러스터 내부로 트래픽을 전달.
  2. 비클라우드 환경에서의 동작:
    • VirtualBox와 같은 비지원 환경에서는 NodePort와 동일하게 동작.
    • 외부 로드 밸런서가 생성되지 않음.
반응형