본문 바로가기

DevOps/쿠버네티스(Kubernetes)

[쿠버네티스 #3] Service

728x90

나는 처음에 쿠버네티스와 마이크로서비스 아키텍처를 공부할 때, 아니 지금도

 

이 Service라는 말이 굉장히 헷갈린다. 

 

왜냐하면 쿠버네티스 Object상의 service를 말하는건지 아니면 어플리케이션 자체 제공하는 서비스를 말하는건지 제대로 개념이 안잡힌 상태에서 마주하게되면 뭐가 뭐를 말하는지 개념에 혼돈이 올 수 있기 때문이다.

 

 

쿠버네티스 공식 홈페이지에서는 대놓고 '앱 노출을 위해 서비스 이용하기' 라는 탭이 있을 정도로 

 

서비스에 대해 이렇게 설명하고 있다.

 

'앱 노출을 위한 오브젝트'

 

-------------------------------------------------

20. 07. 28 글 추가 

 

https://kubernetes.io/ko/docs/reference/glossary/?all=true#term-control-plane

 

쿠버네티스 공식 표준용어집에서는 서비스를 이렇게 설명한다.

 

'파드집합에서 실행중인 애플리케이션을 네트워크 서비스로 노출하는 추상화 방법'

-------------------------------------------------

 

 

처음에 이런생각을 했었다. pod도 ip가 있는데 왜 굳이 Service라는걸로 한 번 더 포장해서 배포를 하는걸까?

 

그 이유는 pod의 휘발성 때문이다. 앞서 말했던 pod들은 쉽게 죽기도하고 재 실행되기도 한다. 이러한 과정속에서 pod의 ip는 고정이 되있는게 아닌 변화하게 되는데 이 때문에 이러한 pod를 service라는 오브젝트로 포장해서 하나의 ip로 접근 할 수 있게 하는 것이다.

 

 

대략 이런 그림처럼 이해하면 될 것이다.

 

서비스와 포드

 

pod2는 pod1의 복제본이다.

 

 

*공부를 하면서 아직도 잘 확신이 서지 않는 부분이있는데 바로 서비스로 묶는 이 pod가 여러 종류여도 묶이냐는 것이다. 많은 참고자료들을 보면 대부분의 그림을 위의 그림처럼 서비스 하나에 여러 pod가 묶여 있는데 이 pod가 과연 다 다른 종류의 pod인지(각기 다른 container가 들어있는) 아니면 하나의 pod의 복제본인지 확실하게 말해주지 않는다. 지금은 약 95퍼센트 정도 복제본이라고 생각하지만 확실하지가 않다. 혹시 알고 계신분은 알려주시면 감사하겠습니다.

 

 

 

서비스의 type에는 다음과 같은 세 종류가 있다.

 

 

ClusterIP

NodePort

LoadBalancer

 

간단하게 사용 목적을 얘기하자면

관리자용, 내부용, 외부용 이라고 할 수 있다.

 

관리자가 특정 서비스에 접근하기 위해서는 ClusterIP를

내부 사용자가 특정 서비스에 접근하기 위해서는 NodePort를

외부 사용자가 특정 서비스에 접근하기 위해서는 LoadBalancer를  사용한다.

 

 

*주의할 점은 LoadBalancer는 온프레미스 환경에서는 제공되지 않는다. GCP나 Azure와 같은 플랫폼에서만 제공되기 때문에 온프레미스 환경에서 외부에서 접근하기 위한 서비스를 만들기 위해서는 다른 방법이 필요하다.(인그레스 컨트롤러 등의 방법이 필요)

 

Cluster IP

 

위의 그림에서 service부분을 보면 Name, TYPE, CLUSTER-IP, EXTERNAL-IP, PORT, AGE 순으로 적혀있다.

여기서 EXTERNAL-IP는 외부에서 접근하기 위한 IP로 LoadBalancer TYPE일 때 할당이 됩니다.

 

CLUSTER-IP의 경우 모든 서비스에 대해서 제공이 되는데 여기서 클러스터란 마스터노드와 워커노드를 포함한 쿠버네티스 Cluster를 말합니다. 따라서 워커노드나 마스터 노드에서 해당 서비스의 cluster-ip로 접근하면 접근이 됩니다.

 

 

NodePort 타입의 경우 노드의 ip와 port로 접근하게 하는 방식이다.

 

LoadBalancer 타입은 배포하면 알아서 EXTERNAL-IP가 생성된다. 이 IP로 접근하면된다.

 

apiVersion: v1
kind: Service
metadata:
  name: example-svc
spec:
  type: ClusterIP
  selector:
    app: example-svc
  ports:
  - port: 8000
    targetPort: 8000

service에 대한 기본 yaml파일은 이런식으로 정의가 되는데

type란에 타입을 적어주고 연결하고 싶은 pod를 selector에 적어둔다.

port에는 서비스에 대한 port와 해당 서비스가 타겟으로 할 pod의 port를 적어준다.

port : 서비스에 대한 port

targetport : 타겟으로할 pod의 port

 

 

 

service는 쿠버네티스 상에서 굉장히 중요하다. 외부에 노출되는 오브젝트이기도 하고 DNS서비스 등에서 서비스의 이름으로 접근하는 경우가 많기 때문이다. 

 

 

반응형