쿠버네티스는 클라우드 네이티브 컴퓨팅 재단(Cloud Native Computing Foundation, CNCF)이라는 단체에서 제정한 표준이다. 쿠버네티스는 본래 구글에서 개발했지만 구글 등의 회사가 CNCF를 조직하고 이 재단에 쿠버네티스를 기부해 개발이 오픈소스로 전환되면서 급속하게 보급됐다. CNCF도 쿠버네티스를 만들고 있지만 관리 기능을 강화한 버전이나 크기를 줄인 버전 등 쿠버네티스의 규격을 따른 서드파티 소프트웨어가 여럿 나오고 있다. 특히 이중에서도 AWS나 애저, GCP 같은 클라우드 서비스에서는 자사 서비스에 맞춰 커스터마이징된 쿠버네티스를 제공한다.

쿠버네티스는 본래 대규모 시스템이 전제 조건이다. 따라서 마스터 노드와 워커 노드도 별도의 물리적 컴퓨터로 설정하지만 도커 데스크톱이나 Minikube에서는 컴퓨터 한 대에 마스터 노드와 워커 노드를 모두 구축한다. 다시 말해 물리적 컴퓨터를 따로 둘 필요가 없는 것이다.

도커 데스크톱의 쿠버네티스 준비

  1. 쿠버네티스 활성화: 태스크 트레이의 고래 아이콘을 클릭하고 메뉴에서 [Settings]를 선택해 도커 설정 화면을 연다. [Kubernetes] 탭에서 [Enable Kubernetes] 항목을 체크한다.
  2. 쿠버네티스 클러스터 설치: [Kubernetes Cluster Installation]이라는 대화창이 나타나며 설치 여부를 묻는다. [Install]을 클릭하면 쿠버네티스 클러스터가 설치된 후 실행된다.
  3. 쿠버네티스 클러스터 설치가 끝나면 Kubernetes가 running 상태가 된다. 단, 쿠버네티스는 컴퓨터의 리소스를 소모하므로 사용하지 않을 때는 평소 작업에 지장을 줄 수 있으므로 이런 경우에는 [Enable Kubernetes] 항목의 체크를 해제해 쿠버네티스를 비활성화한다. 또 쿠버네티스 클러스터를 초기화하려면 [Reset Kubernetes Cluster] 버튼을 클릭하면 된다.
  4. 쿠버네티스는 매니페스트 파일(정의 파일)에 기재된 내용에 따라 파드를 생성한다. 매니페스트 파일의 내용을 쿠버네티스에 업로드하면 그 내용이 데이터베이스(etcd)에 바람직한 상태로 등록되며, 서버 환경을 이 바람직한 상태로 유지한다.

YAML 형시으로 매니페스트 파일 작성

파드나 서비스에 대한 설정을 쿠버네티스에서는 매니페스트(manifest)라고 한다. 또 이를 적은 파일을 매니페스트 파일(저으이 파일)이라고 한다. 매니페스트 파일은 YAML 또는 JSON 형식으로 기재한다. JSON형식은 컴퓨터로 처리하는 것이 목적으로 사람이 설정 파일을 읽고 쓴다면 YAML파일을 주로 사용한다. 또한, 매니페스트 파일은 리소스 단위로 작성한다. 리소스는 파드나 서비스, 디폴로이먼ㅌ, 레플리카세트 등을 가리킨다.

매니페스트 파일에도 컴포즈 파일과 마찬가지로 주 항목이 있다. 주 항목은 네 가지이다. apiVersion: 항목에는 API 그룹 및 버전, kind: 항목에는 리소스 유형, metadata: 항목에는 메타데이터, spec: 항목에는 리소스 내용을 작성하는데 사용한다.

메타데이터 스펙 작성(디플로이먼트)

