기록 블로그

프로그래머스 데브코스-데이터 엔지니어/TIL(Today I Learned)

06/15 50일차 개발환경 구축을 위한 Docker & K8s (5)

usiohc 2023. 6. 16. 17:58

Docker, K8s


주요 메모 사항


이번 강의는 배운내용들 개념 정리에 대해 중점적으로 다뤘음

사실 제목에 K8s라고 적혀있으나 K8s는 너무 방대하고 어려운 개념. -> 아키텍처에 대한 설명만 다룸

 

왜 필요하고 어떤 기능을 해주는지, Docker와 서로 어떤 관계인지 이해하고 기본적인 사용법만 다룸!

 


Docker 정리

경량화되어 있어 빠르고, 독립적인 환경으로 작성되기 때문에 사용, 호환성!

 

Docker 관련 용어들

Docker Image

ㄴ Dockerfile

    ㄴ 이미지를 만들기 위한 파일 (DSL), 그냥 text파일이지만 구성되는 요소들이 많음

ㄴ 하나의 앱을 만들었다고 가정하고 이를 하나의 스냅샷과 같은 이미지를 만드는 것, dockerizing 라고 부름! 

 

 

Docker Container

ㄴ 이미지를 실행하는 컨테이너, 해당 이미지의 기능, 종속성 등을 패키징해 격리된 공간에서 동작시키는 기술

ㄴ volumes 등을 명시하지 않았다면 컨테이너를 삭제했을때, 기록된 데이터들은 모두 사라짐!

 

Docker Hub

 

Docker Compose

ㄴ 다수의 Docker Container들을 관리하는 간단히 할 수 있음

ㄴ docker-compose.yml

    ㄴ Services, Networks, Volumes (host/anonymous/named volumes)

 

 

 

Docker를 실제 Production 환경에서 사용할 때 유념할 점

Docker volumes

ㄴ Host volume은 보통 개발시 소스코드를 바로 container안으로 마운트하기 위함

ㄴ Production에서는 named volumes를 써야함

 

Docker container는 read-only로 사용

ㄴ 내용을 바꿔야한다면 실행 중인 컨테이너를 수정하지 말 것

ㄴ 항상 이미지를 새로 빌드하고 다시 컨테이너들을 새로 론치

ㄴ 자동화가 중요해짐: CI/CD 프로세스

 

다수의 Docker Container들을 다수의 호스트들에서 실행 필요

ㄴ 용량 문제와 Fail-over (혹은 fail-tolerant)

 

 

 

 

 

Docker를 개인 생산성을 향상을 위해서 사용

개발시 필요한 모듈을 Docker 이미지로 받아와서 Container로 실행

여러 소프트웨어를 연동해서 개발시 이 것들을 docker-compose로 설정

 

장점 

일관된 방식으로 소프트웨어 설치 (문서화하고 매뉴얼하게 설치 불필요)

분리된 충돌없는 환경에서 소프트웨어 설치/실행

 

 


서버 관리의 어려움

복잡한 다수의 서버로 구성된 시스템을 효율적으로 관리한다는 것은 어려운 일

 

 

관리해야하는 서버의 수가 늘어나면? 문제점이 많아짐

1. 어느 서버가 문제가 있는지?

2. 어느 서비스가 문제를 갖고 있는지?

3. 이런 문제들을 얼마나 빨리 알고 해결할 수 있을지?

4. 새로 들어온 사람이나 주니어를 잘 온보딩하려면?

5. 문제들은 밤낮없이 연휴에도 발생

 

 

이를 해결하기 위한 방법

해결방안 1. 문서화

지금 서비스 상황과 셋업 방법 문서화

다양한 문제 발생시 해결 방법 문서화

문서를 현재 상황에 맞게 업데이트하는 것은 엄청난 노력

또한 상황에 따라 의미가 없는 경우도 많음

또 몇백대의 서버를 일일히 관리하고 명령을 실행한다는 것은 거의 불가능

 

 

 

해결방안 2. 문서화가 아닌 코드로 대신

ㄴ Infrastructure As Code라고 함, DevOps 엔지니어가 꼭 알아야하는 기술

    ㄴ 다만 해당 작업, 툴은 배우기가 함듬, Junior가 경험하기 힘듬

 

