라이브러리 의존성
라이브러리
- 실행파일의 용량이 작은 이유: 라이브러리를 사용하기 때문
- 프로그램이 메모리에 로드될 때, 라이브러리도 함께 로드 (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 |
스토리지
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 iperf 20Gbps GridFTP + HPNSSH 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/
일부 애플리케이션은 추가적인 저장소를 필요로 하면서도 재시작 시 데이터의 영구적 보존 여부는 신경쓰지 않을 수도 있다.
- 캐싱 서비스
- 읽기 전용 데이터를 처리하는 애플리케이션
임시 볼륨 은 이러한 사용 사례를 위해 설계되었다. 임시 볼륨은 파드의 수명을 따르며 파드와 함께 생성 및 삭제되며...