🙂 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 스토어로 백업
- API Server (Container로 동작): kube-apiserver
- 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
'데이터엔지니어링' 카테고리의 다른 글
| [10주차] Airflow 고급 기능, DBT와 Data Catalog (4) (1) | 2024.06.07 |
|---|---|
| [10주차] Airflow 고급 기능, DBT와 Data Catalog (3) (1) | 2024.06.05 |
| [9주차] Docker & K8s (4) (0) | 2024.05.30 |
| [9주차] Docker & K8s (3) (0) | 2024.05.29 |
| [9주차] Docker & K8s (2) (0) | 2024.05.28 |