Kubernetes 5. Kubernetes의 Pod와 Service



개요

쿠버네티스에서의 PodService에 대한이해

Pod, Service in k8s


최근 쿠버네티스 실습을 통해 여러개의 서버에 클러스터를 구축하고 있는데, Pod부터 시작해서 개념을 한번 정리하고 가면 좋을것 같아 정리글을 작성한다.


Pod(파드)란?


파드는 쿠버네티스 애플리케이션의 기본 실행단위이자 가장 작고 간단한 배포의 단위이다.

Pod는 물고기, 고래의 작은 떼에서 어원이 발생했다.(Docker의 심볼이 고래 모양인것에서 유래되었다.

  • 클러스터 : 노드(컨테이너화된 애플리케이션을 실행)라고 하는 워커머신의 집합

모든 클러스터는 최소 한개의 워커노드를 가진다. 또한, 도커(docker)는 쿠버네티스 파드에서 사용되는 가장 대표적인 컨테이너 런타임이다. (크라이오(CRI-O)같은 다른 컨테이너 런타임 역시 지원하지만 주로 도커를 사용한다.)

  • 다음링크를 참고 : https://kubernetes.io/ko/docs/setup/production-environment/container-runtimes/


Pod(파드)의 특징


하나의 독립적인 서비스를 구현할 수 있는 컨테이너들이 있다.

일반적으로 쿠버네티스 클러스팅의 파드는 ‘단일 컨테이너만 동작하는 파드(한 개의 파드가 단일 컨테이너를 운영하고 해당경우, 쿠버네티스는 컨테이너가 아닌 파드를 직접 관리한다)’로 구성이 되어있고 ‘함께 동작하는 작업이 필요한 다중 컨테이너가 동작하는 파드’ 로 운영될 때도 있다.


컨테이너들은 서비스를 구현하기 위한 포트를 갖고있다. 여러개의 포트를 갖을수는 있지만 컨테이너들끼리 포트가 중복되면 안된다. 파드가 생성될때 고유의 ip주소가 생긴다. 이때 생성되는 ip는 쿠버네티스 내부에서만 접근 가능하다.

파드에 문제가 생기면 이를 감지한 후, 시스템이 파드를 삭제하고 재생성하게 되는데 이때 ip가 변경이된다.(휘발성 ip를 갖고 있다고 할 수 있다.)


(1) Label(라벨)

라벨은 파드뿐만아니라 모든 오브젝트에 달 수 있고 일반적으로는 파드에 라벨이 가장 많이 달려있다. 목적에 따라 오브젝트들을 분류하고 분류대로 오브젝트들을 따로 연결하기 위한 기능을 한다.

키와 밸류가 한쌍이며 한파드에 여러개의 라벨을 달 수 있다.


(2) Replication Controller(레플리카 컨트롤러)

파드가 죽었을때 다시 생성해주는 관리자의 역할을 해준다. 컨트롤러를 사용하면 파드를 삭제해도 바로 지워지는것이 아니다.

지우는 명령을 하면 컨트롤러가 파드를 새로만들고 다 만들어지면 기존의 파드를 삭제하는 매커니즘이다.


(3) Node Schedule

파드를 만들때 파드가 생성되는 워커노드를 지정해 줄 수 있다.

  • Node Schedule의 특징

    쿠버네티스의 스케쥴러가 판단하여 파드를 지정 할 수도 있다. 자원이 여유로운 파드에게 할당, 일종의 로드밸런싱이다. 파드의 메모리 사용량이 선언되어 있으면 그 크키에 맞게 자동으로 여유있는 노드에 파드를 지정한다.

    쿠버네티스가 파드를 만들때 노드마다 점수를 매겨서 가장 자원이 여유로운 노드에 파드를 만들게 되어있다. (점수에 영향을 가장 크게 주는것은 메모리 잔량이다.)


Service(서비스)란?


파드의 경우 지정되는 IP가 랜덤하게 지정되고 재시작될때마다 변하기 때문에 고정된 엔드포인트로의 호출이 어렵다. 또한, 여러 Pod에 같은 애플리케이션을 운용할 경우 이 Pod간의 로드밸런싱을 지원해줘야 하는데 서비스가 이런 역할을 한다.

서비스는 사용자가 직접 지우지 않는 한 IP가 변경되지 않는다. 또한, 서비스는 IP 지정이 가능함과 더불어 여러 Pod를 묶어서 로드밸런싱이 가능하다. 고유한 DNS 이름역시 가질 수 있다. 이런 서비스라는 것의 몇가지 종류를 알아보자.

서비스는 쿠버네티스 클러스터의 L4스위치 역할을 한다고 할 수 있고, 라운드로빈 방식으로 통신한다.


(1) Cluster IP

Cluster IP의 Service는 Cluster내부에서만 접근이 가능하다. (외부에서는 접근 불가) 서비스가 여러개의 파드를 보유하고 있는경우 부하 분산을 적용한다. 외부에서 접근할 수 없고 클러스터 내부에서만 사용가능하며 인가된 사용자(쿠버네티스 운영자)만 사용가능하다.

내부 대시보드 사용할때, pod의 서비스 상태를 디버깅할 때 사용가능하다. 기본적으로 서비스 type의 기본값은 Cluster IP 이다.


(2) NodePort

클러스터안에 기본적으로 서비스가 있는것은 동일하다.

쿠버네티스 클러스터에 연결된 모든 노트에게 같은 포트가 할당된다.어떤 노드든 그 ip의 포트에 접근하면 클러스터안에 있는 해당 서비스에 연결이 된다.

기본적으로는 서비스 자신에게 연결된 파드에 트래픽을 할당해 준다.

주의할 점은 파드가 있는 노드에만 포트가 만들어지는것이 아닌 모든 노드에 포트가 만들어지기 때문에 서비스는 어떤 노드에게 온 트래픽인지와 상관없이 본인에게 달려있는 파드들에게 랜덤하게 준다.

단 yml파일에 externeal TrafficPolicy:local 설정을 해주면 특정 ip포트의 노드로 들어가고 서비스를 거쳐 해당 노드의 파드에 연결시켜 줄 수 있는 옵션이 있다.

노드포트는 30000~32767로 설정할 수 있다.

내부망에 연결, 일시적으로 외부환경에 사용가능하다.

그렇기에 데모나 임시 연결용으로 쓰이고 있다.

(3) Load Balancer

로드밸런서는 각각의 노드들에게 트래픽을 분산시켜 주는 기능을 제공한다.

로드밸런서의 외부 IP는 초반에 따로 지정되어있지 않다.

별도의 외부접속 ip를 할당해주는 플러그인 있어야 한다.

(GCP, AWS Azures는 기본적으로 제공하며 사전에 ip를 지정해 줘야 한다.)

외부 시스템 노출용은 type에 LoadBalancer를 지정해줘야한다.




© 2019.04. by zunoxi

Powered by zunoxi