디플로에먼트의 스펙은 템플릿의 형태로 파드의 설정을 기재한다.

  1. 셀렉터(selector)의 설정: 디플로이먼트가 특정한 레이블이 부여된 파드를 관리할 수 있도록 하는 설정이다.
  2. 레플리카(Replica)의 설정: 파드의 레플리카에 대한 관리이다. 파드 수를 몇 개로 유지할 것인지 설정한다. 이 값을 0으로 설정하면 파드가 사라진다.
  3. 템플릿(template) 작성: 생성할 파드의 정보를 기재한다. 기재 내용은 파드에 기재된 내용(메타데이터 및 스펙)과 거의 같다.
  4. 디플로에먼트의 기재 항목: 디플로이먼트에서 기재되는 항목을 정리한다. 주항목 아래에 중항목, 소항목이 열거된다.

유형(type)은 서비스의 종류를 말한다. 다시 말해 외부로부터 서비스에 어떤 유형의 IP주소(또는 DNS)로 접근할지를 설정한다.

  1. ClusterIP: 클러스터 IP를 통해 서비스에 접근하도록 함(외부에서는 접근 불가)
  2. NodePort: 워커 노트의 IP를 통해 서비스에 접근하도록 함
  3. LoadBalancer: 로드밸랜서의 IP를 통해 서비스에 접근하도록 함
  4. ExternalName: 파드에서 서비스를 통해 외부로 나가기 위한 설정

WRITTEN BY
ppdha82

,

쿠버네티스(Kubernetes)는 컨테이너 오케스트레이션 도구의 일종이다. 컨테이너 오케스트레이션이란, 시스템 전체를 통괄하고 여러 개의 컨테이너를 관리하는 일을 말한다. 또한, 쿠버네티스를 k8s라고 줄여쓰기도 한다. K와 s사이에 8개의 글자가 있다는 의미의 약칭으로 쿠버네티스와 관련된 검색어로 유용하다.

최근 쿠버네티스가 유행을 타고는 있지만 그 본질상 일반적인 프로그래머가 쿠버네티스를 활발하게 사용할 일은 많지 않다. 왜냐하면 쿠버네티스는 여러 개의 컨테이너(서버)를 관리하는 도구이기 때문이다. 다만 쿠버네티스로 어떤 일을 할 수 있는가에 대한 지식은 시스템을 개발할 때 유용할 수 있다.

도커는 한 대의 물리적 서버에서 실행되는 경우가 많지만 쿠버네티스는 여러 대의 물리적 서버가 존재하는 것을 전제로 한다. 또 이 물리적 서버 한 대 한 대마다 제각기 여러 대의 컨테이너를 실행한다. 도커 컴포즈를 사용한다 해도 물리적 서버가 여러 대라면 반복 작업은 사라지지 않는다. 거기다 어떻게든 컨테이너를 생성해 실행했다 해도 물리적 서버를 일일이 모니터링하며 장애가 일어나면 컨테이너를 다시 실행해야 하는 것은 물론이고 컨테이너를 업데이트를 하려면 다시 한번 큰 수고가 따른다. 쿠버네티스는 이렇게 번거로운 컨테이너 생성이나 관리의 수고를 덜어주는 도구이다. 도커 컴포즈에서 사용되는 컴포즈 파일과 비슷한 정의 파일(매니페스트 파일)만 작성하면 이 정의에 따라 모든 물리적 서버에 컨테이너를 생성하고 생성한 컨테이너를 관리해 준다.

쿠버네티스는 전체적인 제어를 담당하는 마스터 노드와 실제 동작을 담당하는 워커 노드라는 두 가지 유형의 노드로 구성된다. 즉, 마스터 노드에서 컨테이너를 실행하지 않으며 워커 노드에서 실행되는 컨테이너를 관리하는 역할을 한다. 따라서 도커 엔진 같은 컨테이너 엔진도 설치되지 않는다. 마스터 노드와 워커 노드로 구성된 일군의 쿠버네티스 시스템을 클러스터라고 한다.

