개인적으로 파이프라인을 구축하는 학습을 하며 쿠버네티스에 대한 전반적인 개념 정리가 필요할 듯하여 해당 글을 작성했습니다.


Kubernetes (K8s)는 컨테이너 관리 시스템으로, 여러 개의 컨테이너를 효율적으로 운영하고 관리하기 위한 플랫폼입니다. Kubernetes의 주요 목적은 클러스터에 정의된 “상태”를 지속적으로 유지하는 것입니다. 즉, 컨테이너가 중단되거나 상태가 변경될 경우, Kubernetes가 자동으로 이를 감지하고 원래의 정의된 상태로 복원합니다.

Kubernetes의 주요 개념

클러스터 (Cluster)

  • 정의: 여러 노드(Node)의 집합입니다.
  • 역할: 클러스터는 컨테이너화된 애플리케이션을 실행하기 위해 필요한 자원을 제공합니다.

Control Plane

  • 정의: Kubernetes의 작업을 처리하는 구성 요소들의 집합입니다. 주요 구성 요소에는 etcd, Scheduler, API Server 등이 포함됩니다.
  • 역할: 클러스터의 상태를 유지하고 관리합니다. Control Plane은 클러스터 내에서 반드시 실행됩니다.

노드 (Node)

  • 정의: 물리적 하드웨어 또는 그 위에서 실행되는 가상 머신을 의미합니다.
  • 역할: 컨테이너가 실행될 수 있도록 자원을 할당하는 역할을 합니다. 노드 중 하나는 Master Node로 간주되며, 이 노드는 Control Plane의 핵심 구성요소입니다. 일반적으로 Master Node는 클러스터의 API 서버, 스케줄러, 컨트롤러 매니저 등의 역할을 포함합니다.

Control Plane 구성 요소

  1. etcd
    • 역할: 클러스터의 상태를 유지하는 key-value 저장소로, 모든 클러스터 데이터의 지속성을 보장합니다.
  2. Scheduler
    • 역할: 클러스터에서 수행해야 하는 작업의 일정을 관리하여, 각 Pod이 적절한 노드에서 실행되도록 합니다.
  3. Controller Manager
    • 역할: 클러스터의 상태를 모니터링하여, 정의된 상태가 유지되는지 확인합니다.
  4. API Server
    • 역할: kubectl을 통해 들어온 명령을 실행하고 etcd를 업데이트하는 REST API를 제공합니다. kubectl과의 통신은 실제로 이 API Server와 이루어집니다.

Node 구성 요소

  1. kubelet
    • 역할: Control Plane과 Node 간의 통신을 담당하며, Node에서 실행되는 Pod과 컨테이너를 관리합니다.
  2. Container Runtime
    • 역할: 컨테이너를 실행하는 환경을 제공합니다. 예를 들어, Docker가 이에 해당합니다.
  3. kube-proxy
    • 역할: 컨테이너, Pod 및 노드 간의 통신을 가능하게 합니다.

Kubernetes 객체

1. Pod

  • 정의: 실행할 이미지의 래퍼(wrapper)로, 애플리케이션 컨테이너와 공유 자원(볼륨, 네트워크 등)의 그룹을 의미합니다.
  • 역할: Pod yaml 파일을 통해 실행할 컨테이너의 이름, 사용할 이미지, 초기 및 최대 메모리 등을 정의합니다. Pod을 kubectl을 통해 생성하면 실제 Node에서 Pod이 실행됩니다.

2. ReplicaSet

  • 역할: 동일한 여러 Pod이 동시에 실행되도록 관리합니다.

3. Deployment

  • 역할: ReplicaSet 이후에 소개되었으며, ReplicaSet과 동일한 기능을 제공하면서 추가 기능을 제공합니다. 내부적으로는 ReplicaSet이 동작합니다.
  • 내부적으론 ReplicaSet이 동작합니다

4. Service

  • 정의: Pod에 접근하기 위한 안정적인 주소(IP Address)를 제공합니다. Pod가 다시 생성될 때마다 주소가 변경되기 때문에 Service가 필요합니다.
  • 유형:
    • ClusterIP Service: 클러스터 내에서의 접근을 제공합니다.
    • NodePort Service: 클러스터 외부에서 접근할 수 있도록 합니다. NodePort의 범위는 30000에서 32767입니다.

5. Namespace

  • 역할: 클러스터가 많아질 때, 목적에 따라 그룹화할 수 있도록 도와줍니다. 예를 들어, 개발 환경을 분리하거나 팀별로 애플리케이션을 그룹화할 수 있습니다. Namespace를 지정하지 않으면 자동으로 “default” Namespace가 사용됩니다.

정리

