DevOps/K8S

[k8s] Service

kyoulho 2024. 8. 28. 21:04

서비스는 쿠버네티스 클러스터 내의 여러 파드를 하나의 엔드포인트로 묶어주는 역할을 한다. 파드들은 클러스터 내에서 동적으로 생성되고 제거되기 때문에 IP 주소가 변할 수 있지만, 서비스는 일관된 IP 주소와 DNS 이름을 제공하여 파드들의 변경에도 불구하고 안정적인 네트워크 접속을 보장한다.

 

서비스의 유형

ClusterIP

  • 기본 서비스 유형으로, 클러스터 내부에서만 접근 가능한 IP 주소를 제공한다.
  • 클러스터 외부에서는 접근할 수 없으며, 내부 통신에 주로 사용된다.
  • 마이크로서비스 간의 내부 통신, 데이터베이스 접근 등 내부 네트워크에서의 통신.

NodePort

  • 외부에서 노드 IP의 특정 포트(<NodeIP>:<NodePort>)로 들어오는 요청을 감지하여, 해당 포트와 연결된 파드로 트래픽을 전달하는 유형의 서비스다.
  • NodePort 서비스를 생성하면 모든 클러스터 노드의 IP 주소와 지정된 포트를 통해 서비스에 접근할 수 있다. 일반적으로 30000에서 32767 사이의 포트를 사용한다.
  • 클러스터 내부로 들어온 트래픽을 특정 파드로 연결하기 위한 ClusterIP 역시 자동으로 생성된다.
  • 클러스터 외부에서 직접 노드에 접근하여 애플리케이션에 연결해야 할 때 사용.

LoadBalancer

  • 클라우드 서비스 제공자의 로드 밸런서를 이용하여 외부 트래픽을 서비스로 라우팅 하는 유형이다.
  • 주로 클라우드 환경에서 사용되며, 외부 IP를 할당받아 외부 트래픽을 자동으로 분산 처리할 수 있다. 이에 필요한 NodePort ClusterIP 역시 자동 생성된다.
  • 이때 프로비저닝된 로드 밸런서의 정보는 서비스의 status.loadBalancer 필드에 게재된다.
  • 클라우드 환경에서 인터넷 트래픽을 받아야 하는 웹 서비스나 API 서버.

ExternalName

  • 클러스터 내부에서 정의된 서비스가 클러스터 selector 대신 외부의 DNS 이름으로 트래픽을 리디렉션 하는 유형이다.
  • spec.externalName 항목에 필요한 DNS 주소를 기입하면, 클러스터의 DNS 서비스가 해당 주소에 대한 CNAME 레코드를 반환하게 된다.
  • 이 유형은 서비스 이름을 외부 도메인으로 매핑하고, 내부 요청을 외부 서비스로 전달한다.
  • 외부의 특정 서비스나 API와 통신해야 하는 경우에 유용하다.

서비스의 구성 요소 및 필드

  • selector
    • 서비스가 트래픽을 라우팅할 대상 파드를 선택하기 위해 사용하는 레이블이다.
    • 여러 레이블을 조합하여 특정 파드들을 선택할 수 있다.
  • ports
    • 서비스에서 사용하는 포트를 정의한다. 여러 포트를 정의할 수 있다.
    • name:  서비스에서 사용될 포트 이름.
    • port: 서비스가 노출하는 포트.
    • targetPort: 트래픽이 전달될 파드의 포트. 숫자 또는 컨테이너 내의 포트 이름이 될 수 있다.
    • nodePort: NodePort 서비스에서 노드의 특정 포트를 지정할 때 사용.
    • protocol: 사용하는 프로토콜. 기본값은 TCP이며, UDP도 지원한다.
  • type
    • 서비스의 유형을 정의한다. ClusterIP, NodePort, LoadBalancer, ExternalName 중 하나를 선택할 수 있다.
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
    tier: frontend
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 8080  # 파드가 수신할 포트 (숫자 또는 이름)
      nodePort: 30036   # NodePort 서비스일 경우 노출할 포트
  clusterIP: 10.0.0.10  # 클러스터 내부 IP (자동 할당 가능)
  type: NodePort        # NodePort 유형의 서비스

이 설정은 app: MyApptier: frontend 레이블을 가진 파드에 대해, 클러스터 외부의 노드 포트 30036을 통해 접근 가능하게 하고, 그 트래픽을 파드의 8080 포트로 전달하는 서비스이다. targetPort는 숫자 8080 또는 컨테이너 내의 포트 이름 http으로 지정될 수 있다.

'DevOps > K8S' 카테고리의 다른 글

[k8s] Pod  (0) 2024.08.29
[k8s] NodePort  (0) 2024.08.29
[k8s] Namespace  (0) 2024.08.28
[k8s] 배포 흐름  (0) 2024.08.28
[K8s] 설치 시 스왑 비활성화의 필요성  (0) 2024.08.26