- 전체 강의 개요
- 컨테이너 개요
- 다중 운영체제
- 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
- 확인 방법
- 리눅스 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에서 다양한 컨테이너 런타임을 사용할 수 있도록 하는 플러그인 인터페이스
'데이터 엔지니어링 > 클라우드' 카테고리의 다른 글
[클라우드] 배포 전략 (인플레이스, 롤링, 블루/그린, 카나리) (0) | 2022.05.16 |
---|---|
[클라우드] Service Discovery (0) | 2022.05.10 |
[클라우드] 마이크로서비스 아키텍처 (0) | 2022.05.10 |
[클라우드] 클라우드 컴퓨팅 구분 (0) | 2022.05.08 |
[클라우드] 컨테이너 기술이란 (0) | 2022.05.08 |