Programming/Others

도커 & 쿠버네티스 설치에 필요한 기본 개념 정리

어쩌다통계 2023. 3. 15. 22:25
728x90

이 글이 도움 되셨다면 광고 클릭 부탁드립니다 : )

 

요즘 모델 서빙을 준비하다 보니 도커와 쿠버네티스 베이스가 필요해 공부하며 정리한 포스트입니다.

 

참고한 도서는 그림과 실습으로 배우는 도커&쿠버네티스이고, Fast campus에서 머신러닝 서비스 구축을 위한
실전 MLOps 강의도 수강하였는데, 도커와 쿠버네티스에 대한 아무런 베이스가 없는 사람들에게 좋은 조합인 것 같습니다.

 

 

http://www.yes24.com/Product/Goods/108431011

 

그림과 실습으로 배우는 도커 & 쿠버네티스 - YES24

컨테이너나 도커를 도통 이해하기 어려운 분들을 위한 본격 도커 입문서!이 책은 컨테이너 기술이 어렵게 느껴지는 엔지니어나 백엔드 기술에 자신이 없는 분들을 위한 도커 입문서다. 자세한

www.yes24.com

https://fastcampus.co.kr/data_online_mlops

 

머신러닝 서비스 구축을 위한 실전 MLOps | 패스트캠퍼스

현직 MLOps 엔지니어에게 MLOps 서비스화 전과정을 배워보세요! 구축부터 배포, 운영 방법까지 모두 알려드립니다. 대표 클라우드 플랫폼별 실습까지 해보면 내 현업에 적용하는 것은 시간 문제!

fastcampus.co.kr

 

 

 

 


 

0. 가상 환경 생성

우선 도커는 리눅스 운영체제에서만 동작하기 때문에 윈도우나 macOS에서 바로 도커를 사용할 수는 없습니다. '가상환경' 위에 리눅스 운영체제를 설치하고 그 위에 도커를 실행하거나 '윈도우용/macOS용 도커 데스크톱'과 같은 패키지를 설치하는 방법이 있습니다. 저는 Virtual Box 7.0에 Ubuntu 20.03 가상환경 만들어서 진행하였습니다.

 

 

1. 도커,  Build Once Run Anywhere

도커는 containerization(컨테이너화)을 위한 도구입니다. 모델 서빙하는 방법 중 하나로 모델러 환경에서 모델 개발을 하고 도커 이미지로 빌드해서 모델&환경이 패키지되어 한번에 전달이 가능하게 합니다.

  • https://docs.docker.com/engine/install/ubuntu/
  • 컨테이너 : 격리된 공간에서 프로세스를 실행시킬 수 있는 기술
  • 도커 이미지 : 어떤 애플리케이션에 대해 단순히 애플리케이션 코드뿐만이 아니라, 그 애플리케이션과 dependent한 모든 것을 함께 패키징한 데이터
  • 도커 파일 : 사용자가 도커 이미지를 쉽게 만들 수 있도록 제송하는 템플릿
  • 도커 파일 생성 -> 도커 이미지 빌드 -> 해당 이미지로 도커 RUN
# Dockerfile 이라는 빈 파일을 생성
$ touch Dockerfile
$ vi Dockerfile
## 아래 내용 작성
    # base image 를 ubuntu 18.04 로 설정
    FROM ubuntu:18.04
    # apt-get update 명령을 실행
    RUN apt-get update
    # DOCKER CONTAINER 가 시작될 때, "Hello 를 출력
    CMD ["echo", "Hello"]
# 이미지 생성
$ docker build --help
# Dockerfile 이 있는 경로에서 다음 명령을 실행
$ docker build -t my-image:v1.0.0 .
# 도커 RUN
$ docker run my-image:v1.0.0
  • 도커 레지스트리 : 도커 이미지 배포 서비스
    • 개발한 모델 도커 이미지를 도커 레지스트리에 push(업로드)
    • 도커 허브에는 공개된 컨테이너 이미지가 모여있어 원하는 컨테이너 이미지를 내려받을 수 있음

 

 

도커의 특징 및 장단점에 대해 간단히 살펴보겠습니다.

  • 특징
    • 독립된 환경 : 독립된 환경 덕분에 '여러 개의 컨테이너를 띄울 수 ' 있으며, '똑같은 애플리케이션도 여러 개 일 수' 있음
    • 이미지 생성 : 교체/업데이트가 쉬우며, 이동성이 좋음
    • 컨테이너에 커널을 포함X : 가벼움
  • 장점
    • 한 대의 물리 서버에 여러 대의 서버를 띄울 수 있음
    • 서버 관리가 용이
    • 다루기 쉬움
  • 단점
    • 리눅스용 소프트웨어만 지원
    • 호스트서버에 문제가 생기면 모든 컨테이너에 영향을 미침 -> 확실한 대책 마련해야 함
    • 컨테이너를 여러 개 사용하는 형태를 가정하기 때문에, 컨테이너 하나를 사용한다면 도커 엔진이 단순한 오버헤드에 지나지 않음

 

 

 

2. 쿠버네티스, k8s

