목차 |
---|
라이브러리 의존성
라이브러리
- 실행파일의 용량이 작은 이유: 라이브러리를 사용하기 때문
- 프로그램이 메모리에 로드될 때, 라이브러리도 함께 로드 (LIB, DLL, SO 파일)
- 의존성(dependency) 문제 발생: 라이브러리가 다른 라이브러리를 참조, 복잡함. 마이너 버전까지 일치해야 로딩 가능
...
- 그래도 풀리지 않은 라이브러리 의존성… 환경을 통으로 이식할 순 없을까?
가상머신을 통한 의존성 해결
- 초기에는 에뮬레이션을 위해 개발
- 다른 프로세서를 위해 컴파일된 바이너리 실행 (예: ARM 프로세서에서 X86 바이너리 실행)
- 최근에는 환경을 통으로 이식할 수 있는 편리함 때문에 사용
- 가상화로 인한 성능저하는 2~3% 내외
- 반가상화 (KVM, VirtIO)의 등장으로 성능 향상, 가상머신이 에뮬레이션 없이 호스트머신의 하드웨어 드라이버를 Call
- VirtualBox, VMware, QEMU-KVM, Hyper-V
컨테이너를 통한 의존성 해결
- 그래도 가상머신은 무거움. 리눅스 계정별 자원 쿼터(quota)할당 기능 활용
- 계정별 시스템 자원 제한, 격리하는 cgroup, namespace 등을 연장하여 컨테이너 개발
- docker, lxc, podman
가상머신 vs 컨테이너
리눅스에서 ps auxf 를 실행하면 프로세스 트리를 볼 수 있음
가상머신 - LibVirt
CPU 개수, 메모리, 디스크, 네트워크 인터페이스 등을 설정 후 부팅하면 됨
...
코드 블럭 | ||||
---|---|---|---|---|
| ||||
# 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/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 9f6731d3-.../images/.../...",...} # QCOW2 DISK #product=2; ... # virsh dumpxml 132-r9-gita.kreonet.net <domain type='kvm' name=VMware ESX; version=5.5.0; buildnumber=2068190;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 licensename=VMware ESX Server;name='qemu' type='qcow2' .../> licenseversion=5.0;<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 -@ duplex=3; msgs=ui /vmfs/volumes/51f872db-e7b1b18e-c6a2-0025b5010101/ 054_c7_workspace_msjang/054_c7_workspace_msjang.vmx 39188 vmm0 #product=2; :054_c7_workspace_msjang 39196 vmm1 :054_c7_workspace_msjang 39197name=VMware ESX; vmm2 :054_c7_workspace_msjang 39198version=5.5.0; 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 buildnumber=2068190; :054_c7_workspace_msjang /bin/vmx 39222 39171 vmx-svga licensename=VMware ESX Server; :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 # cdlicenseversion=5.0; -@ duplex=3; msgs=ui /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/054_c7_workspace.vmx 39188 vmm0 8.5K Jan 21 2020 :054_c7_workspace_msjang.nvram -rw-r--r-- 39196 root vmm1 0 Jan 18 2018 :054_c7_workspace_msjang.vmsd -rw------- 39197 root 3.2K Janvmm2 21 2020 :054_c7_workspace_msjang.vmx -rw------- 39198 root vmm3 0 Jan 21 2020 :054_c7_workspace_msjang.vmx.lck -rw-r--r-- root 39207 39171 vmx-vthread-7:054_c7_workspace /bin/vmx 39212 39171 vmx-vthread-8:054_c7_workspace /bin/vmx 39221 39171 vmx-mks 263 Jan 18 2018 :054_c7_workspace_msjang.vmxf -rw------- root /bin/vmx 39222 39171 vmx-svga 3.2K Jan 21 2020 :054_c7_workspace /bin/vmx 39225 39171 vmx-vcpu-0 :054_c7_workspace_msjang.vmx~ -rw------- root 538 Jan 21 2020 /bin/vmx 39226 39171 vmx-vcpu-1 :054_c7_workspace_msjang.vmdk -rw------- root 32.0G Oct 30 23:18 054_c7_workspace_msjang-flat.vmdk -rw------- /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 5422.9K Jan 21 2020 054_c7_workspace_msjang_1.vmdk drwxr-rw-------xr-t root 384 4.0G2K Oct 30 2320:18 054_c7_workspace_msjang_1-flat.vmdk31 .. -rw------- root 159 8.4K0G AprJan 2221 2021 vmware.log2020 054_c7_workspace-7f29ff24.vswp -rw------- root 162 8.0M5K Jan 21 2020 vmx-054_c7_workspace_msjang-2133458724-1.vswp # cat.nvram -rw-r--r-- root 0 Jan 18 2018 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/
컨테이너는 호스트에서 컨테이너 내부의 프로세스 트리가 보임
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 | ||||
코드 블럭 | ||||
| ||||
# 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 COMMAND nextcloud/aio-postgresql:latest "start.sh" CREATED 2 monthsSTATUS ago Up 5 weeks (healthy) ... ... # ps auxf USER ... 772a8e8fcd80 PID nextcloud/aio-fulltextsearch:latest %CPU %MEM START"/bin/tini -- /usr/l…" TIME2 months COMMAND rootago Up 5 1328 0.0weeks (healthy) ... 249b437e6556 nextcloud/aio-apache:latest 0.1 May23 13:20 "start.sh /usr/bin/containerd-shim-runc-v2 -namespace moby -id 772a8e8fcd80... root s…" 2 months ago Up 5 1460weeks (healthy) 0.0 0.0... 4ce5464fd846 May23 nextcloud/aio-postgresql:latest 0:51 \_ /bin/tini -- /usr/local/bin/docker-entrypoint.sh eswrapper ubuntu "start.sh" 1862 0.1 17.5 May23 63:39 2 months ago Up \_ /usr/share/elasticsearch/jdk/bin/java 5 weeks (healthy) ... ... ubuntu # ps auxf USER 2551 0.0PID %CPU 0.0 %MEM May23 START 0:00 TIME COMMAND root 1328 \_ /usr/share/elasticsearch/modules/... root 1475 0.0 0.0 0.1 May23 1213:4820 /usr/bin/containerd-shim-runc-v2 -namespace moby -id 249b437e6556772a8e8fcd80... www-dataroot 15681460 0.0 0.30 May23 40:1251 \_ /usr/bin/python3tini -- /usr/local/bin/supervisord -c /supervisord.conf www-data 3426docker-entrypoint.sh eswrapper ubuntu 1862 0.01 017.05 May23 063:0039 \_ /binusr/sh share/usrelasticsearch/local/apache2jdk/bin/apachectl -DFOREGROUND www-data 3431java ... ubuntu 2551 0.0 0.0 May23 10:1200 \_ /usr/localshare/apache2elasticsearch/bin/httpd -DFOREGROUND www-data 5540modules/... root 1475 0.0 0.01 May23 012:48 /usr/bin/containerd-shim-runc-v2 -namespace moby -id 249b437e6556... www-data 1568 0.0 0.3 May23 4:12 \_ /usr/local/apache2bin/python3 /usr/bin/httpdsupervisord -DFOREGROUND rootc /supervisord.conf www-data 3426 0.0 1587 0.0 May23 0.1 0:00 May23 12:16 \_ /bin/sh /usr/local/apache2/bin/containerd-shim-runc-v2 -namespace moby -id 4ce5464fd846... lxd 1666apachectl -DFOREGROUND www-data 3431 0.0 0.0 May23 1:12 \_ /usr/local/apache2/bin/httpd -DFOREGROUND www-data 5540 0.0 0.0 0.0 May23 0:00 \_ /bin/bash /usr/bin/start.sh lxd 1998 0.0 0.2 May23 2:32 \_ postgres |
오케스트레이션
여러대의 가상머신 또는 컨테이너를 관리하는 기술
...
Vagrant 는 VirtualBox 를 스크립트로 조작하는 도구
https://app.vagrantup.com 에서 이미 만들어진 이미지 다운 가능
VirtualBox Extension Pack 유료 라이선스
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 |
스토리지
thin vs. thick provisioning
thin (씬) provisioning | thick (씩) provisioning | |
---|---|---|
장점 | 인스턴스 복제 속도가 빠르다 | write 성능이 (조금) 더 좋다 |
실제 디스크 용량보다 더 많은 용량을 프로비저닝 할 수 있다. 애써서 자원을 할당해 줬더니 막상 안 쓰더라... | ||
단점 | 스토리지 호스트의 부담이 (조금) 있다 | |
비고 | thin → thick 변경은 쉬움 |
(괄호)는 발표자의 주관이 다소 반영됨
(그림출처) https://tech.gluesys.com/blog/2021/03/17/storage_8_intro.html
Shared Storage
오픈스택, 쿠버네티스 모두 설정하기 쉬운 storage backend 는 NFS 임
Instance Storage
VM 인스턴스가 생성되는 호스트 머신의 스토리지를 이용하는 것
컴퓨팅 호스트가 꺼지면? 해당 볼륨 접근 불가
인스턴스 스토리지의 예 - AWS I3 인스턴스
트랜잭션 많은 워크로드에 최적화된 스토리지 - DB, NoSQL, Elasticsearch, 데이터웨어하우스용
https://aws.amazon.com/ko/ec2/instance-types/i3/
https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/storage-optimized-instances.html
모델 | vCPU | 메모리(GiB) | 인스턴스 스토리지(GB) | 네트워킹 대역폭(Gbps) | Read IOPS (100% Random) | Write IOPS |
---|---|---|---|---|---|---|
i3.large | 2 | 15.25 | 1 x 475 NVMe SSD | 최대 10 | 100,125 | 35,000 |
i3.xlarge | 4 | 30.5 | 1 x 950 NVMe SSD | 최대 10 | 206,250 | 70,000 |
i3.2xlarge | 8 | 61 | 1 x 1,900 NVMe SSD | 최대 10 | 412,500 | 180,000 |
i3.4xlarge | 16 | 122 | 2 x 1,900 NVMe SSD | 최대 10 | 825,000 | 360,000 |
i3.8xlarge | 32 | 244 | 4 x 1,900 NVMe SSD | 10 | 1,650,000 | 720,000 |
i3.16xlarge | 64 | 488 | 8 x 1,900 NVMe SSD | 25 | 3,300,000 | 1,400,000 |
i3.metal | 72* | 512 | 8 x 1,900 NVMe SSD | 25기가비트 | 3,300,000 | 1,400,000 |
(참고) 드라이브 IOPS 비교
구분 | 최저가 (2023.11) | 인터페이스 | 순차읽기 | 순차쓰기 | 읽기 IOPS | 쓰기 IOPS | |
---|---|---|---|---|---|---|---|
Cloud | KT Cloud SSD Server | 6~20K | |||||
Cloud | Naver Cloud SSD Server | 20K | 7K | ||||
Cloud | Gen3 M.2 4ea RAID 5 호스트 머신 2대 iperf 20Gbps HPNSSH + GridFTP 8 스트림 | 1400~ | 290~ 300MB/s | 45~63K | 21~26K | ||
Drive | 삼성 870 EVO (1TB) | 13.3 만원 | SATA3 6Gb/s (750MB/s) | 560MB/s | 530MB/s | 98K | 88K |
Cloud | AWS i3.2xlarge (1.9TB NVMe x 1) | 412K | 180K | ||||
Drive | 삼성 960 EVO NVMe (1TB) | 단종 | PCIe 3.0 x4 32GT/s (4GT/s) | 3,200MB/s | 1,900MB/s | 380K | 360K |
Drive | 삼성 980 PRO NVMe (1TB) | 16.3 만원 | PCIe4.0x4 64GT/s (8GT/s) | 7,000MB/s | 5,000MB/s | 1,000K | 1,000K |
Ephemeral (이페머럴, 임시) Storage
재부팅 되면 날아가는 스토리지
https://kubernetes.io/ko/docs/concepts/storage/ephemeral-volumes/
일부 애플리케이션은 추가적인 저장소를 필요로 하면서도 재시작 시 데이터의 영구적 보존 여부는 신경쓰지 않을 수도 있다.
- 캐싱 서비스
- 읽기 전용 데이터를 처리하는 애플리케이션
임시 볼륨 은 이러한 사용 사례를 위해 설계되었다. 임시 볼륨은 파드의 수명을 따르며 파드와 함께 생성 및 삭제되며...
...
스토리지, 볼륨
오픈스택, 쿠버네티스 모두 설정하기 쉬운 storage backend 는 NFS 임