쿠버네티스

Kubernetes Services 1 - NodePort

우잉~ 2024. 11. 14. 16:33

쿠버네티스 서비스

 

쿠버네티스 서비스는 애플리케이션 내부와 외부의 다양한 구성 요소 간의 통신을 가능하게 한다.

애플리케이션을 사용자 또는 타 애플리케이션과 연결할 수 있도록 도운다.

사용자-프론트엔드 애플리케이션 연결/프론트엔드-백엔드 Pod 통신/외부 데이터 소스 연결을 설정할 수 있으며, 서비스는 애플리케이션의 마이크로서비스 간 느슨한 결합을 가능하게 한다.

 

서비스를 이용한 연결

 

 


쿠버네티스 서비스는 총 3가지로 정리할 수 있다.

쿠버네티스 서비스 종류 3가지

 

1. NodePort

- 노드의 특정 포트를 통해 내부 Pod에 접근할 수 있도록 돕는 서비스

2. ClusterIP

- 클러스터 내에서 가상의 IP를 생성하여 프론트엔드 서버 그룹과 백엔드 서버 그룹 간 통신을 가능하게 하는 서비스

3. Load Balancer

- 여러 웹 서버에 부하를 분산할 수 있는 서비스

 

1. NodePort

 

웹 애플리케이션이 실행되는 Pod를 배포했을 때 사용자는 웹 애플리케이션에 어떻게 접근할 수 있을까?

다른 네트워크 접속 방법???

 

첫 번째 방법은 SSH 접속이다. curl 명령어나 브라우저를 통해 아이피 주소로 웹 페이지에 접근할 수 있다. → 하지만 세션이 종료되면 노드 내부 네트워크에 대한 연결이 종료되어버린다. SSH는 클러스터 외부에서 노드로의 단방향 연결만을 제공한다.

그리고 SSH 접속 방법은 쿠버네티스 노드 내부에서 접근하는 방법으로, 사용자의 환경에서 직접 접근하는 방법은 아니다.

SSH 접근 방법은 쿠버네티스 노드 내에서 진행

 

직접 접근할 수 있는 방법은 두 번째 방법인 쿠버네티스 서비스를 이용하는 것이다. 

노드의 포트를 사용하여 해당 포트의 요청을 웹 애플리케이션이 실행 중인 Pod로 전달한다.

노드의 IP가 192.168.1.2, 포트가 30006일 경우 curl 192.168.1.2:30006 명령을 사용하여 접속할 수 있다.

이러한 서비스의 유형을 NodePort라고 한다.

 

쿠버네티스 서비스 NodePort

 

 

NodePort 서비스는 3가지 포트와 관련되어 있다.

1. targetPort: 실제 웹 서버가 실행되는 Pod의 포트로, 이 포트에 서비스가 요청을 전달한다.

2. Port: 서비스 자체 포트로, 클러스터 내에서 고유한 IP 주소인 Cluster-IP를 가진다.

3. NodePort: 웹 서버에 접근하는 데 사용하는 노드 자체 포트로, 30000~32767 사이의 범위에서만 유효하다.

 

TargetPort, Port, NodePort

 

 

Pod, ReplicaSet, Deployment를 생성할 때처럼 서비스도 yaml 파일을 작성하여 생성한다.

서비스도 마찬가지로 spec 부분이 가장 중요한데, 여기서 서비스의 유형과 포트 정보를 포함해야 한다.

# service-definition.yaml

apiVersion: v1
kind: Service
metadata:
  name: myapp-service
spec:
  type: NodePort
  ports:
  - targetPort: 80
    port: 80
    nodePort: 30006

 

포트를 모두 작성하였으면, 어떤 pod의 targetPort인지 작성을 해줘야하는데, 이는 selector를 작성하여 서비스와 pod를 연결할 수 있다.

selector 부분에는 연결할 pod의 labels 정보 작성

 

nodeport 서비스 생성

 

이후 kubectl get nodes -o wide 명령을 통해 노드의 ip 주소(INTERNAL-IP)를 확인하고 30006 포트에 crul 명령을 실행하면 통신이 되는 것을 확인할 수 있다.

정상 접속 완료

 

 

Pod가 여러 개일 경우에도 서비스가 동일한 Label을 가진 여러 Pod를 자동으로 찾고, 이 pod들을 엔드포인트로 선택하여 외부 요청을 전달한다. → 한 pod에 집중적으로 요청을 보내는 것을 방지하기 위해서 쿠버네티스 서비스는 무작위 알고리즘을 사용하여 요청을 분산한다.

 

* 노드가 여러 개면 어쩌죠????????

여러 노드에 분산된 Pod에 서비스가 연결되는 경우에는 쿠버네티스가 추가 설정 없이 모든 클러스터 노드에 동일한 NodePort를 매핑해준다. 정말 다행이다~~

어느 노드의 IP를 통해서든 동일한 포트 번호로 애플리케이션에 접근할 수 있다. 쿠버네티스야 고마워~

 

 


실습 - Deployment를 이용하여 배포한 여러 개의 Pod에 서비스 연결하기

기존에 작성한 Deployment를 생성하여 6개의 pod를 실행한다.

deployment 생성

 

service.yaml의 spec에는 type, ports, selector를 작성해야 한다.

type 서비스의 유형(nodePort, clusterIP, loadBalancer)
ports port: 서비스의 포트
targetPort: 포드의 포트
nodePort: 노드의 포트
selector 연결할 pod의 labels

service.yaml의 spec 작성

 

서비스 생성

 

현재 서비스는 minikube에서 실행 중이다. 

> minikube service myapp-service --url

명령을 사용하면 주소를 뱉어내는데, 이 주소를 브라우저에서 접속할 수 있는 것을 확인할 수 있다.