라이브러리 의존성
라이브러리
- 실행파일의 용량이 작은 이유: 라이브러리를 사용하기 때문
- 프로그램이 메모리에 로드될 때, 라이브러리도 함께 로드 (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 를 실행하면 프로세스 트리를 볼 수 있음
가상머신 - LibVirt
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-파일을-물리적-디스크로-복사-부팅/
가상머신 - VMware
# uname -a VMkernel ESXI05 5.5.0 #1 SMP Release build-2068190 Aug 22 2014 19:00:51 x86_64 GNU/Linux # ps -c | grep msjang 39171 39171 vmx /bin/vmx -s sched.group=host/user #product=2; name=VMware ESX; version=5.5.0; buildnumber=2068190; licensename=VMware ESX Server; licenseversion=5.0; -@ duplex=3; msgs=ui /vmfs/volumes/51f872db-e7b1b18e-c6a2-0025b5010101/ 054_c7_workspace_msjang/054_c7_workspace_msjang.vmx 39188 vmm0 :054_c7_workspace_msjang 39196 vmm1 :054_c7_workspace_msjang 39197 vmm2 :054_c7_workspace_msjang 39198 vmm3 :054_c7_workspace_msjang 39207 39171 vmx-vthread-7:054_c7_workspace_msjang /bin/vmx 39212 39171 vmx-vthread-8:054_c7_workspace_msjang /bin/vmx 39221 39171 vmx-mks :054_c7_workspace_msjang /bin/vmx 39222 39171 vmx-svga :054_c7_workspace_msjang /bin/vmx 39225 39171 vmx-vcpu-0 :054_c7_workspace_msjang /bin/vmx 39226 39171 vmx-vcpu-1 :054_c7_workspace_msjang /bin/vmx 39227 39171 vmx-vcpu-2 :054_c7_workspace_msjang /bin/vmx 39228 39171 vmx-vcpu-3 :054_c7_workspace_msjang /bin/vmx # cd /vmfs/volumes/51f872db-e7b1b18e-c6a2-0025b5010101/054_c7_workspace_msjang/ # ls -alh total 74421272 drwxr-xr-x root 2.9K Jan 21 2020 . drwxr-xr-t root 4.2K Oct 30 20:31 .. -rw------- root 8.0G Jan 21 2020 054_c7_workspace_msjang-7f29ff24.vswp -rw------- root 8.5K Jan 21 2020 054_c7_workspace_msjang.nvram -rw-r--r-- root 0 Jan 18 2018 054_c7_workspace_msjang.vmsd -rw------- root 3.2K Jan 21 2020 054_c7_workspace_msjang.vmx -rw------- root 0 Jan 21 2020 054_c7_workspace_msjang.vmx.lck -rw-r--r-- root 263 Jan 18 2018 054_c7_workspace_msjang.vmxf -rw------- root 3.2K Jan 21 2020 054_c7_workspace_msjang.vmx~ -rw------- root 538 Jan 21 2020 054_c7_workspace_msjang.vmdk -rw------- root 32.0G Oct 30 23:18 054_c7_workspace_msjang-flat.vmdk -rw------- root 542 Jan 21 2020 054_c7_workspace_msjang_1.vmdk -rw------- root 384.0G Oct 30 23:18 054_c7_workspace_msjang_1-flat.vmdk -rw------- root 159.4K Apr 22 2021 vmware.log -rw------- root 162.0M Jan 21 2020 vmx-054_c7_workspace_msjang-2133458724-1.vswp # cat 054_c7_workspace_msjang.vmx nvram = "54_workspace_msjang.nvram" numvcpus = "4" cpuid.coresPerSocket = "2" memSize = "8192" ethernet0.virtualDev = "vmxnet3" ethernet0.networkName = "VMNet" ethernet0.generatedAddress = "00:50:56:95:72:98" scsi0:0.fileName = "054_c7_workspace_msjang.vmdk" scsi0:1.fileName = "054_c7_workspace_msjang_1.vmdk" ...
컨테이너
도커는 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 | Vagrant 는 VirtualBox 를 스크립트로 조작하는 도구 VirtualBox Extension Pack 유료 라이선스 | ||
Microsoft | Hyper-V | Hyper-V Cluster |
스토리지, 볼륨
오픈스택, 쿠버네티스 모두 설정하기 쉬운 storage backend 는 NFS 임