라이브러리 의존성
라이브러리
- 실행파일의 용량이 작은 이유: 라이브러리를 사용하기 때문
- 프로그램이 메모리에 로드될 때, 라이브러리도 함께 로드 (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 132-r9-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":"/rhev/data-center/mnt/..._nfs_.../ 9f6731d3-.../images/.../...",...} # QCOW2 DISK ... # virsh dumpxml 132-r9-gita.kreonet.net <domain type='kvm' id='14' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'> <name>132-r9-gita.kreonet.net</name> <uuid>825fcb99-...</uuid> <maxMemory slots='16' unit='KiB'>33554432</maxMemory> <memory unit='KiB'>8388608</memory> <currentMemory unit='KiB'>8388608</currentMemory> <vcpu placement='static' current='4'>16</vcpu> <disk type='file' device='disk' snapshot='no'> <driver name='qemu' type='qcow2' .../> <source file='/rhev/data-center/mnt/..._nfs_.../9f6731d3-.../images/.../...' index='1'></source> <target dev='sda' bus='scsi'/>
참고로 하드디스크를 이미지로 떠서 가상머신으로 부팅하면 부팅이 됨. 역으로 가상머신의 이미지를 물리적인 하드디스크에 풀어내면 물리적인 실제 서버에서도 부팅이 됨. - 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 workspace 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/054_c7_workspace.vmx 39188 vmm0 :054_c7_workspace 39196 vmm1 :054_c7_workspace 39197 vmm2 :054_c7_workspace 39198 vmm3 :054_c7_workspace 39207 39171 vmx-vthread-7:054_c7_workspace /bin/vmx 39212 39171 vmx-vthread-8:054_c7_workspace /bin/vmx 39221 39171 vmx-mks :054_c7_workspace /bin/vmx 39222 39171 vmx-svga :054_c7_workspace /bin/vmx 39225 39171 vmx-vcpu-0 :054_c7_workspace /bin/vmx 39226 39171 vmx-vcpu-1 :054_c7_workspace /bin/vmx 39227 39171 vmx-vcpu-2 :054_c7_workspace /bin/vmx 39228 39171 vmx-vcpu-3 :054_c7_workspace /bin/vmx # cd /vmfs/volumes/51f872db-e7b1b18e-c6a2-0025b5010101/054_c7_workspace/ # 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-7f29ff24.vswp -rw------- root 8.5K Jan 21 2020 054_c7_workspace.nvram -rw-r--r-- root 0 Jan 18 2018 054_c7_workspace.vmsd -rw------- root 3.2K Jan 21 2020 054_c7_workspace.vmx -rw------- root 0 Jan 21 2020 054_c7_workspace.vmx.lck -rw-r--r-- root 263 Jan 18 2018 054_c7_workspace.vmxf -rw------- root 3.2K Jan 21 2020 054_c7_workspace.vmx~ -rw------- root 538 Jan 21 2020 054_c7_workspace.vmdk -rw------- root 32.0G Oct 30 23:18 054_c7_workspace-flat.vmdk -rw------- root 542 Jan 21 2020 054_c7_workspace_1.vmdk -rw------- root 384.0G Oct 30 23:18 054_c7_workspace_1-flat.vmdk -rw------- root 159.4K Apr 22 2021 vmware.log -rw------- root 162.0M Jan 21 2020 vmx-054_c7_workspace-2133458724-1.vswp # cat 054_c7_workspace.vmx nvram = "054_c7_workspace.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.vmdk" scsi0:1.fileName = "054_c7_workspace_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
오케스트레이션
여러대의 가상머신 또는 컨테이너를 관리하는 기술
한대 | 여러대, 오케스트레이터 | 비고 | ||
---|---|---|---|---|
컨테이너 | Docker, LXC, Podman | Kubernetes | ||
가상머신 | Linux | cockpit-machine, virt-manager, gnome-boxes | OpenStack, oVirt, Proxmox | 모두 QEMU-KVM, LibVirt 이용 |
VMware | VMware Workstation | VMware vSphere | ||
Oracle | VirtualBox | Vagrant 는 VirtualBox 를 스크립트로 조작하는 도구 VirtualBox Extension Pack 유료 라이선스 | ||
Microsoft | Hyper-V | Hyper-V Cluster |
스토리지, 볼륨
Shared Storage
오픈스택, 쿠버네티스 모두 설정하기 쉬운 storage backend 는 NFS 임
Ephemeral (Instance) Storage
https://aws.amazon.com/ko/ec2/instance-types/i3/
모델 | vCPU | 메모리(GiB) | 인스턴스 스토리지(GB) | 네트워킹 대역폭(Gbps) |
---|---|---|---|---|
i3.large | 2 | 15.25 | 1 x 475 NVMe SSD | 최대 10 |
i3.xlarge | 4 | 30.5 | 1 x 950 NVMe SSD | 최대 10 |
i3.2xlarge | 8 | 61 | 1 x 1,900 NVMe SSD | 최대 10 |
i3.4xlarge | 16 | 122 | 2 x 1,900 NVMe SSD | 최대 10 |
i3.8xlarge | 32 | 244 | 4 x 1,900 NVMe SSD | 10 |
i3.16xlarge | 64 | 488 | 8 x 1,900 NVMe SSD | 25 |
i3.metal | 72* | 512 | 8 x 1,900 NVMe SSD | 25기가비트 |