훈훈훈

Kubernetes :: 외부 클라이언트 노출을 위한 Service 타입 정리 본문

인프라/Kubernetes

Kubernetes :: 외부 클라이언트 노출을 위한 Service 타입 정리

훈훈훈 2020. 9. 15. 00:55

해당 내용 및 그림은 공식문서, 블로그 등을 참고하였습니다. 출처는 글 하단에 작성하였습니다.

 

 

서비스(Service) 란? 

-  파드에서 실행되고 있는 애플리케이션을 외부로 노출 시키는 추상적인 방법

-  디플로이먼트로 관리되고 있는 여러 파드들은 재시작 할 때마다 부여받은 IP 주소가 변경되기 때문에 관리가 어렵다.

-  위의 문제점은 서비스를 이용하여 해결할 수 있다. 

-  서비스는 지정된 IP로 생성 및 여러 파드들을 묶어서 관리 할 수 있으며, DNS로 조회가 가능하다.

-  서비스도 파드와 마찬가지로 REST Object 이며, 서비스 생성 시  API Server에 POST하여 새 인스턴스를 생성할 수 있다.

-  기본 프로토콜은 TCP, 다른 프로토콜은 해당 링크 참고

-  예시

 

1
2
3
4
5
6
7
8
9
10
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9376                                                                        
cs

 

 

 

서비스를 외부로 노출 시키는 방법

-  Cluster IP

-  Node Port

-  Load Balancer

-  Ingress

 

 

Cluster IP

-  Kubernetes 기본 서비스, 클러스터 내에서 접근 가능하지만, 클러스터 외부에서는 접근할 수 없다.

-  외부에서 접근하기 위해서는 Proxy를 사용하거나, 직접 Pod로 포워딩 시켜야한다.

 

 

-  프록시는 아래 커맨드로 설정할 수 있다.

1
kubectl proxy --port=8080                                                                                                                                    
cs

 

-  프록시를 설정하면 아래와 같이 접근할 수 있다.

1
http://localhost:8080/api/v1/proxy/namespaces/<NAMESPACE>/services/<SERVICE-NAME>:<PORT-NAME>/
cs

 

 

Node Port 

-  외부 트래픽을 서비스로 직접 가져옴

-  모든 노드의 (VM)에서 특정 포트 할당, 해당 포트로 모든 트래픽이 서비스로 전달

-  아래 그림을 살펴보면 노드당 한개의 포트로만 통신하는 것을 볼 수 있다. (사용 가능 포트 범위 : 30000 ~ 32767)

-  노드 / VM IP가 변경된 경우 처리를 해줘야하기 때문에 실 서비스에서 사용은 권장 안함

-  또한 모든 노드에 분산 요청을 처리하기 위해서는 NodePort 보다는 Load Balancer 사용이 적절하다.

 

 

-   예시 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: NodePort
  selector:
    app: MyApp
  ports:
      # 기본적으로 그리고 편의상 `targetPort` 는 `port` 필드와 동일한 값으로 설정된다.
    - port: 80
      targetPort: 80
      # 선택적 필드
      # 기본적으로 그리고 편의상 쿠버네티스 컨트롤 플레인은 포트 범위에서 할당한다(기본값: 30000-32767)                                 
      nodePort: 30007
 
cs

 

spec.type 을 NodePort로 설정하면, 컨트롤 플레인은 지정된 범위( 30000~32767 ) 내에서 포트를 할당한다.

위 예시처럼 포트를 직접 할당할 수 있지만, 그 외 컨트롤 플레인이 지정된 범위 내에서 할당한 포트와 충돌이 발생할 수 있기 때문에 적절하지 않다.

 

 

Load Balancer

-  외부 IP를 가지고 있는 로드밸런서 할당

-  단 1개의 IP를 제공하며, 해당 IP로 모든 트래픽을 서비스로 부하분산

-  주로 클라우드 벤더에서 제공하는 제품 사용

-  벤더 마다 설정 방법은 약간씩 상이하기 때문에 사용하는 벤더에 맞게 학습 필요

HTTP, TCP, UDP, Websockets, gRPC 등 대부분의 프로토콜과 통신할 수 있다.

 

 

 

  

Ingress

-  클러스터 내에서 서비스에 대한 외부 접근 관리하는 API 오브젝트

-  클러스터 외부에서 내부 서비스로 HTTP / HTTPS 경로 노출

-  HTTP / HTTPS 이외의 프로토콜을 사용하려면 NodePort 나 LoadBalancer 유형의 서비스 정의 필요

-  라우팅은 인그레스 리소스(매니페스트 파일)에 정의된 규칙에 의해 수행

 

 

 

 

 

 

출처

medium.com/google-cloud/kubernetes-nodeport-vs-loadbalancer-vs-ingress-when-should-i-use-what-922f010849e0

 

Kubernetes NodePort vs LoadBalancer vs Ingress? When should I use what?

Recently, someone asked me what the difference between NodePorts, LoadBalancers, and Ingress were. They are all different ways to get…

medium.com

kubernetes.io/ko/docs/concepts/services-networking/service/

 

서비스

파드파드는 클러스터에서 실행 중인 컨테이너의 집합을 나타낸다. 집합에서 실행중인 애플리케이션을 네트워크 서비스로 노출하는 추상화 방법 쿠버네티스를 사용하면 익숙하지 않은 서비스 �

kubernetes.io

bcho.tistory.com/1262

 

쿠버네티스 #7 - 서비스 (Service)

쿠버네티스 #7 서비스 (service) 조대협 (http://bcho.tistory.com) Service 쿠버네티스 서비스에 대해서 자세하게 살펴보도록 한다. Pod의 경우에 지정되는 Ip가 랜덤하게 지정이 되고 리스타트 때마다 변하��

bcho.tistory.com

- 기타 도서 : 쿠버네티스 인 액션

Comments