이번 챕터에서는 쿠버네티스가 무엇인지, 어떤 경우에 사용하고 어떤 장점이 있는지 알아볼 것이다.
쿠버네티스란 컨테이너 오케스트레이션 도구의 일종으로 사실상 컨테이너 오케스트레이션의 표준처럼 자리잡고 있다.
📌 컨테이너 오케스트레이션
다수의 컨테이너를 쉽고 자동적으로 제어/관리하기 위해 생겨난 기법이다.
쿠버네티스를 줄여서 k8s
라고 쓰기도 한다.
최근 k8s가 유행을 타고는 있지만, 그 본질상 일반적인 프로그래머가 k8s를 활발하게 사용할 일은 많지 않다.
k8s는 여러 개의 컨테이너(동일한 구성의 컨테이너 여러 세트) 를 관리하는 도구이기 때문이다.
이런 점을 감안했을 때 대규모 시스템을 개발하는 프로그래머라도,
대규모 서버군을 프로그래머가 직접 관리할 일이 드물 듯 k8s를 사용할 일도 드문 것이다.
k8s의 이점을 살리기 위해서는, k8s로 어떤 일을 할 수 있는가에 초점을 맞추어야 한다.
지금까지 배웠던 도커는 한대의 물리적 서버에서 실행되는 경우가 많았지만 k8s는 여러 대의 물리적 서버가 존재하는 것을 전제로 한다.
예를 들어, (k8s를 사용하지 않는다면) 20개의 컨테이너를 만들기 위해서는 docker run
커맨드를 20번 실행해야 할 것이다.
k8s는 이렇게 번거로운 컨테이너 생성/관리의 수고를 덜어주는 도구이다.
도커 컴포즈에서 사용되는 컴포즈 파일과 비슷한 정의 파일(매니페스트 파일) 만 작성하면,
이 정의에 따라 모든 물리적 서버에 컨테이너를 생성하고 생성한 컨테이너를 관리해준다.
k8s는 전체적인 제어를 담당하는 마스터 노드와 실제 동작을 담당하는 워커 노드라는 두 가지 유형의 노드로 구성된다.
📌 노드
여기서 노드란, 거의 물리적 서버와 일치하는 개념이라고 볼 수 있다.
마스터 노드는 이름 그대로 감독과 같은 존재이다.
워커 노드는 실제 서버에 해당하는 부분으로, 컨테이너가 실제 동작하는 서버이다.
이렇게 마스터 노드와 워커 노드로 구성된 k8s 시스템을 클러스터라고 한다.
k8s는 도커 엔진 등의 컨테이너 엔진과는 별개의 소프트웨어이다.
그러므로 k8s 소프트웨어와 CNI(Container Networking Interface)를 설치해야 한다.
대표적인 CNI 소프트웨어로는 플란넬, 칼리코, AWS VPC CNI 등이 있다.
또한 마스터 노드에는 컨테이너 등의 상태를 관리하기 위해 etcd 라는 데이터베이스가 설치되고,
워커 노드에는 도커 엔진같은 컨테이너 엔진이 필요하다.
그리고, 마스터 노드를 설정하는 관리자의 컴퓨터에는 kubectl를 설치한다.
📌 정리
- 마스터 노드 ➡️ etcd
- 워커 노드 ➡️ 컨테이너 엔진
- 관리자의 컴퓨터 ➡️ kubectl
💁🏻♀️ : 컨테이너는 OO개, 볼륨은 XX개로 구성해줘!
위와 같이 어떤 '바람직한 상태' 를 YAML 파일에 정의하고,
자동으로 컨테이너를 생성/삭제하면서 이 상태를 만들고 유지하는 것이 쿠버네티스의 기본적인 아이디어이다.
📌 도커 컴포즈와의 차이점
- 도커 컴포즈
: 옵션을 지정해 수동으로 컨테이너 수를 바꿀 수는 있어도,
모니터링 기능이 없어서 컨테이너를 만들 때를 제외하고는 관여하지 않는다.- k8s
: 상태를 유지한다.
컨테이너가 망가졌다면, k8s가 알아서 망가진 컨테이너를 삭제하고 새 컨테이너로 대체한다.
k8s의 기능은 자동으로 상태를 유지하는 것으로, 컨테이너를 삭제하고 싶다면 삭제 명령어를 입력하는 것이 아니나 파일 상태를 수정해야 한다.
만약 컨테이너를 직접 삭제하면,
🤔 : 컨테이너가 하나 부족한가? 그럼 하나 더 만들어야지!
이와 같이 k8s 입장에선 누군가 일부러 삭제를 한 것인지, 다른 이유로 컨테이너가 소멸한 것인지 알 수 가 없다.
무엇보다도 k8s의 목표는 바람직한 상태를 유지하는 것으로, 사람이 개입해서 컨테이너를 삭제해서는 안 된다!
만약 컨테이너를 삭제하고 싶다면, 반드시 '바람직한 상태'에 정의된 컨테이너 수를 줄이는 방법을 사용해야 한다.