라이브러리 의존성
라이브러리
- 실행파일의 용량이 작은 이유: 라이브러리를 사용하기 때문
- 프로그램이 메모리에 로드될 때, 라이브러리도 함께 로드 (LIB, DLL, SO 파일)
- 의존성(dependency) 문제 발생: 라이브러리가 다른 라이브러리를 참조, 복잡함. 마이너 버전까지 일치해야 로딩 가능
리눅스 패키지 관리자
- 초기 리눅스 코드 다운받고 컴파일 해서 사용
- 컴파일은 많은 자원과 시간이 소요 > 의존성 확인, 컴파일 된 바이너리 다운로드 (apt, yum, dnf)
- 패키지 관리자 (pip, bundle, brew, npm)
라이브러리 의존성
- 그래도 풀리지 않은 라이브러리 의존성… 환경을 통으로 이식할 순 없을까?
가상머신을 통한 의존성 해결
- 초기에는 에뮬레이션을 위해 개발
- 다른 프로세서를 위해 컴파일된 바이너리 실행 (예: ARM 프로세서에서 X86 바이너리 실행)
- 최근에는 환경을 통으로 이식할 수 있는 편리함 때문에 사용
- 가상화로 인한 성능저하는 2~3% 내외
- 반가상화 (KVM, VirtIO)의 등장으로 성능 향상, 가상머신이 에뮬레이션 없이 호스트머신의 하드웨어 드라이버를 Call
- VirtualBox, VMware, QEMU-KVM, Hyper-V
컨테이너를 통한 의존성 해결
- 그래도 가상머신은 무거움. 리눅스 계정별 자원 쿼터(quota)할당 기능 활용
- 계정별 시스템 자원 제한, 격리하는 cgroup, namespace 등을 연장하여 컨테이너 개발
- docker, lxc, podman
가상머신 vs 컨테이너
리눅스에서 ps auxf 를 실행하면 프로세스 트리를 볼 수 있음
가상머신
CPU 개수, 메모리, 디스크, 네트워크 인터페이스 등을 설정 후 부팅하면 됨
가상머신은 qemu-kvm 이라는 하나의 큰 프로세스가 실행됨
# virsh list --all Id Name State ----------------------------------------------- 14 gita.kreonet.net running ... # ps auxf USER PID %CPU %MEM START TIME COMMAND qemu 177798 0.5 0.3 Apr21 594:54 /usr/libexec/qemu-kvm -name guest=gita.kreonet.net -smp 4,maxcpus=16 # CPU -m size=8GB,maxmem=32GB # MEM -blockdev {"filename":"/mnt/192.168...:_nfs_.../...a0892.qcow2",...} # DISK ...
참고로 하드디스크를 이미지로 떠서 가상머신으로 부팅하면 부팅이 됨. 역으로 가상머신의 이미지를 물리적인 하드디스크에 풀어내면 물리적인 실제 서버에서도 부팅이 됨. - http://idchowto.com/kvm-qcow2-파일을-물리적-디스크로-복사-부팅/
컨테이너
도커는 CPU, 메모리, 디스크 제한 거는 것 가능. 기본적으로 호스트머신의 자원을 제한 없이 이용. https://docs.docker.com/config/containers/resource_constraints/
k8s는 CPU, 메모리를 기본값으로 제한하며 변경 가능. https://kubernetes.io/ko/docs/tasks/administer-cluster/manage-resources/
컨테이너는 호스트에서 컨테이너 내부의 프로세스 트리가 보임
# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS ... 772a8e8fcd80 nextcloud/aio-fulltextsearch:latest "/bin/tini -- /usr/l…" 2 months ago Up 5 weeks (healthy) ... 249b437e6556 nextcloud/aio-apache:latest "start.sh /usr/bin/s…" 2 months ago Up 5 weeks (healthy) ... 4ce5464fd846 nextcloud/aio-postgresql:latest "start.sh" 2 months ago Up 5 weeks (healthy) ... ... # ps auxf USER PID %CPU %MEM START TIME COMMAND root 1328 0.0 0.1 May23 13:20 /usr/bin/containerd-shim-runc-v2 -namespace moby -id 772a8e8fcd80... root 1460 0.0 0.0 May23 0:51 \_ /bin/tini -- /usr/local/bin/docker-entrypoint.sh eswrapper ubuntu 1862 0.1 17.5 May23 63:39 \_ /usr/share/elasticsearch/jdk/bin/java ... ubuntu 2551 0.0 0.0 May23 0:00 \_ /usr/share/elasticsearch/modules/... root 1475 0.0 0.1 May23 12:48 /usr/bin/containerd-shim-runc-v2 -namespace moby -id 249b437e6556... www-data 1568 0.0 0.3 May23 4:12 \_ /usr/bin/python3 /usr/bin/supervisord -c /supervisord.conf www-data 3426 0.0 0.0 May23 0:00 \_ /bin/sh /usr/local/apache2/bin/apachectl -DFOREGROUND www-data 3431 0.0 0.0 May23 1:12 \_ /usr/local/apache2/bin/httpd -DFOREGROUND www-data 5540 0.0 0.0 May23 0:48 \_ /usr/local/apache2/bin/httpd -DFOREGROUND root 1587 0.0 0.1 May23 12:16 /usr/bin/containerd-shim-runc-v2 -namespace moby -id 4ce5464fd846... lxd 1666 0.0 0.0 May23 0:00 \_ /bin/bash /usr/bin/start.sh lxd 1998 0.0 0.2 May23 2:32 \_ postgres
오케스트레이션
여러대의 가상머신 또는 컨테이너를 관리하는 기술
한대 | 여러대, 오케스트레이터 | 비고 | ||
---|---|---|---|---|
컨테이너 | 도커, LXC, Podman | 쿠버네티스 | ||
가상머신 | Linux | cockpit-machine, virt-manager, gnome-boxes | 오픈스택, oVirt | 모두 QEMU-KVM, LibVirt 이용 |
VMware | VMware Workstation | VMware vSphere | ||
Oracle | VirtualBox | |||
Microsoft | Hyper-V | Hyper-V Cluster |
스토리지, 볼륨
오픈스택, 쿠버네티스 모두 설정하기 쉬운 storage backend 는 NFS 임