Kubernetes와 친해지기 (1) - 입문편

Joseph·2021년 6월 22일
0
post-thumbnail

매일매일 어딘가에서 들려오고, 알고싶고 배우고싶지만 멀게만 느껴졌던 Kubernetes...
도대체 Kubernetes는 무엇인가? 최대한 쉽고 빠르게 기본 개념과 동작 원리에 대해 알아보고, 현재 우리가 이 k8s를 어떻게 사용하고 있는지에 대해서도 가볍게만 알아보려고 합니다!

배경지식

Kubernetes에 대해 알아보기 전에 미리 알아두면 좋은 내용들이 있습니다.
이전 세대에서는 어떤 과정을 통해 서비스의 빌드/배포가 이루어져왔으며, 어떤 필요성에 의해 Kubernetes가 등장하게 되었는지에 대한 내용인데요, 가장 먼저 살펴볼 내용은 컨테이너와 도커에 대한 개념입니다.

컨테이너와 도커

간단한 웹서버를 띄워주는 node.js 코드가 있다고 가정합니다.

app.js

const http = require('http');
const os = require('os');
var handler = function(req, res) {
    res.writeHead(200);
    res.end("Container hostname: " + os.hostname() + "\n");
};
const www = http.createServer(handler);
www.listen(8080);

이 코드를 단순히 VM / PM 등의 서버에서 실행 해줄수도 있겠지만, 우리는 위 코드를 도커 환경에서 동작시켜줄 수 있는 Dockerfile을 정의하여 컨테이너 이미지 형태로도 만들 수 있습니다. (다들 익숙하시죠..?)

Dockerfile

FROM node:12
COPY app.js /app.js
ENTRYPOINT ["node", "app.js"]

만들어진 이미지는 Docker Registry(이미지 저장소, ex: Harbor, d2hub, Container Registry)에 업로드하여 보관을 하게 되는데요, 어떤 환경이든 도커 위에서 동일한 이미지를 받아 실행하면 동일한 결과를 얻을 수 있다는 장점이 있습니다.

Docker Image build / push / pull / start 예시

[이미지 빌드/업로드]
docker build -t test/app:v1 	// 컨테이너 이미지 빌드
docker images			// 빌드된 이미지 확인
docker push test/app:v1 	// Docker Registry로 컨테이너 이미지를 푸시

[이미지 다운로드/배포]
docker pull test/app:v1 	// 이미지 저장소에서 컨테이너 이미지를 땡겨옴
docker create --name app -p 80:8080 test/app:v1
docker start app

컨테이너 vs 가상머신

가상머신 (VM)

  • 작은 앱 하나하나를 띄우기 위해 VM을 통째로 세팅해서 사용해야합니다 (확장성 X)
  • CPU, Memory에 대한 관리가 유동적이 아닌 정해진 상태에서 시작해야합니다 (비효율적)

컨테이너

  • 하나하나가 가볍습니다 (MSA 구조에 적합)
  • 모두가 독립적인 프로그램처럼 관리됩니다
  • 불필요한 인프라 분리가 필요 없습니다

Kubernetes의 등장

등장배경


하나의 OS 위에 Docker를 띄운 다음, 그 위에 여러 개의 앱을 띄워 관리할 수 있게 되었지만 앱들을 여러 대의 서버의 좀 더 안정적인 환경에서 서비스하고 싶다는 니즈가 생겨났고, 이러한 과정들을 개발자들이 하나하나 관리하기에는 힘들었습니다.

이러한 필요성에 의해 나온 Containerized Applications들을 효율적으로 관리해주는 시스템이 Kubernetes입니다

Kubernetes: Container Orchestration Tool

Cluster라는 무대 위에서 master node라는 지휘자가 worker node라는 오케스트라 단원들을 지휘한다

Kubernetes Cluster의 기본구성

master node(control plane)

  • 외부에서 요청을 받아 worker node들에게 task를 분배 (jake)
  • 구성요소
    • API server: 외부로부터 요청을 받아서 실제로 master node로 task가 들어오는 채널(kubectl)
    • etcd: 모든 노드들에 대한 정보를 관리하는 key-value store
    • scheduler: etcd 값을 읽어서 worker node들의 task를 스케쥴링
    • controller: 요청으로 들어온 내용들을 항상 안정적으로 유지시켜주는 역할

worker node

  • 실제로 요청받은 작업들을 수행하는 노드 (joseph, lloyd, ...)
  • 구성요소
    • kubelet: 모든 노드에 떠있는 데몬. Task를 분배받아서 실제로 컨테이너를 띄우는 등의 역할 수행
    • kube-proxy: 노드들간의 네트워크 통신을 담당
    • Docker: 컨테이너 실행 엔진
    • DNS, UI ...: 노드 간의 통신을 위해 필요한 addons...

pod

  • worker node 위에서 각각의 앱들이 떠있는 가장 작은 단위(dave, luis, jenny, jayjay, ...)

Kubernetes 기본 flow

  • 이미지 빌드해서 도커 레지스트리에 올리는 과정 (CI)
  • 아랫부분은 kubectl을 통해 실제 배포까지 진행하는 과정 (CD)

지금까지 Kubernetes에 대한 아주 기초적인 내용들을 알아보았습니다. 다음 스터디때는 각 노드들의 조금 더 상세한(?) 역할에 대해 스터디해보는 시간을 가져보겠습니다.

앞으로 알아봐야 하는 내용들은 어떤 것들이 있을까요?

  • master node, worker node는 구체적으로 어떻게 동작하나요?
  • yaml, kubectl을 어떻게 써야하나요? namespace는 뭔가요?
  • 로드밸런싱은 어떻게 되나요? ingress는 뭐죠?
  • Pod은 어떻게 동작하나요?
  • Replica, RollingUpdate, Controller 동작과정, livenessProbe란?
  • helm chart는 뭐죠?

감사합니다~~!

0개의 댓글