contatiner orchestration을 위한 도구로 쿠버네티스 공식 홈페이지에 대화형 튜토리얼이 잘되어 있어 직접 코드도 쳐보면서 가볍게 접근해 볼 수 있습니다. 쿠버네티스는 선언형 인터페이스로 desired state를 유지하는 것이 주요 컨셉이라고 볼 수 있습니다.

https://kubernetes.io/ko/docs/tutorials/kubernetes-basics/create-cluster/cluster-interactive/

 

쿠버네티스는 여러 대의 물리적 서버가 존재하고 물리적 서버 한 대 한 대마다 제각기 여러 대의 컨테이너를 실행되는 것을 전제로 합니다. 이러한 상황에서 쿠버네티스는 정의 파일(YAML)을 바탕으로 번거로운 컨테이너 생성이나 관리의 수고를 덜어주는 도구라고 볼 수 있습니다.

  • YAML : 데이터 직렬화(서비스간에 data 전송할 때 쓰이는 포맷으로 변환하는 작업)에 쓰이는 포맷/양식, widely-use
# YAML 파일 예시
apiVersion: apps/v1 # kubernetes resource 의 API Version
    kind: Deployment # kubernetes resource name
    metadata: # 메타데이터 : name, namespace, labels, annotations 등을 포함
      name: nginx-deployment
      labels:
        app: nginx
    spec: # 메인 파트 : resource 의 desired state 를 명시
      replicas: 3 # 동일한 template 의 pod 을 3 개 복제본으로 생성
      selector:
        matchLabels:
          app: nginx
      template: # Pod 의 template 을 의미
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx # container 의 이름
            image: nginx:1.14.2 # container 의 image
            ports:
            - containerPort: 80 # container 의 내부 Port

 

쿠버네티스의 클러스터는 사람이 개입하지 않아도 마스터 노드에 설정된 내용에 따라 워커 노드가 관리되며 자율적으로 동작한다고 합니다.

  • 클러스터 : 마스터 노드와 워커 노드로 구성된 일군의 쿠버네티스 시스템
  • 마스터 노드 : 전체적인 제어를 담당, 컨테이너 실행하지 않고 워커 노트에서 실행되는 컨테이너를 관리하는 역할
  • 워커 노드 : 실제 서버에 해당하는 부분으로 동작을 담당, 컨테이너 엔진이 설치되는 곳

 

 

minikubekubectl를 활용하면 간단하게 쿠버네티스 환경을 만들어 볼 수 있습니다.

 

 

 

이어서 쿠버네티스의 구성과 관련된 용어들에 대해 살펴보겠습니다.

  • Pod : 쿠버네티스에서 생성하고 관리할 수 있는 배포 가능한 가장 작은 컴퓨팅 단위
    • https://kubernetes.io/ko/docs/concepts/workloads/pods/
    • Pod단위로 스케줄링, 로드밸런싱, 스케일링 등의 관리 작업을 수행
    • Pod는 Container 를 감싼 개념으로 하나의 Pod 은 한 개의 Container 혹은 여러 개의 Container 로 이루어져 있고 Pod 내부의 여러 Container는 자원을 공유함
    • Stateless(단순 요청에 대한 응답 역할만 수행하고 서버가 클라이언트의 상태를 보존하지 않음) 한 특징을 지니고 있으며, 언제든지 삭제될 수 있는 자원

 

  • Deployment : Pod와 Replicaset(Pod 수 관리)에 대한 관리를 제공하는 단위, 배포를관리하는요소

 

  • Service : 쿠버네티스에 배포한 애플리케이션(Pod)을 외부에서 접근하기 쉽게 추상화한 리소스
    • https://kubernetes.io/ko/docs/concepts/services-networking/service/
    • Pod 은 IP 를 할당받고 생성되지만, 언제든지 죽었다가 다시 살아날 수 있으며, 그 과정에서 IP 는 항상 재할당받기에 고정된 IP 로 원하는 Pod 에 접근할 수는 없음
    • 따라서 클러스터 외부 혹은 내부에서 Pod 에 접근할 때는, Pod 의 IP 가 아닌 Service 를 통해서 접근하는 방식 사용
    • Service 는 고정된 IP 를 가지며, Service 는 하나 혹은 여러 개의 Pod 과 매칭
    • 따라서 클라이언트가 Service 의 주소로 접근하면, 실제로는 Service 에 매칭된 Pod 에 접속 가능하게 됨
    • Service의 주소로 들어오는 통신을 Pod들에 분배해줌

 

  • PVC : stateless 한 Pod 이 영구적으로(persistent) 데이터를 보존하고 싶은 경우 사용하는 리소스
    • docker run 의 -v 옵션인 도커 볼륨과 유사한 역할
    • PV(Persistent Volume) 는 관리자가 생성한 실제 저장 공간의 정보를 담고 있고, PVC(Persistent Volume Claim) 는 사용자가 요청한 저장 공간의 스펙에 대한 정보를 담고 있는 리소스
    • Pod 내부에서 작성한 데이터는 기본적으로 언제든지 사라질 수 있기에, 보존하고 싶은 데이터가 있다면 Pod 에 PVC 를 mount 해서 사용
    • PVC 를 사용하면 여러 pod 간의 data 공유도 쉽게 가능

 

(참고) 도커-쿠버네티스 구조


이상, 도커 & 쿠버네티스 설치에 필요한 기본 개념에 대해 알아보았습니다 : )

반응형