데이터 엔지니어링/클라우드

[초밀착 리눅스] 1. 리눅스 기반 컨테이너 개발 환경 구축

pythaac 2022. 9. 19. 23:32
  1. 전체 강의 개요
  2. 컨테이너 개요
  3. 다중 운영체제
  4. Alpine 리눅스 이미지 만들기

 

전체 강의 개요

인프라 환경의 변화

  • 온프레미스
    - 직접 구매하여 설치/관리
  • 클라우드
    - 필요한 만큼 할당하여 사용한 만큼 비용을 지불
    - API/SDK를 사용하여 모든 자원을 자동화 가능(Teraform)

 

컴퓨팅 환경의 변화

  • 가상머신
    - 하드웨어 가상화
    - 가상머신 단위
  • 컨테이너
    - 운영체제 기반 가상화 기술
    - 컨테이너 단위
    - 빠른 확장성 : 컴퓨터 부팅 -> 운영체제 구동 -> 어플리케이션 실행에서 어플리케이션 실행만으로 변화
    - 리눅스 기반 기술로 자원 격리

 

서버 관리의 변화

  • 쉘 스크립트
    - 스크립트가 어려움
    - 오류 존재 가능
  • 자동화 도구
    - 필요한 부분에 쉘 스크립트 사용
    - 한단계 추상화된 형태로 자원을 기술하는 도구(Ansible)

 

장애 대응의 변화

  • 리눅스 명령의 이해
    - 서버에 직접 접속하여 리눅스 명령어를 사용하여 복구
  • 리눅스의 이해
    - 중앙 집중화된 로깅/모니터링 환경을 구축
    - 수집된 데이터 기반의 장애 판단

 

컨테이너 개요

컨테이너 기술의 필요성

  • 내 컴퓨터에서는 실행되던 코드가 다른 머신에서 동작하지 않음
  • 어떤 Host 환경에서도 동작하는 환경
    - 애플리케이션 코드, 종속성, 실행환경이 하나의 패키지로 구성

 

컨테이너 장점

  • 민첩성
    - 개발자가 애플리케이션을 직접 빌드/배포 가능
  • 이식성
    - OS 플랫폼 및 클라우드에 상관없이 일관된 동작 가능
  • 신속한 확장성
    - 컨테이너는 애플리케이션/아티펙트 단위로 스케일링이 가능

 

컨테이너 vs VM

  • 하이퍼바이저 (가상 머신 모니터, VMM)
    - 호스트 컴퓨터에서 다수의 운영체제를 동시에 실행하기 위한 논리적 플랫폼
    - 리소스 에뮬레이션으로 한 서버에서 독립된 여러 머신 환경 구성 가능
  • VM
    - 저수준 하드웨어 장치를 가상화
    - Hypervisor 위에 Guest OS들
    - 다양한 OS 사용 가능
    • 장점
      - 물리머신 대비 동일 자원에 대한 효율성 증가 / 빠른 서버 프로비저닝
    • 단점
      - OS 이미지, 라이브러리 등 중복 데이터의 불필요한 자원 점유
  • Container
    - 소프트웨어 패키지를 운영체제 위에서 가상화
    - Host OS 위에 Container Engine(Docker), 그 위에 container
    - Host OS를 공유하므로 단일 OS 사용
    • 장점
      - 어느 환경에나 컨테이너 배포 가능
      - 경량화 : OS 부팅 x / 효율적인 가상환경 / 빠른 시작(작은 이미지 or 캐싱을 잘할 경우)
      - 하나의 Host에 더 많은 애플리케이션 운영 가능
      - Host OS 패치 등 유지관리가 용이
    • 단점
      - 컨테이너마다 Host OS를 공유하므로 멀티 테넌트(tenant) 환경에서 risk를 가짐

 

다중 운영체제

  • Host OS가 Ubuntu일 때, Fedora/Cent OS 기반 컨테이너가 동작할까?
    - 동작한다
  • OS레벨 가상화 기술
    • 정의
      - 커널이 여러 격리된 사용자 공간 인스턴스의 존재를 허용
    • 종류
      - container : LXC, Solaris containers, Docker, Podman
      - zones : Solaris containers
      - jails : FreeBSD jail, chroot jail
  • [결론] 컨테이너는 OS 공유가 아닌 커널 공유이다 (커널이 제공하는 기술)
    • 확인 방법
      - uname -a
      - docker run --rm fedora uname -a

 