쿠버네티스는 도커 엔진 등의 컨테이너 엔진과는 별개의 소프트웨어이다. 그러므로 쿠버네티스 소프트웨어와 CNI(가상 네트워크 드라이버)를 설치해야 한다. 대표적인 CNI 소프트웨어로 플란넬(flannel), 칼리코(Calico), AWS VPC CNI 등이 있다. 또 마스터 노드에는 컨테이너 등의 상태를 관리하기 위해 etcd라는 데이터베이스가 설치된다. 워커 노드에는 물론 도커 엔진 같은 컨테이너 엔진이 필요하다.

쿠버네티스의 기능은 어디까지나 자동으로 상태를 유지하는 것으로 컨테이너를 삭제하고 싶다면 삭제 명령어를 입력하는 것이 아니라 파일에서 바람직한 상태를 수정해야 한다. 물론 컨테이너이므로 도커 명령어를 사용하여 컨테이너를 직접 삭제할 수도 있지만 컨테이너를 직접 삭제하면 쿠버네티스가 컨테이너가 하나 부족하다는 것을 탐지하고 컨테이너를 보충한다. 또한, 쿠버네티스의 목표는 바람직한 상태를 유지하는 것이다. 사람이 개입해서 컨테이너를 삭제해서는 안 된다.

로드 밸런싱이란, 한 대의 서버에 모든 요청이 집중되지 않도록 여러 대의 서버를 갖추고 요청을 각 서버에 분산하는 것을 말한다. 또한, 서버도 여러 대의 서버가 부하를 분담해 과도한 부하가 걸린 서버가 망가지거나 처리가 늦어지는 것을 방지한다. 하지만 서버에 들어오는 요청은 많을 때도 있고 적을 때도 있다. 대부분의 시스템은 요청이 많은 시기와 그렇지 않은 시기가 있다. 그렇다면 요청이 많을 때에 맞춰 갖춰 놓은 서버가 요청이 적을 때에는 그만큼 놀게 되기 때문에 비용이 낭비된다. 이런 문제를 해결하는 것이 도커와 쿠버네티스이다.

도커 컴포즈와 쿠버네티스는 많은 차이점이 있지만 그중에서도 가장 큰 차이점은 쿠버네티스의 정의 파일(매니페스트 파일)이 데이터베이스로 관리된다는 점이다. 쿠버네티스가 정의 파일을 읽어 들이면 그 내용은 etcd(데이터베이스)에 저장된다. 파드는 이 정보를 근거로 관리되며 도커 컴포즈와 또 다른 점은 쿠버네티스의 정의 파일은 커맨드로 수정이 가능하다는 점이다.

쿠버네티스 구성 관련 용어

  1. 파드(pod): 쿠버네티스에서 컨테이너를 관리하는 단위로 컨테이너와 볼륨을 함께 묶은 것이다.
  2. 서비스(service): 파드를 모은 것으로 여러 개의 파드를 이끄는 반장 역할을 한다.
  3. 레플리카세트(ReplicaSet): 파드의 수를 관리하는 역할을 한다.
  4. 디플로이먼트(deployment): 파드의 디플로이(배포)를 관리하는 요소로 파드가 사용하는 이미지 등 파드에 대한 정보를 갖고 있다.

WRITTEN BY
ppdha82

,

docer run 커맨드를 사용하여 이미지를 내려 받으면 이미지는 도커 허브에 저장된다. 하지만 우리가 직접 만든 이미지는 이미지로부터 docker run 커맨드 컨테이너를 만들려면 이미지를 가져올 수 있는 장소가 필요하다. 직접 만든 이미지도 도커 허브에 올릴 수 있으며, 비공개로 사용하는 도커 허브 같은 장소도 만들 수 있다.

이미지를 배포하는 장소를 도커 레지스트리라고 한다. 일반에 공개되어 있든 비공개이든 상관없이 이미지가 배포되는 곳은 모두 도커 레지스트리이다. 도커 허브는 도커 제작사에서 운영하는 공식 도커 레지스트리를 말한다. 아파치나 MySQL, 우분투의 공식 이미지 모두 도커 허브에 ㅊ마여해 도커 허브에서 이미지를 배포한다. 우리가 run 커맨드를 사용할 때 내려 받는 이미지는 이렇게 제공된다.