문서보다는 코드로 관리

ㄴ 대화형 명령보다는 자동화된 스크립트로 해결

ㄴ 다수의 서버들에 명령을 대신 실행해줌

 

다양한 툴들이 쏟아져 나옴

ㄴ Chef

ㄴ Pupet

ㄴ Ansible

ㄴ Terraform 등

 

단점

ㄴ Learning curve가 높음

ㄴ 설치시 소프트웨어 충돌 문제에는 크게 도움 안됨!

 

 

 

해결방안 3. Virtual Machine의 도입

소프트웨어 충돌 해결을 위해 VM을 사용

ㄴ 한 Physical Server에 다수의 VM을 올리고 서비스별로 VM을 하나씩 할당

 

단점

ㄴ VM이 전반적으로 리소스 소비가 크고 느림, 또는 비용

ㄴ 결정적으로 특정 VM 벤더 혹은 클라우드에게 종속되어 버림 (Lock-in)

 

 

 

해결방안 4. Docker의 도입

모든 소프트웨어를 Docker Image로 만들면 어디서건 동작

ㄴ 기본적으로 리눅스 환경에 최적

 

VM에 비해 리소스 낭비도 적고 실행 시간도 빠름

 

거기다가 오픈소스라 클라우드나 특정업체 Lock-in 이슈도 없음

 

거의 단점이 없음

ㄴ 워낙 경량화 되어있는 툴, Docker Container의 수가 늘어나면서 관리가 힘들다는 점이 부각됨

 

이런 문제점으로부터 K8s가 탄생

 

 

다시 한번 Docker Container의 장점

Container 생성이 쉽고 빠름 (VM과 비교)

Image를 통해 버전 관리를 하고 배포하고 문제시 롤백이 용이

 

사용 언어등의 환경에 따른 관리방법에 차이가 없음

ㄴ 개발, 빌드, 등록, 실행 절차가 일관되게 만들어짐 (Dev, Test, Production)

ㄴ 개인컴퓨터이건 프로덕션 환경이나 동일

 

오픈소스이기에 특정 클라우드 벤더나 업체와 독립적

 

 

그래서 Docker는 이제 서비스 배포의 기본이 되었음

많은 DevOps 엔지니어들은 모든 서비스를 Docker Image로 만들어서 운영

즉 빌드 프로세스 출력물은 Docker Image가 되고 있음

ㄴ Github에서 빌드 프로세스를 보면 docker image를 만들고 이를 내부 Registry에 등록하는 것이 일반적

 

그러다보니 다수의 Docker Image들을 더 많은 수의 Docker Container로 실행 관리하는 것이 필요해짐

 

모든 것의 컨테이너화 -> 이를 Containerization이라고 부름

 

Docker를 기본으로 서비스 배포 과정

 

 

 

하지만 컨테이너의 수가 기하급수적으로 늘어남!

Docker Container를 효율적으로 관리할 수 있는 도구가 필요함 -> K8s

ㄴ 다수의 컨테이너를 동시에 관리

ㄴ 놀고 있는 서버나 너무 바쁜 서버를 어떻게 알아낼지?

ㄴ 마이크로서비스의 등장으로 인한 서비스 수 증가로 어떤 서비스들이 있는지 쉽게 찾을 수 있는 방법이 필요

ㄴ 모니터링을 어떻게 할 것인가?

ㄴ 특정 서비스의 컨테이너 수를 탄력적으로 어떻게 운영할 것인가?

 

 

마이크로서비스란?

웹 서비스를 다수의 작은 서비스(microservice)들로 구현하는 방식

각 서비스들은 팀 단위로 원하는 언어/기술로 개발하는 자율성을 가짐

각 서비스들은 계약관계로 지켜야하는 책임이 있고 서비스 정보를 등록해야함 - Service Registry

 

 

 


Container Orchestration 소개

멘토님이 추천해주신 유튜브도 좋다!

다수의 Container들을 잘 관리해보자

이걸 Container Orchestration이라고 부름

앞서 언급했던 다양한 문제들을 효율적으로 관리하기 위한 도구 -> DevOps팀의 노가다를 줄이자!

 

 

Container Orchestration 기능 - 요약

한 클러스터 안에 다양한 서비스들이 공존 DB, Web Service, Backend, …

