원래 오늘 Docker & K8s 실습 (4)를 진행해야 하는데, 노트북으로 강의를 수강하게 되어 실습이 없는 (5)를 먼저 수강하게 되었다.
K8s 맛보기
K8s의 학습은 어렵기 때문에 왜 필요하고 어떤 기능을 해주는지, 그리고 Docker와 어떻게 서로 보완적인 관계인지 이해와 기본적인 사용법을 익히는 것을 목표로 한다.
Docker 정리
Docker 관련 용어
- Docker Image (Dockerfile)
- Docker Container
- Docker Hub (hub.docker.com)
- Docker Compose
- 다수의 Docker Container 관리
- docker-compose.yml (servises, networks, volumes)
실제 Production 환경에서 사용할 때 유념할 점
- Docker volumes
- Host volume은 보통 개발 시 소스코드를 바로 Container안으로 마운트 하기 위함
- Production에서는 named volumes를 써야 함
- Docker Container는 read-only로 사용
- 내용을 바꿔야 한다면 실행 중인 컨테이너를 수정하지 말 것
- 항상 이미지를 새로 빌드하고 다시 컨테이너로 새로 론치
- 자동화가 중요해짐 : CI / CD 프로세스
- 다수의 Docker Container를 다수의 호스트에서 실행
- 용량 문제
- Fail-over, Fail-tolerant
생산성 향상을 위해 사용
- 개발 시 모듈을 Docker 이미지로 받아와서 Container로 실행
- 여러 소프트웨어를 연동해서 개발 시 docker-compose로 설정
- 장점
- 일관된 방식으로 소프트웨어 설치
- 분리된 충돌없는 환경에서 소프트웨어 설치/실행
서버 관리의 어려움
관리할 서버의 수 증가
- 어느 서버 / 서비스에 문제가 있는지 알기 힘듦
- 새로 들어온 사람이 이해하기 힘듦
- 문제들은 밤낮없이 연휴에도 발생
해결 방안 (1) - 문서화
- 서비스 상황과 셋업 방법 문서화
- 다양한 문제 발생 시 해결 방법 문서화
- 문서를 상황에 맞게 업데이트하는 것은 엄청난 노력
해결 방안 (2) - 문서화 대신 코드
- Intrastructure As Code : DevOps 엔지니어가 꼭 알아야 하는 기술 (Chef, Puppet, Ansible, Terraform 등)
- 문서보다는 코드로 관리
- 대화형 명령보다는 자동화된 스크립트로 해결
- 다수의 서버에서 명령을 대신 실행
- 단점
- Learning Curve가 높음 = 배우기가 힘듦
- 설치 시 소프트웨어 충돌 문제는 크게 도움이 안 됨
해결 방안 (3) - Virtual Machine 도입
- 소프트웨어 충돌 해결을 위해 VM 사용
- 단점
- 전반적으로 리소스 소비가 크고 느림
- 특정 VM 벤더 혹은 클라우드에게 종속되어 버림 (Lock-in)
해결 방안 (4) - Docker 도입
- 모든 소프트웨어를 Docker Image로 만들면 어디서든 동작
- VM에 비해 리소스 낭비가 적고 실행 시간도 빠름
- 오픈소스라 클라우드나 특정 업체 Lock-in 이슈도 없음
- Docker Container 수가 늘어나면서 관리가 힘들어짐
Container Orchestration 소개
다수의 Container를 관리하기 위해 다양한 문제들을 효율적으로 관리하기 위한 도구를 Container Orchestration이라고 부른다.
Container Orchestration 기능 - 요약
- 한 클러스터 안에 다양한 서비스들이 공존 (DB, Web Server, 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 등의 기능 제공
- 전체 서비스 분석
K8s 소개
Kubernetes 소개
- 컨테이너 기반 서비스 배포 / 스케일 / 관리 자동화를 해주는 오픈소스 프레임워크
- 클라우드나 on-prem 모두 동작
- 물리서버나 가상서버 위에서 동작
- 주로 Docker Container 대상
- 지금은 Cloud Native Computing Foundation이라는 비영리 단체에서 운영
- 가장 많이 사용되는 컨테이너 관리 시스템
- 사용 회사와 커뮤니티 활동이 활발
- 카카오, 네이버, 라인, 쿠팡 등의 국내 업체도 활용
- K8s 위에 기능을 추가한 Container Orchestration 툴이 생김
- 확장성이 좋아 다양한 환경에서 사용
- 머신러닝 : Kubeflow
- CI / CD : Tekton
- Service Mesh : Istio
- Serverless : Kubeless
K8s 아키텍처
기본 구조 : 마스터 - 노드
- High Availability : 여러 개의 서버를 구성하여 서버 하나가 다운돼도 서비스가 계속 운영되도록 하는 것
- 노드 : 물리 서버이거나 가상 서버
- 클러스터 :하나 이상의 노드의 집합
- 마스터 : 클러스터를 관리해 주는 역할 수행
기본 구조 : K8s 프로세스
- Master에는 여러 프로세스가 실행됨
- API Server : kube-apiserver, K8s 클러스터의 엔트리포인트 (Web UI, kubectl (CLI), API)
- Scheduler : Pods 생성과 할당
- Controller Manager : 전체 상황을 모니터링하고 fault tolerance 보장
- etcd : K8s 환경 설정 정보가 저장되는 key / value 스토어에 백업
- Master는 High Availability가 중요
Pod
- K8s 사용자가 사용하는 가장 작은 빌딩 블록
- K8s는 컨테이너를 바로 다루지 않음
- 1 Pod = 보통은 하나의 Container로 구성
- Pod는 네트워크 주소를 갖는 self-contained server
Kubectl : 커맨드라인 툴
- kubectl run hello-minikube
- kubectl cluster-info
- kubectl get node
K8s / Docker 사용 예 살펴보기
'[프로그래머스] 데이터 엔지니어링 데브코스 3기 > TIL(Today I Learn)' 카테고리의 다른 글
[TIL - 51일 차] Airflow 고급기능과 DBT, 데이터 디스커버리 (1) (0) | 2024.06.03 |
---|---|
[TIL - 50일 차] Docker & K8S 실습 (4) (0) | 2024.05.31 |
[TIL - 48일 차] Docker & K8S 실습 (3) (0) | 2024.05.29 |
[TIL - 47일 차] Docker & K8S 실습 (2) (0) | 2024.05.28 |
[TIL - 46일 차] Docker & K8S 실습 (1) (0) | 2024.05.27 |