https://fosspost.org/what-are-the-components-of-a-linux-distribution/

  • 리눅스 vs 리눅스 배포판
    • 리눅스 배포판
      - Ubuntu, Redhat, SUSE, CentOS
      - 리눅스 커널 + 소프트웨어 컴포넌트(윈도우 시스템, 데스크탑 환경, 서비스 데몬, 패키지 매니저, 애플리케이션 등)
    • 리눅스 커널
      - 하드웨어 자원 관리
      - 자원을 추상화하여 프로세스에게 할당/관리
    • [결론] 다양한 리눅스 배포판은 컴포넌트가 다르고 커널은 같으므로, 커널을 공유하여 구동 가능
  • Ubuntu Host 위에 Windows 컨테이너 동작 가능?
    • 동작하지않음 (커널이 다름)
  • Windows/MacOS host에서 Ubuntu 컨테이너는 동작하는데?
    • 추가적인 레이어 : 가상화 환경 + Linux Kit이 더 구성됨
    • LInux Kit 위에 Docker Engine 동작 (Docker는 Linux 환경에서 동작)

 

Alpine 리눅스 이미지 만들기

Alpine 리눅스

  • 보안, 간편성, 리소스 효율을 위해 디자인된 리눅스 배포판
  • 용량을 줄이기 위한 노력(약 5MB)
    - glibc -> musl libc (9MB에서 < 1MB)
    - Linux command의 executable file -> 단일 명령(Busy box)로 변경
  • 멀티 스테이지 빌드
    - alpine 리눅스는 경량화된 distribution으로 많은 라이브러리가 빠져있음
    - 따라서, 이미지 빌드시 여러 단계를 걸쳐 빌드 (ex. golang 빌드 후 alpine 리눅스를 빌드하여 copy)

 

Alpine 리눅스 이미지 만들기

  • Fedora image를 base image로 설정 (FROM Fedora)
  • (???) alpine 리눅스 루트 파일 시스템을 Fedora에 복사 (COPY ./alpine_root)

 

컨테이너 관련 에코시스템 정리

CNCF (Cloud Native Computing Foundation)

  • 벤더 중립적인 클라우드향 오픈소스 프로젝트를 관리하는 재단
  • 프로젝트
    • Kubernetes
    • HELM
    • etcd
    • fluentd
    • containerd
    • Promethues
  • Cloud Native
    • 퍼블릭/프라이빗/하이브리드 클라우드 환경에서 확장 가능한 형태로 빠르게 애플리케이션 빌드/실행이 목표
    • 뒷받침 기술
      • 컨테이너
      • 마이크로서비스
      • 서비스 메시
  • CNCF에 등록된 프로젝트는 매우 많음
    - 따라서, 개별 툴의 기능을 살펴보기보다
    - 풀어야하는 문제나 프로세스를 이해하여 맞는 도구 선택
  • Cloud Native Trail Map
    • Containerization
    • CI/CD
      - Argo
    • Orchestartion
      - Kubernetes
    • Observability
      - Prometheus, Fluentd
    • Service proxy / discover / mesh
      - envoy, Core DNS
    • Networking / Security
      - CNI (Calico, Flannel, Weave Net, Cilium)
    • Database & Storage
      - etcd
    • Streaming & Messaging
      - gRPC, cloudevents
    • Container Registry & Runtime
      - containerd
    • Software Distribution

 

컨테이너 Runtime 관련 표준

OCI (Open Container Initiative)

  • [문제] 다양한 컨테이너 런타임들이 등장하여 인터페이스가 마구 생겨남
  • [해결] Low level 컨테이너 런타임 표준을 만들자
  • [정의] 컨테이너 형식(format)과 런타임(runtime) 표준
  • OCI runtime
    - 컨테이너 실행에 필요한 저수준 컨테이너 런타임
    - Cgroups, namespace, security
  • runc
    - OCI spec에 따라 컨테이너를 생성/실행하기 위한 CLI 도구

 

CRI (Container Runtime Interface)

  • [문제] 컨테이너 런타임마다 K8s 인터페이스가 필요
  • [해결] High level 컨테이너 런타임 표준을 만들자
  • [정의] 쿠버네티스에서 다양한 컨테이너 런타임을 사용할 수 있도록하는 플러그인 인터페이스
  • CRI runtime
    - 컨테이너 실행에 필요한 고수준 컨테이너 런타임
    - 컨테이너 라이프사이클, 이미지 등을 관리
  • 쿠버네티스에서 지원하는 컨테이너 런타임 종류
    - containerd, CRI-O, Docker Engine

 

보안 문제

  • [문제] Multi-tenant 환경에서 Host 커널을 공유할 경우 보안 문제 발생 가능
  • [해결] 경량 가상머신으로 안전한 컨테이너 런타임 구성
  • Firecraker
    - AWS에서 개발한 경량 microVM을 위한 VMM
  • Kata Containers
    - K8s에서 다양한 컨테이너 런타임을 사용할 수 있도록 하는 플러그인 인터페이스