ㄴ 자원 요청을 받아 마스터가 자원을 할당

 

다양한 기능 제공: 배포, 스케일링, 네트워크, 인사이트 등등

 

 

Container Orchestration 기능 - 소프트웨어 배포

서비스 이미지를 Container로 배포

 

이상이 감지되면 이전 안정 버전으로 롤백

ㄴ v1에서 v2로 배포가 되는 경우 문제가 생기면 v1으로 롤백

ㄴ Container의 수가 많을수록 큰 이슈가 됨

ㄴ DevOps 팀 관점에서 보면 가장 중요한 기능

 

 

 

 

Container Orchestration 기능 - 스케일링

특정 서비스의 Container 수를 쉽게 늘리고 줄이는 것

이때 서버의 utilization도 고려

 

 

Container Orchestration 기능 - 네트워크

서비스가 다수의 컨테이너로 나눠지면서 이들을 대표하는 Load Balancer를 만들어주어야 함

서비스들간에 서로를 쉽게 찾을 수있어야함 - 서비스 디스커버리

 

 

Container Orchestration 기능 - 인사이트

노드/컨테이너 문제시 해결

ㄴ 서버 2의 F가 다운되면 이를 서버 3에 재실행

ㄴ F 로드밸런서 정보도 맞게 수정

 

Logging/Analytics 등등의 기능 제공

ㄴ 외부 서비스 plug and play

 

전체 서비스 분석

ㄴ 시각화

ㄴ 문제 분석

 

 

 

Container Orchestration 툴들이 쏟아져나옴

K8s를 중심으로 정리가 되고 있고, 모든 클라우드 업체들은 K8s 관련 서비스를 내놓고 있음

ㄴ EKS, AKS, GKE

  • Mesos
  • Marathon
  • DEIS
  • Rancher
  • Nomad
  • Docker Swarm
  • K8s

 


Kubernetes (K8s)

Container Orchestration 툴 중 왜 K8s가 가장 널리 사용되는지 알아보자

 

Kubernetes (K8s) 소개

컨테이너 기반 서비스 배포/스케일/관리 자동화를 해주는 오픈소스 프레임웍

ㄴ 구글에서 사용하던 Borg를 서비스를 오픈소스화함 (2015년)

ㄴ 클라우드나 on-prem 모두에서 잘 동작

ㄴ 어느 컨테이너이면 가능하지만 주로 Docker Container들이 대상이 됨

ㄴ 물리서버나 가상서버 위에서 모두 동작

 

지금은 Cloud Native Computing Foundation이라는 비영리 단체에서 운영

ㄴ 목적 : 클라우드 환경에서 어떻게 소프트웨어를 배포하는 것이 효율적일까?

    ㄴ 컨테이너, 서비스메시, 마이크로서비스, API, DevOps, On-demand Infra

 

가장 많이 사용되는 컨테이너 관리 (Orchestration) 시스템

ㄴ 사용회사와 커뮤니티 활동이 굉장히 많고 활발

ㄴ 카카오, 네이버, 라인, 쿠팡 등의 국내 업체도 활발히 사용

ㄴ K8s위에 기능을 추가한 Container Orchestration 툴들이 생각남

ㄴ 모든 글로벌 클라우드 업체들이 지원: EKS, AKS, GKE

 

확장성이 좋아서 다양한 환경에서 사용됨

머신러닝: Kubeflow

CI/CD: Tekton

Service Mesh: Istio

Serverless: Kubeless

 

다수의 서버에 컨테이너 기반 프로그램을 실행하고 관리

ㄴ 컨테이너 기반 프로그램 == Docker Container

ㄴ 보통 Docker와 K8S는 같이 사용됨

ㄴ 최소실행 유닛 == Pod : 같은 디스크와 네트웍을 공유하는 1+ 컨테이너들의 집합

 

 

 


K8s 아키텍처

K8s의 기본 구조

 

기본 구조: 마스터-노드

노드는 물리서버이거나 가상서버

클러스터는 1+ 노드의 집합

마스터는 클러스터는 관리해주는 역할 수행

 

 

 

 

기본 구조: K8S 프로세스들

Master안에는 여러 프로세스들이 돌고 있음