Kubernetes는 클러스터에서 컨테이너의 상태를 유지하고 관리하는 도구이다.
Kubernetes는 비교적 대규모 분산 애플리케이션을 효율적으로 관리하는 데 유용하다.

다음은 Node.js 공식 문서에서 node 및 express를 이용해 단순한 앱을 컨테이너화 하는 튜토리얼입니다.  아직 앞에 학습한 내용들을 미처 정리하지 못했지만 오늘처럼 직접 해보면서 학습하는 경우엔 앱을 또 만들어야 하는 상황이 생기지 않도록 바로바로 블로그에 정리하려 합니다.  아래는 Node.js 공식 문서의 도커라이징 링크입니다. 

https://nodejs.org/ko/docs/guides/nodejs-docker-webapp

 

Node.js 웹 앱의 도커라이징 | Node.js

Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.

nodejs.org


Node.js 앱 만들기

먼저 Application, 의존성을 알려주는 package.json 파일을 아래와 같이 생성하도록 합니다.

<package.json>

{
    "name": "docker_web_app",
    "version": "1.0.0",
    "description": "Node.js on Docker",
    "author": "First Last <first.last@example.com>",
    "main": "server.js",
    "scripts": {
        "start": "node server.js"
    },
    "dependencies": {
        "express": "^4.16.1"
    }
}

 위와 같이 작성이 끝났으면 저장 후 터미널에서 npm install을 통해 모듈들을 설치해 줘야겠죠?

npm install을 통해 필요한 모듈들을 설치해 줍시다!

 


다음은 server.js 파일입니다.

<server.js>

"use strict";

const express = require("express");

// 상수
const PORT = 3000;
const HOST = '0.0.0.0';
// 앱
const app = express();
app.get("/", (req, res) => {
    res.send("Hello Guys~");
});

app.listen(PORT, HOST, () => {
    console.log(`Running on http://${HOST}:${PORT}`);
});

그리고 dockerfile 파일을 생성합니다.

<dockerfile>

FROM node:16

# 앱 디렉터리 생성
WORKDIR /usr/src/app

# 앱 의존성 설치
# 가능한 경우(npm@5+) package.json과 package-lock.json을 모두 복사하기 위해
# 와일드카드를 사용
COPY package*.json ./

RUN npm install
# 프로덕션을 위한 코드를 빌드하는 경우에 아래 코드.
# RUN npm ci --only=production -> npm ci 커맨드는 프로덕션 환경을 위한 더 빠르고 신뢰할 수 있고 재현 가능한 빌드를 제공. 

# 앱 소스 추가 => 이미지 내 앱 소스코드를 넣기 위해 COPY 지시어를 사용.
COPY . .
# 앱이 3000포트에 바인딩 되어 있으므로 EXPOSE를 사용해 docker 데몬에 맵핑.
EXPOSE 3000  
# 서버를 구동하도록 명령어 'node server.js'를 실행.
CMD [ "node", "server.js" ]

 


그리고 다음 명령어를 해당 디렉터리 안에서 입력하여 이미지를 빌드해 줍니다. *유저 이름은 dockerhub계정 이름입니다.

docker build . -t <유저이름>/node-web-app

도커 Images를 보면 이미지가 업로드되어 있습니다. 터미널에서 확인하는 방법은 터미널에서 docker images를 입력하면 됩니다.


다음은 컨테너의 3000번 포트를 local의 5000번 포트로 매핑하는 코드입니다.

docker run -p 5000:3000 -d <유저 이름>/node-web-app


-d 옵션은 데몬으로 실행하는 옵션(백그라운드에서 실행합니다).

-p 옵션은 호스트, 컨테이너의 포트를 연결해 주는 옵션입니다.

 

컨테이너 내부는 3000번 포트로 위 앱이 실행되고 있고 호스트의 5000번 포트에 이것을 매핑하여 localhost:5000으로 접근하면 컨테이너 3000번 포트에서 실행되는 프로그램을 볼 수 있도록 하는 것입니다.

위는 생성된 컨테이너를 확인하는 창입니다.



이제 localhost:5000으로 접속하면 다음과 같이 결과를 얻을 수 있습니다.

 

후.. 처음엔 공식문서를 따라 하다가 블로그를 참고하며  docker 실습을 해보았는데 그냥 끝까지 공식문서를 따라 할걸 그랬습니다.. 계속 image와 container를 정상적으로 만들었음에도 오류가 나서 처음부터 공식문서를 따라 다시 만들다 보니 도중에 터미널 명령어를 입력하는 과정에서 실수를 해서 그랬단 걸 너무 늦게 깨달아버렸다는.. ㅜㅜ
그리고 블로그들에 나와있는 코드와 현 공식 문서의 코드가 미미한 차이가 있더라고요. 역시 문서를 보는 걸 버릇화 해야겠습니다 ㅎㅎ 

 

+ Recent posts