참조 :
https://ko.wikipedia.org/wiki/쿠버네티스
https://www.aquasec.com/wiki/display/containers/Kubernetes+Guide
도커란 무엇인가? 포스팅에 이어 쿠버네티스에 정리하고자한다.
위키백과에서 쿠버네티스를 찾아보면 "쿠버네티스(Kubernetes, 쿠베르네테스, "K8s"[3])는 디플로이 자동화, 스케일링, 컨테이너화된 애플리케이션의 관리를 위한 오픈 소스 시스템으로서[4] 원래 구글에 의해 설계되었고 현재 리눅스 재단에 의해 관리되고 있다. 목적은 여러 클러스터의 호스트 간에 애플리케이션 컨테이너의 배치, 스케일링, 운영을 자동화하기 위한 플랫폼을 제공하기 위함이다.[3] 도커를 포함하여 일련의 컨테이너 도구들과 함께 동작한다.” 라고 나온다.
처음 저 글을 봤을 땐 전혀 와 닿지 않지만, 쿠버네티스를 이용해 서비스를 짧은 기간인 3개월 정도 운영해본 후, 저 글을 다시 읽으니 저 3문장에 쿠버네티스를 아주 잘 설명 한 거같다. 요즘 오픈소스의 이름들을 보면 명칭에 아주 신경을 많이 쓴 것을 알 수 있는데, 쿠버네티스는 그리스어로 키잡이를 뜻한다고 한다.
kubernetes는 플랫폼 이름이 길어서 줄여 k8s라고도 한다. 앞으로는 k8s라고 적겠다. ( 8은 kubernetes의 중간의 글자라고 생각하면 된다 )
왼쪽 그림은 k8s의 마크다. k8s가 앞서 키잡이(배의 키를 조정하는 사람)를 뜻한다고 했는데, 옆에 도커마크랑 같이 봄 이해가 간다.
도커란 배들의 키잡이 역할을 해주는 플랫폼이구나 하고 넘어가면 된다.
그럼 k8s가 왜 필요한지 생각해보자 우리한테는 앞서 여러 application을 올릴 수 있는 컨테이너 플랫폼인 도커를 공부 하였다.
도커만으로 충분하지 않을까?
물론 경우에 따라선 도커만으로 충분하다. 앞으로는 관리자 역할에서 생각해보자.
하나의 노드에서 여러 컨테이너를 띄우다 보니 자원( disk, memory, cpu )이 부족하기 시작했다.
관리자 : 서버를 하나 추가해서 컨테이너를 나눠서 노드에 담자
위 그림처럼 노드를 하나 늘려서 도커를 설치하였다. 하지만 관리하는 노드가 많아질수록 점점 복잡해진다.
또한 이러한 요구사항이 올 수도있다.
클라이언트 : 웹 서버를 배포할 건데 죽으면 안되니까 이중화로 구성해주고 로드밸런서를 둬서 트래픽을 분산시켜줘. !
관리자 :#@($
예가 이상할 수도 있지만, 간단하게 k8s의 필요성에 관해 설명하고자 했다.
k8s은 위에서 필요한 기능들을 다 제공하고 있다. !
대충 이런 그림 !
그럼 좀 더 자세히 k8s의 아키텍처를 보자
( 처음에 모르는 오픈소스를 볼 때, 이러한 그림부터 보면 좀 더 시간을 아낄 수 있다 )
그림 출처 : https://www.aquasec.com/wiki/display/containers/Kubernetes+Guide
일단 각각의 역할을 그림을 보면서 이해해보자.
큰 그림으로 보면 kubectl을 통해 받은 명령어를 api server를 통해 kubelet으로 전달하면 Pod( container 묶음 )를 생성하며 서비스를 제공한다. 물론 메타데이터를 저장하는 etcd, 다양한 제어기능을 위한 controller-manager, 자원분배를 도와주는 scheduler, 네트워크 트래픽을 담당하는 kube-proxy도 있다.
자세히 적으면 처음 k8s을 접하는 사용자의 이해에 어려움이 있을 수 있어, 여기서는 간략하게만 소개하고 나중에 좀 더 자세히 소개하도록 하겠다.
kubectl : kubectl은 간단하게 명령어를 보내는 역할만 한다.
예) kubectl get pods ( pod들을 확인하는 명령어 )
API server : 간단하게 명령어를 전달해주는 역할만 진행한다. 또한 etcd클러스터랑 통신한다. 이 정도만 알고 가자 !
( 기본적으로 REST방식으로 통신한다 )
etcd : kubernetes 클러스터 데이터(포드 수,상태,네임 스페이스 등), API 객체 및 서비스 검색 세부정보를 저장하는 데 사용되는 분산 키 값 저장소다.
( 메타 데이터가 저장되는 역할을 한다 생각하면 된다 )
controller-manager : 컨트롤러 매니저는 복제, 서비스계정, 네임스페이스 등을 생성하고 이를 각 노드에 배포하며 관리하는 역할을 한다.
( 여기선 사용자가 다양한 설정을 정할 수 있는데 이러한 것을 제어하기 위해 도와주는 역할이라고 간단하게 넘어가자 )
scheduler : 스케줄러는 Pod,서비스 등 각 자원을 적절한 노드에 할당하는 역할을 한다.
kubelet : 노드는 기본적으로 정기적으로 새로운 pod 또는 수정된 pod의 사양으로 포드 및 컨테이너가 원하는 상태로 실행되고 있는지 확인한다.
kube-proxy : 노드로 들어오는 네트워크 트래픽을 적절한 컨테이너로 라우팅하고, 로드밸런싱 등 노드로 나가는 네트워크 트랙픽을 프록시하고 노드와 마스터간 통신을 관리한다.
이 포스팅은 k8s가 무엇인지 이해하는 것이 목적이기 때문에, 이해를 쉽게 하기 위해 어려운 내용은 다 제거했다. 좀 더 자세한 내용은 시간이 생긴다면, k8s 내부 컴포넌트들이 어떤 식으로 통신하는지 그림과 같이 정리할 생각이다.
댓글