주니어 데이터 엔지니어 우솨's 개발일지

데이터 엔지니어링 50일차 TIL 본문

데브코스

데이터 엔지니어링 50일차 TIL

우솨 2024. 6. 5. 19:34

학습내용

Docker 사용시 유의점
- Docker Volumes
    - Host volume은 보통 개발시 소스코드를 바로  ontainer안으로 마운트 하기 위함
    - Production에서는 named volumes를 써야한다
- Docker container는 read-only로 사용한다
    - 내용을 바꿔야한다면 실행 중인 컨테이너를 수정하지 말 것
    - 항상 이미지를 새로 빌드하고 다시 컨테이너들을 새로 론치한다
    - 자동화가 중요하다 : CI/CD 프로세스
- 다수의 Docker Container들을 다수의 호스트들에서 실행 필요
    - 용량 문제와 Fail-over(fail-tolerant)

관리해야하는 서버의 수가 늘어난다면?
해결방안
1. 문서화
    - 지금 서비스 상황과 셋업 방법 문서화
    - 다양한 문제 발생시 해결 방법 문서화
=> 단점 : 완벽한 문서화는 거의 불가능하다
2. 코드로 대신하기
- Infrastru ture As Code : DevOps엔지니어가 꼭 알아야하는 기술
- 문서보다는 코드로 관리
    - Chef, Puppet, Ansible, Terraform 등의 다양한 툴을 사용
=> 단점 : Learning curve가 높다
             설치시 소프트웨어 충돌 문제에는 큰 효과가 없다.
3. Vitrual Machine의 도입
- 소프트웨어 충돌해결을 위해 VM을 사용
    - 한 Physical Server에 다수의 VM을 올리고 서비스별로 VM을 하나씩 할당
=> 단점 : VM이 전반적으로 리소스 소비가 크고 느리다
             결정적으로 특정 VM 벤더 혹은 클라우드에게 종속되어 버림(Lock-in)
4. Docker의 도입
- 모든 소프트웨어를 Docker Image로 만들면 어디서건 동작 가능
    - 기본적으로 리눅스 환경에 최적화되어 있다
- VM에 비해 리소스 낭비도 적고 실행 시간도 빠르다
=> 단점 : Docker Container의 수가 늘어나면서 관리가 힘들다는 점이 부각되고 있다.

Container-Orchestration
: 다수의 container들을 관리하는 방식
- 다양한 문제들을 효율적으로 관리하기 위한 도구
1. 소프트웨어 배포 기능
- 서비스 이미지를 Container로 배포
- 이상이 감지되면 이전 안정 버전으로 롤백
    - v1에서 v2로 배포가 되는 경우 문제가 생기면 v1으로 롤백
    - Container의 수가 많을수록 큰 이슈가 된다
    - DevOps팀 관점에서 보면 가장 중요한 기능이다
2. 스케일링 기능
- 특정 서비스의 Container 수를 쉽게 늘리고 줄이는 것
- 이때 서버의 utilization도 고려해야한다
3. 네트워크 기능
- 서비스가 다수의 컨테이너로 나눠지면서 이들을 대표하는 Load Balancer를 만들어 주어야한다.
- 서비스들간에 서로를 쉽게 찾을 수 있어야한다.
    - 서비스 디스커버리
4. 인사이트 기능
- 노드/컨테이너 문제발생시 해결
    - 서버2의 F가 다운되면 이를 서버 3에 재실행
    - F 로드밸런서 정보도 맞게 수정
- Logging/Analytics 등등의 기능 제공
    - 외부 서비스 plug and play
- 전체 서비스 분석
    - 시각화, 문제분석


Container Orchestration 툴의 종류
: Mesos, Marathon, DEIS, Rancher, Nomad, Docker Swarm, K8S
=> K8s를 중심으로 정리가 되고 있고 모든 클라우드 업체들은 K8s관련 서비스를 내고 있다. ex) EKS(AWS), AKS(Azure), GKE(Google)

Kubernetes(K8s)
- 컨테이너 기반 서비스 배포/스케일/관리 자동화를 해주는 오픈소스 플랫폼
    - 구글에서 사용하던 Borg를 서비스를 오픈소스화함
    - 클라우드나 on-prem 모두에서 잘 동작
    - 어느 컨테이너이던지 가능하지만 주로 Docker Container들이 대상이 된다.
    - 물리서버나 가상서버 위에서 모두 동작한다
