본문 바로가기
devops/Kubernetes

kubernetes service (nodeport) 에대한 설명

by 아이티.파머 2024. 4. 25.
반응형

쿠버네티스에서 service (nodeport 외부용)은 네트워크 정보를 뜻한다. 외부에 노출하려고 하거나 내부에서 사용하려고 할때 혹은 DNS를 통해 외부와 통신하려고 할때 ports type에 맞춰 상황에 따라 사용 가능하다.

내가 어떤 label을 가지고 있는지 확인 하고자 할때 다음 명령어를 사용한다.

kubectl get pods --show-labels
kubectl get deployments --show-labels

ports type 에는 몇가지 종류가 있다.

  • clusterIP
  • NodePort
  • Load Balancer
  • ExternalName

쿠버네티스에서 서비스란 외부에서 쿠버네티스 클러스터에 접속하는 방법을 서비스(Service)라 칭한다

Service Network

NodePort를 사용하여 외부에서 > Service > Pod 로 연결되는 네트워크 정보으 흐름이다. 다음 그림은 NodePort 를 사용하여 외부에서 Pod 접근 가능한 port 를 네트워크에 노출시키는 그림이다. Nodeport는 기본적으로 30000 ~ 32767 으로 자동 생성 된다.

  • nodePort : 외부에서 접속하기 위해 사용하는 포트 정보
  • port : cluster 내부에서 사용할 포트 정보
  • targetPort : 생략하면 port 의 내용을 승계한다. 실제 pod 에서 사용되는 app의 port 번호이다.

하나의 노드에 여러개의 Pod가 있을때 서비스 그룹(selector)에서 label 을 묶어주어 자동으로 loadbalance 가 동작된다.

노드가 하나가 아니라 여러개로 되어 있다면 다음과 같이 연결된다.

노드가 다른경우에도 하나의 셀렉터 그룹으로 묶여서 로드 벨런생 해준다.

yaml 파일에서의 Service 예시

실제 YAML 과 네트워크가 동작하는 것에 대한 매칭 그림

예제

다음 그림을 통해 실제 Spring cloud 기능을 kubernetes 로 구성해 보자 .

샘플로 보면 다음과 같다.

Service.yaml

apiVersion: v1
kind: Service                                   # YAML 파일에서 정의하는 객체의 종류
metadata:
  name: hello-cloud-service                     # Service 이름
  namespace: default                            # 서비스가 속한 네임스페이스 정보
  labels:                                       # 묶여질 라벨
    app: hello-ads-cloud                           # 서비스 객체에 라벨을 정의하여 쿠버네티스 오브젝트의 그룹화와 관리를 할 수 있다.
spec:                                           # 서비스 스팩 정의 (특징, 구성 및 동작방식에 대한 정보)
  selector:                                     # 연결 Pods
    app: hello-ads-cloud                          # 연결하려는 파드명과 일치해야 한다.
  type: NodePort                                # 서비스의 타입으로 clusterId, nodeport, loadbalancer, externalName 등이 있다.
  ports:
    - name: client                              # 포트명칭 (그냥 알아보기 위한 이름)
      port: 80                                  # Service 에 들어 오는 포트
      targetPort: 80                            # 실제 pod에 연결된 application으로 연결해줄 port
      nodePort: 30091                           # nodeport로 외부에 열어줄 포트
    - name: eureca-continer
      protocol: TCP
      port: 8761
      targetPort: 8761
      nodePort: 30092
    - name: ads-continer
      protocol: TCP
      port: 8082
      nodePort: 30093

deployment.yaml

apiVersion: apps/v1
kind: Deployment                        # YAML 파일에서 정의하는 객체의 종류
metadata:
  name: hello-ads-cloud-dempoyment      # deployment pod - 이름
  labels:                               # deployment 객체에 라벨을 정의
    app: hello-ads-cloud                   # 실제 라벨명
spec:                                   # deployment 의 스펙에 대한 정의
  replicas: 2                               # replica 수
  selector:                                 # 파드가 어떤 레이블 (label)을 가지고 있는지 정의
    matchLabels:                              # 레이블에 대한 묶음 정의
      app: hello-ads-cloud
  template:                             # 파드 템플릿에 대한 정의
    metadata:                             # 파드에 대한 메타정보
      labels:                               # 파드의 레이블 (label)을 정의
        app: hello-ads-cloud
    spec:                                 # 파드 스펙에 대한 정의
      containers:                           # 컨테이너 정보
        - name: hello-ads-server
          image: mycup/spring-server-ads:latest
          #resources:                       # 리소스 정보
          #  limits:                          # 리밋 제한 정보
          #    memory: "128Mi"                # 메모리 리밋 설정
          #    cpu: "500m"                    # CPU 제한 설정
          ports:                            # 컨테니터 포트 정보
            - containerPort: 8082
          env:                              # 컨테이너로 전달할 환경변수 정보
            - name: EURECA_HOST
              value: "localhost"
        - name: hello-eureca-service
          image: mycup/spring-cloud-eureka
        - name: hello-client
          image: mycup/spring-cloud-client

리소스 클러스터 정보

엔드포인트 정보(네트워크)

파드정보

사용자가 노드포트에 접속했을때 해당 파트로 접속되는 과정

  • 사용자가 특정 워커노드#1:3000 번으로 접속한다
  • 노드포트 서비스(NodePortService)로 이동되며 노드포트서비스에의해 어느 Pod로 가게 될지 결정된다.
  • 특정 파드로 연결되어 서비스에 접속 할 수있다.

 

 
반응형

'devops > Kubernetes' 카테고리의 다른 글

kubernetes namespage  (0) 2024.04.25
kubernetes minikube install  (0) 2024.04.25
kubernetes dashboard  (1) 2024.04.25
kubectl 명령어  (0) 2024.04.25
Argo CD 설치하기, Argo CD 란?  (0) 2023.04.28