ㄴ API Server (Container로 동작): kube-apiserver

    ㄴ Entrypoint of K8S cluster

    ㄴ Web UI, CLI (kubectl), API

|

ㄴ Scheduler

    ㄴ Pods 생성과 할당 (노드들의 상황 고려 - utilization)

|

ㄴ Controller Manager

    ㄴ 전체 상황을 모니터링하고 fault tolerance 보장

|

ㄴ Master는 High Availability가 중요함 -> 예) 새롭게 배포를 할때 실행중인 서비스가 중단되지 않게

|

ㄴ etcd

    ㄴ K8S 환경 설정 정보가 저장되는 key/value 스토어로 백업됨

 

Controller runtime - 대부분 Docker가 사용됨

 

 

Pod란 무엇인가?

다시 한번 K8s 사용시 컨테이너를 바로 다루지 않음

Pod: K8S 사용자가 사용하는 가장 작은 빌딩 블록

 

1 Pod = 보통은 하나의 container로 구성

ㄴ 하나보다 많은 경우에는 보통 helper container가 같이 사용됨

ㄴ 같은 Pod 안에서는 디스크와 네트워크가 공유됨

ㄴ Fail-over를 위해 replicas를 지정하는 것이 일반적

    ㄴ 다양한 방법으로 복제본을 유지

 

Pod는 네트웍 주소를 갖는 self-contained server

 

 

 

YAML 환경 설정 예

Pod도 docker container와 같이 자주 삭제되고 생성되는데, Data의 유지가 중요해짐

ㄴ Volumes과 같은 개념을 설명해주시는 듯

ㄴ 서비스를 관리하기 위한 deployment라고 하는 기능이 존재

 

 


K8s/Docker 사용 예 살펴보기

케이스 #1 - Airflow - 쏘카 Airflow Containerzation 이야기

사실 airflow와 docker을 배우면서 이미 봤었던 포스팅이었는데, MAX님도 강의에서 추천해주셨다!!

 

https://tech.socarcorp.kr/data/2021/06/01/data-engineering-with-airflow.html

 

 

케이스 #2 - Airflow - 버킷플레이스 Airflow Containerzation 이야기

https://www.bucketplace.com/post/2021-04-13-%EB%B2%84%ED%82%B7%ED%94%8C%EB%A0%88%EC%9D%B4%EC%8A%A4-airflow-%EB%8F%84%EC%9E%85%EA%B8%B0/

 

 

 

어떤 부분을 학습하는 것이 좋을까?

만들어진 Docker Image를 어떻게 배포하고 스케일할 것인가?

ㄴ Docker를 모르면 K8s를 이해하기 힘듬

 

먼저 docker-compose를 통해 Multi-Container 관리를 하는 것을 배우는 것이 좋음

ㄴ 우리는 이미 앞에서 배웠음

ㄴ 컨테이너를 계속해서 추가한다면 K8s를 통해 관리하게 됨

 

다음으로 K8s를 사용하여 Container를 관리하고 배포하기

ㄴ 실습 환경 설정, kubectl 사용, 개념 이해 (pod, deployment, service 등등)

 

네트워크 관련해서 외부와 연결 설정하기 - 도커와 비교해 3~4배 더 복잡함

ㄴ Cluster IP, NodePort, Load Balancer, Ingress, 서비스 타입, 서비스 디스커버리 등등

 

스케일 아웃하기

ㄴ 부하에 따라서 컨테이너 수 조정 (Auto-Scaling, 최소 리소스 설정 등등)

 

 

Docker/K8s에 대해 더 공부하고 싶다면?

Kubernetes for the Absolute Beginners - Hands-on:

https://www.udemy.com/course/learn-kubernetes/

ㄴ 초보자가 공부하고 실습하기 좋은 내용으로 구성되어 있음

 

Docker and Kubernetes: The Complete Guide

https://www.udemy.com/course/docker-and-kubernetes-the-complete-guide/

 

 


공부하며 어려웠던 내용

K8s의 개념과 탄생 배경에 대해서는 이해하겠는데, 실제 비지니스 레벨에서 사용할 때의 예시가 궁금해져서 찾아봤다. -> 근데 뭔가 자세하게 로직을 다뤄주지 않아서 확실하게 이해가 되지 않았