쌩로그

[Kubernetes] 대세는 쿠버네티스 (초급~중급편) Ch02. [기초편] 다지기 본문

Deploy/Kubernetes

[Kubernetes] 대세는 쿠버네티스 (초급~중급편) Ch02. [기초편] 다지기

.쌩수. 2025. 8. 13. 20:40
반응형

목록

  1. 포스팅 개요
  2. 본론
      2-1. 쿠버네티스가 필요한 이유
      2-2. VM vs Container
      2-3. 쿠버네티스 시작
      2-4. 쿠버네티스 기능
  3. 요약

1. 포스팅 개요

해당 포스팅은 인프런의 일프로님의 대세는 쿠버네티스(초급~중급편)을 학습하며 정리한 글이다.

2. 본론

2-1. 쿠버네티스가 필요한 이유

1. 한 서버에 한 시스템을 올려서 사용하던 방식의 문제

  • A, B, C 세 개의 서비스를 올린다고 했을 때, A 서비스는 낮에 사람들이 몰리고, B 서비스는 점심시간에 사람들이 몰리고, C 서비스는 저녁에 사람들이 몰린다.
  • 사람들이 몰릴 때는 3개의 서버를 띄워야 한다.
  • 그렇기 때문에 총 9개의 서버가 필요하다.
  • 서비스의 버전 업데이트가 필요한 경우 서버를 모두 내렸다가 다시 올려야한다.
    • 무중단 배포일 경우 최소 하나의 서버는 살려놓은 상태에서 서비스를 내렸다가 올리고 내렸다가 올리고 해야한다.

2. 쿠버네티스로 서비스를 운영한다면?

  • 사용량이 많은 시간대만 서버를 띄우도록 하면된다.
  • 즉 사람들이 몰리는 시간대의 서비스를 집중적으로 띄우도록 하고 나머지 두 대를 한 서버 혹은 2 개의 서버에 각각 따로 서비스하면 된다.
  • 즉 4대의 서버로도 충분히 3개의 서비스를 운영할 수 있다.
  • 서비스 버전의 업데이트 경우 블루-그린 배포가 자동이다.
  • 쿠버테니스를 이용하면 유지보수 비용이 줄어들고 이는 서비스가 더욱 커질수록 효과가 더욱 커진다.

2-2. VM vs Container

VM

  • 애플리케이션을 띄우려면(아래서부터 위로)

    • 애플리케이션
    • 게스트 OS
    • Hypervisor
    • 호스트 OS
  • 장점

    • 하나의 VM에 독립적으로 원하는 OS를 띄울 수 있다.
    • 하나의 VM의 보안이 뚫려도 다른 VM은 독립적이므로 보안적으로 컨테이너보다 우수하다.
  • 단점

    • 하나의 애플리케이션을 띄우기 위해서 자원이 컨테이너보다 많이 든다.

Container

  • 애플리케이션을 띄우려면(아래서부터 위로)

    • 애플리케이션
    • 컨테이너(도커)
    • 호스트 OS
  • 장점

    • 호스트의 자원을 사용하기 때문에 VM에 비해 자원 사용량이 적다.
  • 단점

    • 리눅스OS에서 윈도우용 컨테이너를 사용할 수 없다.
    • 하나의 컨테이너가 보안적으로 위험해지면 OS까지 침투할 여지가 있다.
  • 컨테이너 기술로 대표적인 것이 도커가 있다.

  • 도커는 여러 컨테이너간의 자원을 분리해서 쓰도록 한다.

    • namespace와 cgoup를 사용하여 격리를 한다.
      • namespace는 커널에 대한 영역을 분리
      • cgroup은 자원에 대한 영역 분리
  • 컨테이너보다 상위개념은 POD이다.
    • POD 안에 여러 개의 컨테이너를 띄울 수 있다.

2-3. 쿠버네티스 시작

시나리오

    1. 리눅스에서 Node.js를 띄운다.
    1. Docker가 있는 서버로 위에서 띄운 Node.js 앱을 그대로 가져온다.
      • 이때 Node.js가 없어서 애플리케이션이 실행되지 않는다.
      • 이 때 Docker를 이용(DockerHub)해서 위에서 Node.js를 가져와서 애플리케이션을 실행한다.
    1. 쿠버네티스를 이용해서 Node.js를 실행할 것이다.
      • Pod에는 Node.js가 있는 컨테이너를 띄울 것이다.
      • 애플리케이션을 실행하기 위해서 Pod, Service를 띄운다.

환경세팅 전이므로 영상만 봐야한다니...
yaml 파일만 기록한다.

2번의 Node.js를 불러오는 Dockerfile

