Service - NodePort

Yu Sang Min·2025년 5월 21일

CKA

목록 보기
12/110
post-thumbnail

📌 Service

  • 앱 안팎의 다양한 구성요소의 통신을 가능하게 함
  • 애플리케이션을 다른 애플리케이션 또는 사용자와 연결하는것을 도움
  • 응용 프로그램에는 다양한 Pod가 존재함
  • 사용자에게 프론트엔드 로드를 제공하기 위한 그룹, 백엔드를 제공하기 위한 그룹, 외부 데이터 소스에 연결하는 그룹 등
  • 이런 Pod 그룹 간의 연결을 가능하게 하는것이 service
  • service는 엔드유저에게 프론트엔드 서비스를 제공 하게 하고 백엔드와 프론트엔드 Pod 통신과 외부 데이터 소스와 연결을 돕는다
  • 즉, microservice의 통신을 지원한다.

💡UseCase

  • 쿠버네티스 node에 부여된 IP 주소 (192.168.1.2)
  • 같은 네트워크에 있는 나의 노트북 IP 주소 (192.168.1.10)
  • internal pod network (10.244.0.0)
  • Pod IP (10.244.0.2)

❗️192.168.1.10 (노트북) ➡️ K8S Internal Pod Network(10.244.0.0) 접근 불가

🏁 접근 가능한 방법

  1. 192.168.1.10(노트북) ➡️ ssh ➡️ 192.168.1.2(K8S Node)
  2. 192.168.1.2(K8S Node) ➡️ curl http://10.224.0.2 ➡️ Pod의 웹페이지 접속
    🚨 이건 노드 내부에서 접근 한것이고, ssh를 입력하지 않고 웹 서버에 외부 접속(액세스)이 가능하게 만들어야함
  • 때문에 K8S Node IP에 단순 액세스시 Pod의 웹 서버로 접근 하고 싶음
  • 이를 위해 노트북에서 노드로의 요청을 maping 하는 중간요소가 필요함
  • 그것이 바로 service
  • 리슨 중인 포트로 요청을 받아 동작하는 애플리케이션으로 Port Forwarding 하는 object임
  • nodeport service가 대표적

📑 Service Types

  1. NodePort : service가 내부 포트를 노드의 포트에 액세스할 수 있게 함
  2. ClusterIP : 클러스터 안에서 가상 IP를 만들어 다른 서비스간의 통신을 가능하게 함 (예시. 클러스터 내부의 프론트엔드와 백엔드 그룹의 통신)
  3. LoadBalancer : 클라우드 로드밸런서를 프로비전 함

📡 NodePort

  • node의 포트로부터 pod의 포트로까지 mapping 해줄 수 있다.
  • webServer Pod : 10.244.0.2:80 (타깃 포트) 👉 서비스가 최종적으로 요청을 전달하는 곳
  • service Port : 80 👉 서비스는 노드 안의 가상 서버와 같다, 클러스터 내부에 IP 주소를 갖는다 (예시 : 10.106.1.12) 👉 이를 ClusterIP 라고 한다.
  • NodePort : 노드 자체에 포트 외부에서 웹 서버에 액세스하는 데 사용하는 포트(30008)
    • 노드 포트는 30,000 ~ 32,767 사용

🔨 Create Service

# service-definition.yaml

apiServer: v1
kind: Service
metadata: 
  name: myapp-service
# label : 현재 필요없음

spec:
  type: NodePort # 이외에 ClusterIP, LoadBalancer 등을 사용
  ports:
  - targetPort: 80
    port: 80
    nodePort: 30008
  selector:
    app: myapp
    type: front-end
  • 여기서 가장 중요한 필드는 port
  • targetPort를 생략시 port와 동일하다고 간주함
  • nodePort를 생략시 자동으로 비어있는 포트 번호 할당
  • ports 필드는 배열(array)이기 때문에 자식 필드에 대시문자(-)가 있고 첫 번째 요소를 의미
  • ports를 정의했다면 실제 연결할 podlabels로 식별할 수 있다
  • spec 필드 아래에 selector 필드를 정의 하고 연결할 podlabels 실제 값을 명시한다
  • replicaSet 또는 deployment와 다른 점은 matchLabels가 존재하지 않는다 Pod를 복제할 template이 필요가 없기 때문이다.

⌨️ Command

$ kubectl create -f service-definition.yaml
$ kubectl get services
$ curl http://192.168.1.2:30008 
# K8S node IP와 NodePort

❓Multiple-Pod Mapping

  • 하나의 Pod에 Mapping된 port를 예로 들었지만 다중 Pod에 Mapping 하기위해.
  • 운영 환경에서의 웹 애플리케이션 다중 인스턴스를 고가용성과 부하 분산 목적으로 사용한다. (즉, RC, RS, Deployment 등으로 같은 서비스를 제공하는 다중 Pod를 보통 사용)
  • 이 경우, Pod 정의시 labels을 설정하고 service정의 시 selector로 레이블 지정(위 yaml 파일 예시 참조)
  • 만약 노드 포트로 요청이 들어오면 selector와 일치하는 레이블의 pod로 매칭하게 됨
  • 부하 분산 알고리즘은 랜덤 알고리즘
  • 마치 내부의 로드밸런서 처럼 작동하여 부하를 분산 한다

❓Mutliple-Node Mapping

  • pod가 여러 node에 걸쳐 생성 되었을때는?
  • 클러스터 내 분리된 nodepod에 웹 애플리케이션이 존재
  • 추가적인 구성 할 필요 없이 서비스 생성시 K8S는 자동으로 클러스터 내 모든 노드에 걸쳐 service를 생성하고 타깃 포트를 같은 노드 포트로 맵핑함
profile
React, Node.js, AWS, Git, Github, Github Action, Docker, K8S

0개의 댓글