- 가장 많이 사용되는 컨테이너 관리시스템
    - 사용회사와 커뮤니티 활동이 굉장히 많고 활발하다
    - 카카오, 네이버, 라인, 쿠팡 등의 국내 업체도 활발히 사용
    - K8s위에 기능을 추가한 Container Orchestration 툴들이 생겨남
    - 모든 글로벌 클라우드 업체들이 지원 : EKS, AKS, GKE
- 확장성이 좋아서 다양한 환경에서 사용된다
    - 머신러닝 : Kubeflow
    - CI/CD : Tekton
    - Service Mesh : Istio
    - Serverless : Kubeless
- 다수의 서버에 컨테이너 기반 프로그램을 실행하고 관리
    - 컨테이너 기반 프로그램 == Docker Container
    - 보통 Docker와 K8s는 같이 사용됨
    - Pod : 같은 디스크와 네트웍을 공유하는 하나 혹은 그 이상의 컨테이너들의 집합

K8s의 기본구조
- 마스터-노드 구조
    - Kebelet : 마스터와 통신하는 에이전트
    - 노드는 물리서버이거나 가상서버이다
- 프로세스들
    - API Server(Container로 동작) : Kube-apiserver
        - Entrypoint of K8s Cluster
        - Web UI, CLI(kubectl), API
    - Scheduler : pdos생성과 할당(노드들의 상황 고려 - utilization)
    - Controller Manager : 전체 상황을 모니터링하고 falut tolerance보장
    - 마스터는 High Availablity가 중요하다
    - etcd : K8s 환경설정 정보가 저장되는 key/value 스토어로 백업된다
    - Controller runtime : 대부분 도커가 사용됨

Kubectl 커맨드라인 툴
- Kubectl run 하드이름 : 
- Kubectl cluster-info : 클러스터 상황보기
- Kubectl get node : 노드셋팅 보기

Pod란?
- K8s 사용자가 사용하는 가장 작은 빌딩 블록
- 1 Pod = 보통 하나의 Container로 구성
    - 하나보다 많은 경우에는 보통 helper container가 같이 사용됨
    - 같은 Pod 안에서는 디스크와 네트워크가 공유가 된다
    - Fail-over를 위해 replicas를 지정하는 것이 일반적이다
        - 다양한 방법으로 복제본을 유지
- Pod는 네트워크 주소를 갖는 self-contained server이다


Pod 생성의 예
- Kubectl create -f pod-definition.yml : 하드를 생성
- Kubectl get pods : 지금 돌고 있는 모든 하드를 보여줌
- Kubectl describe pod nginx : nginx하드의 상세한 정보를 보여줌
- Kubectl run nginx --image nginx : 하드를 생성하고 이름을 줌

1. Docker란?
리눅스 컨테이너에 리눅스 어플리케이션을 프로세스 격리기술을 사용하여 더 쉽게 컨테이너로 실행하고 관리할 수 있게 해주는 오픈소스 프로젝트이다. 가볍고 빠른 배포가 장점이다.

2. Docker 용어 정리
    - Docker Image : 애플리케이션 실행에 필요한 모든 것을 포함하는 패키지이다.
    - Dockerfile : Docker Image를 빌드하기 위한 명령어들을 포함한 텍스트 파일이다. Docker build명령어를 사용해 도커 이미지를 생성할 수 있다.
    - Docker Container : 애플리케이션과 그 실행에 필요한 모든 것을 포함하는 가상화된 런타임 환경으로 이미지를 기반으로 생성되며 독립적으로 실행가능하다.
    - Docker Hub (hub.docker.com) : Docker Image를 저장하고 공유할 수 있는 온라인 공간이다. 공개, 개인 이미지를 호스팅하며 이미지를 검색, 다운로드, 업로드 할 수 있다.
    - Docker Compose : 멀티 컨테이너를 사용할 때 정의하고 실행하기 위한 도구이다. docker-compose.yml 파일을 사용하여 구성요소를 정의 할 수 있다.


3. Docker 사용시 주의할 점

: 이미지 크기를 최소화하여 빌드시간과 저장 공간을 절약할 수 있도록하며, 보안패치를 적용하고 신뢰할 수 있는 이미지를 사용할 수 있도록 하며, 민감한 정보를 포함하지 않도록 한다.

4. Kubernetes (K8s) 이란?
컨테이너 기반 서비스 배포/스케일/관리 자동화를 해주는 오픈소스 플랫폼이다.