## Dockerfile
FROM node:slim

EXPOSE 8080

COPY hello.js

CMD node hello.js


## Docker build
$ docker build -t tmpkube/hello .

## 빌드한 이미지 확인
$ docker images

## 도커 푸시
$ docker push tmpkube/hello

## 이미지 실행 
$ docker run -d -p 8080:8080 tmpkube/hello

## 이미지 안의 컨테이너로 접속
$ docker exec -it [컨테이너_ID] /bin/bash

3. 쿠버네티스로 노드로 hello.js를 띄우기

강의에서는 GUI를 보여주고 있다.

# Pod
apiVersion: v1
kind: Pod
metadata:
  name: hello-pod
  lables: 
    app: hello
spec:
  contatiners:
  - name: hello-container
    image: tmpkube/hello
    ports:
    - containerPort: 8000
---
# Service
apiVersion: v1
kind: Service
metadata:
  name: hello-svc
spec:
  selector: # pod의 lables와 매핑됨.
    app: hello
  ports:
  - port: 8200
    targetPort: 8000
  externalIPs:
  - 192.168.x.x

실행

$ kubectl apply -f hello.yaml

2-4. 쿠버네티스 기능

Node

  • 쿠버네티스는 서버 한 대는 마스터 노드 그 외에는 워커 노드로 한다.
  • 이렇게 해서 하나의 클러스터가 구성된다.
  • 마스터는 쿠버네티스의 전반적인 기능을 컨트롤하고, 워커 노드는 자원을 제공한다.
    • 자원을 늘리고 싶다면 노드를 늘리면 된다.

namespace

  • 클러스터 안의 namespace라는 객체가 쿠버네티스 오브젝트들을 독립된 공간으로 분리해준다.
  • namespace 안에는 파드들이 있고, 파드들에게 외부로부터 접근이 가능하도록 IP를 할당해주는 서비스 가 있다.
  • 단, 서로 다른 네임스페이스에 있는 파드들은 연결할 수 없다.
  • 리소스쿼터(ResourceQuota)리미트레인지(LimitRange)를 달아서 하나의 namespace에서 사용할 자원의 양을 한정시킬 수 있다.
    • 파드의 개수, CPU, 메모리 등등

Pod

  • 파드 안에는 여러 개의 컨테이너가 존재한다.
    • 컨테이너에는 하나의 애플리케이션이 동작한다.
    • 그렇기 때문에 하나의 파드에는 여러 개의 애플리케이션이 동작한다.
  • 하나의 파드가 날라가면 데이터가 날라간다.
    • 따라서 볼륨을 만들어서 파드에 연결을 하면 파드가 날라가더라도 데이터를 보존할 수 있다.(도커 볼륨과 같은 기능)
  • 파드를 올릴 때 환경변수, 파일을 바운딩해줄 수 있는데, 이 때 ConfigMap, Secret 을 통해 매핑시켜줄 수 있다.

Controller

  • 파드들을 관리해주는 역할을 한다.
  • 각각의 사용 용도가 다르다.

Replication Controller, ReplicaSet

  • 파드가 죽으면 감지해서 살려주거나 파드의 개수를 늘렸다가 줄일 수 있다(컨트롤한다).
    • 스케일 인/아웃을 해준다.

Deployment

  • 배포 후 파드들을 새 버전으로 업그레이드 해준다.
    • 업그레이드 도중 문제가 생기면 롤백을 다시 쉽게 하도록 해준다.

DaemonSet

  • 한 노드의 파드가 하나씩만 유지가 되도록 해준다.
    • 이렇게 사용해야 하는 모듈이 있다(이후에 나올 듯 하다).

Job

  • 특정 작업만 하고 종료를 시켜야 하는 일을 할 때 파드가 그렇게 동작하도록 한다.
    • 이를 주기적으로 실행할 때는 CronJob을 이용한다.

3. 요약

  • 쿠버네티스를 이용하면 한 서버에 하나의 시스템을 올릴 때보다 자원을 더욱 효율적으로 사용할 수 있고, 유지 보수 비용이 줄어들며, 서비스가 더욱 확장될 때 이 효과는 극대화된다.
  • VM과 컨테이너의 장단점에 대해 알아보았다.
  • 도커와 쿠버네티스 환경에서 Node를 띄우는 yaml을 작성해보았다.
  • 쿠버네티스의 기능에 대해서 알아보았다.
    • Pod
    • namespace
    • Controller
      • Deployment
      • Replication Controller/ReplicaSet
      • Job/CronJob
      • DaemonSet

강의 링크 : https://inf.run/JgZzK

728x90
Comments