본문 바로가기

데이터엔지니어링

[9주차] Docker & K8s (5)

🙂 Docker 정리

✔ 관련 용어

  • Docker Image
    • Dockerfile
  • Docker Container
  • Docker Hub
  • Docker Compose
    • 다수의 Docker Container를 관리
    • docker-compose.yml
      • Services
      • Networks
      • Volumes: host(개발용) / anonymous / named volumes

🍦 Production 환경 사용시 주의 점

  • Docker Volumes
    • Host Volume은 보통 개발 시 소스코드를 바로 container 안으로 마운트하기 위함
    • Production에서는 named volumes를 써야함
  • Docker Container는 read-only로 사용
    • 내용을 바꿔야할 때 실행 중인 컨테이너 수정 X
    • 새로 이미지를 빌드해서 launch
    • 자동화: CI/CD 프로세스
  • 다수의 Docker Container들을 다수의 호스트에서 실행 필요
    • 용량 문제와 Fail-over

 

🍦 Docker

  • 개발 시 필요 모듈을 Docker 이미지로 받아와서 Container로 실행
  • 여러 SW를 연동해서 개발 시 이것들을 docker-compose로 설정

장점

  • 일관된 방식으로 SW 설치
  • 분리된 충돌없는 환경에서 SW 설치/실행

🙂 서버 관리의 어려움

✔ 관리해야하는 서버 수 증가

  • 어느 서버에 문제가 있는지
  • 어느 서비스가 문제를 갖고 있는지
  • 이런 문제를 얼마나 빨리 해결할 수 있는지
  • 주니어 온보딩

 

✔ 해결방안

🍦 문서화

  • 지금 서비스 상황과 셋업 방법 문서화
  • 다양한 문제 발생시 해결 방법 문서화
  • 문서를 현재 상황에 맞게 업데이트하는 것은 힘듦
  • 상황에 따라 의미없는 경우 多

🍦 코드 작업

  • Infrastructure As Code: DevOps 엔지니어의 기술
  • 문서보다는 코드로 관리
    • 대화형 명령보다는 자동화된 스크립트로 해결
    • 다수의 서버 명령 대신 실행
  • 다양한 툴
    • Chef
    • Puppet
    • Ansible
    • Terraform
  • 단점
    • Learning curve가 높음
    • 설치 시 SW 충돌 문제에는 도움 X

🍦 Virtual Machine

  • SW 충돌 해결을 위해 VM 사용
    • 한 Physical Server에 다수의 VM을 올리고 서비스별로 VM 하나씩 할당
  • 단점
    • VM이 전반적으로 리소스 소비가 크고 느림
    • 결정적으로 특정 VM 벤더 혹은 클라우드에 종속 (Lock-in)

🍦 Docker

  • 모든 SW를 Docker Image로 만들면 어디서든 동작
    • 기본적으로 Linux에 최적
  • VM에 비해 리소스 낭비도 적고 실행 시간 빠름
  • 오픈소스라 Lock-in 이슈 X
  • Container 수에 따라 관리가 힘들다는 점이 유일한 단점
  • 다수의 Docker Image를 더 많은 수의 Docker Container로 실행관리가 필요 => Containerization

🙂 Container Orchestration

다수의 Container를 잘 관리하는 것

 

한 클러스터 안에 다양한 서비스가 공존. DB, Web Service, Backend, ...

 

✔ SW 배포

  • 서비스 이미지를 Container로 배포
  • 이상이 감지되면 이전 안정 버전으로 롤백

✔ 스케일링

  • 특정 서비스의 Container 수를 쉽게 늘리고 줄이는 것
  • 서버의 utilization도 고려

✔ 네트워크

  • 서비스가 다수의 컨테이너로 나눠지면서 이들을 대표하는 Load Balancer를 만들어주어야 함
  • 서비스들간에 서로를 쉽게 찾을 수 있어야 함 -> Service Discovery

✔ 인사이트

  • 노드/컨테이너 문제시 해결
  • Logging/Analytics 등의 기능 제공
    • 외부 서비스 Plug and Play
  • 전체 서비스 분석
    • 시각화
    • 문제 분석

🙂 Kubernetes (K8s)

  • 컨테이너 기반 서비스 배포/스케일/관리 자동화를 해주는 오픈소스 Framework
  • 가장 많이 사용하는 Orchestration 시스템
  • 확장성이 좋음
    • 머신러닝: Kubeflow
    • CI/CD: tekton
    • Service Mesh: Istio
    • Serveless: Kubeless
  • 다수의 서버에 컨테이너 기반 프로그램을 실행하고 관리
    • 컨테이너 기반 프로그램 == Docker Container
    • 보통 Docker와 K8s는 같이 사용
    • Pod: 같은 디스크와 NW를 공유하는 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 사용

🍦 Kubectl: 커맨드라인 툴

  • kubectl run hello-minikube
  • kubectl cluster-info
  • kubectl get node

🍦 Pod란 무엇인가?

  • K8s 사용자가 사용하는 가장 작은 빌딩 블록
  • K8s 사용시 컨테이너를 바로 다루지 않음
  • 1 Pod = 보통은 하나의 Container로 구성
    • 하나보다 많은 경우에는 help container가 같이 사용
    • 같은 Pod 안에서는 디스크와 NW가 공유
    • Fail-over를 위해 replicas를 지정함
  • Pod는 NW 주소를 갖는 self-contained server

🍦 Pod 생성 예

  • kubectl create -f pod-definition.yml
  • kubectl get pods
  • kubectl describe pod nginx
  • kubectl run nginx --image nginx