레지스트리는 이미지를 배포하는 장소이며, 반면 레포지토리는 레지스트리를 구성하는 단위이다. 도커 허브에서는 레포지토리가 각각 ID를 갖게 돼 있다. 따라서 도커 허브는 각각의 회사나 개인이 가진 레지스트리가 여럿 모인 형태가 된다.

이미지에 태그를 부여해 복제하는 커맨드 docker tar (docker image tag)

이미지에 태그를 부여하는 명령어는 다음과 같이 작성한다.

docker tag ${원래 이미지 이름} ${레지스트리 주소}/${레포지토리 이름}:${버전}

이미지를 업로드 하는 커맨드 docker push (docker image push)

docker push 커맨드는 이미지를 업로드하는 커맨드이다. 태그는 레지스트리 주소/레포지토리 이름:버전 과 같이 길어서 알아보기 힘들지만 그 자체로 하나의 이름이다. 또 어느 레지스트리에 업로드할지도 태그로 판단한다. 다시 말해 도커 엔진은 태그에 포함된 레지스트리 주소의 도메인에 있는 레지스트리로 업로드를 시도한다. 레포지토리는 처음 업로드할 때는 존재하지 않는다. push 커맨드를 실해아며 만들어진다.

시스템 구축과 관련된 명령어를 하나의 텍스트 파일(정의 파일)에 기재해 명령어 한번에 시스템 전체를 실행하고 종료와 폐기까지 한번에 하도록 도와주는 도구가 토커 컴포즈이다. 도커 컴포즈는 시스템 구축에 필요한 설정을 YAML(YAML Ain't Markup Language) 포맷으로 기재한 정의 파일을 이용해 전체 시스템을 일괄 실행(run)또는 일괄 종료 및 삭제(down) 할 수 있는 도구이다. 정의 파일에는 컨테이너나 볼륨을 어떠한 설정으로 만들지에 대한 항목이 기재돼 있다. 작성 내용은 도커 명령어와 비슷하지만 도커 명령어는 아니다. 정의 파일(YAML)작성 예는 다음과 같다.

  1. MySQL 컨테이너: 컨테이너 이름, 인자, 네트워크 등
  2. 워드프레스 컨테이너: 컨테이너 이름, 인자, 네트워크 등
  3. Network: 네트워크 이름
  4. Volume: 볼륨 이름

도커 컴포즈와 Dockerfile 스크립트의 차이점

도커 컴포즈는 텍스트 파일에 기재된 정의를 따라 실행된다. 즉, 도커 컴포즈는 docker run 명령어를 여러개 모아놓은 것과 같다. 컨테이너와 주변 환경을 생성한다. 네트워크와 볼륨까지 함께 만들 수 있다. 반면, dockerfile 스크립트는 이미지를 만들기 위한 것으로 네트워크나 볼륨은 만들 수 없다.

도커 컴포즈 설치

도커 컴포즈를 사용하려면 먼저 설치할 필요가 있다. 도커 컴포즈는 도커 엔진과 별개의 소프트웨어이기 때문이다. 단, 윈도우나 macOS에서 사용하는 도커 데스크톱은 도커 컴포즈가 함께 설치되기 때문에 따로 설치할 필요가 없다. 그러나 리눅스에서는 도커 컴포즈와 파이썬 3 런타임 및 필요 두고 (python3, python3-pip 패키지)를 설치해야 한다. 도커 컴포즈는 파이썬으로 작성된 프로그램이기 때문에 파이썬 런타임이 필요하다. 리눅스에서는 다음과 같이 파이썬 런타임과 도커 컴포즈를 설치한다.

sudo apt install -y python3 python3-pip

sudo pip3 install docker-compose

또한, 도커 컴포즈는 설치가 끝나면 바로 실행 가능한 상태가 된다. 즉, 설치 후 docker-compose 명령을 사용하여 실행한다.


WRITTEN BY
ppdha82

,