반응형
리뷰 (Review)
더보기
Application
- Service 제공을 위한 동작을 하는 프로그램
- Application 구성 요소
- Application binary
- Application에서 사용하는 공유 라이브러리
- Traditinal Deployment
- 물리적인 서버에 Application 설치를 통한 서비스 제공
- Application이 물리적인 서버의 리소스를 직접적으로 활용 가능함
- 물리적인 서버의 리소스를 과다하게 사용하는 것에 대해 통제가 쉽지 않음
- Application 설치 시 필요 공유 라이브러리가 없으면 설치에 어려움
- Virtualized Deployment
- 가상 머신을 구성하여 Application 배포
- 가상 머신을 Application이 동작할 수 있는 최상의 환경으로 구성하여 배포하여 전통적인 방식의 단점 해결
- Application 간의 격리 (Isolate) 가능
- 배포 시 가상 머신 배포를 통해 Application 실행 환경 구성의 어려움 극복
- H/W 환경을 나누어 사용하므로 리소스 관리 측면에서 효과적이지는 않음
- O/S도 같이 배포되기 때문에 크기가 크다.
- Container Deployment
- Container는 독립된 O/S를 가지고 있지 않다.
- Container는 Host O/S에서 관리하는 Process 형태로 동작
- 완전 격리된 형태의 Process로 동작하므로 다른 Process와 별개이다.
- 독점적인 리소스 사용을 할 수 없도록 제어된다.
- 기존 VM에 비해서 Container의 크기가 작고, 기민한 Application 배포가 가능하다.
Docker
- Container 기술의 한 종류, Container 생성 관리 역할
- Container Engine을 통하여 프로세스 단위 가상화, 완전 독립된 실행 환경 생성
- O/S를 설치하지 않기 때문에 설치 용량이 작고 실행 속도가 빠름
- 소프트웨어 실행에 필요한 모든 것을 포함하는 완전한 파일 시스템 안에 감싼 상자와 같은 모양
- Docker 구성 요소 - Docker Engine + Docker Container
- Docker Engine (docker daemon) - daemon process
- Container runtime
- Container 생성 및 실행, 관리하는 역할 수행
- Docker Container - application process
- 격리된 응용 프로그램 실행 환경 (가상 환경)
- Hypervisor와 Guest O/S가 없기 때문에 가볍고, 이미지 복제, 이관, 배포가 쉽다.
- Guest O/S 부팅 시간이 없기 때문에 Application 시작 시간이 빠르다.
- 가상 머신보다 경량이기 때문에 여러 Application을 실행 할 수 있다.
Docker 이해
더보기
chroot 실습
- root user로 사용자 전환 : su - 또는 sudo su
- / 위치로 디렉토리 이동 : cd /
- chroot 명령으로 / 디렉토리로 설정할 디렉토리 생성 : mkdir -p home/tomato
- chroot 명령을 실행할 사용 shell에 대한 바이너리가 / 로 설정할 디렉토리에는 존재하지 않으므로,
/ 로 설정할 디렉토리에 사용 shell 바이너리와 공유 라이브러리를 복사한다.- /bin/bash를 현재 / 로 설정할 디렉토리에 복사
- /bin/bash의 공유 라이브러리 확인 : ldd /bin/bash
- linux-vdso.so.1 (0x00007ffcb49fa000) - 가상 라이브러리로 복사할 필요 없는 파일
libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007f8d3f8ed000) - 동작에 필요한 라이브러리
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8d3f6c5000) - Linux 공통 라이브러리
/lib64/ld-linux-x86-64.so.2 (0x00007f8d3fa87000) - 공유 라이브러리를 메모리에 로드하는 역할
- linux-vdso.so.1 (0x00007ffcb49fa000) - 가상 라이브러리로 복사할 필요 없는 파일
- 공유 라이브러리가 복사될 디렉토리 생성
- 공유 라이브러리 복사
- cp /lib/x86_64-linux-gnu/libtinfo.so.6 lib/x86_64-linux-gnu
- cp /lib/x86_64-linux-gnu/libc.so.6 lib/x86_64-linux-gnu/
- cp /lib64/ld-linux-x86-64.so.2 /lib64
- chroot로 / 디렉토리 변경
- chroot /home/tomato /bin/bash
root@ip-12-12-12-12:/home/tomato# ldd /bin/bash
linux-vdso.so.1 (0x00007fffb112c000)
libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007f590575d000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f5905535000)
/lib64/ld-linux-x86-64.so.2 (0x00007f59058f7000)
root@ip-12-12-12-12:/home/tomato#
root@ip-12-12-12-12:/home/tomato# tree .
.
├── bin
│ └── bash
├── lib
│ └── x86_64-linux-gnu
│ ├── libc.so.6
│ └── libtinfo.so.6
├── lib64
│ └── ld-linux-x86-64.so.2
└── test
5 directories, 4 files
root@ip-12-12-12-12:/home/tomato#
root@ip-12-12-12-12:/home/tomato# chroot /home/tomato /bin/bash
bash-5.1# pwd
/
bash-5.1# /bin/bash --version
GNU bash, version 5.1.16(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
bash-5.1#
cgroup (Control group)
- 프로세스들이 사용하는 시스템 자원의 사용 정보를 수집 및 제한시키는 Linux 커널 기능
- 모든 프로세스에 대해 리소스 사용 정보 수집
- 제한 가능한 자원 - CPU, Memory, Network, Device, Block I/O
- cgroup 기본 디렉토리 - /sys/fs/cgroup
- cgroup 종류 - Docker는 cgroupv1 사용
- cgroup 사용 가능한 서브 시스템
- blkio - 블록 장치(storage)에 대한 입/출력 제한
- cpu - 스케줄러를 이용해 해당 cgroup에 속한 프로세스의 CPU 사용 시간제한
- cpuacct - cgroup에 속한 CPU 자원 정보 생성
- cpuset - 개별 CPU 및 메모리 로드에 대한 cgroup 할당
- devices - cgroup 작업 단위로 장치에 대한 액세스 허용/거부
- freeze - cgroup 작업 일시 정지 또는 다시 시작
- memory - cgroup에 속한 프로세스의 메모리 사용 제한
- net_cls - 네트워크 태그 지정
- ns - namespace 서브 시스템
더보기
cgroup을 통해 cpu 사용량 제한 실습
cpu 사용량에 대한 테스트를 위한 utility 설치sudo apt updatesudo apt install -y stress
관리자 계정으로 전환su -sudo su
cgroup 디렉토리로 이동cd /sys/fs/cgroup
실습을 위한 임시 디렉토리 생성 및 이동mkdir utilscd utils
임시 디렉토리 이동해서 ls 출력하면 cgroup에서 기본적으로 생성한 파일들이 있음일반 파일, 0 byte
현재 shell의 Process ID 확인echo $$
현재 Process ID 정보를 tasks 파일에 저장echo $$ > taskstasks 파일 내용은 cgroup에 의해 자원을 제한을 적용할 Process ID
프로세스 생성 개수 제한 실습
pids.max 파일 내용은 생성할 수 있는 프로세스 수 제한, 기본은 maxutils 디렉토리에 있는 pids.max 파일의 내용을 원하는 개수의 프로세스 수로 변경
fork bomb - 프로세스 무제한 생성을 통한 서비스 거부 공격 방법:(){ :|:& };:
pids.max 값이 생성할 수 있는 프로세스의 수를 제한하여 fork bomb에 의해 무제한 생성하더라도pids.max에 설정된 값 만큼만 프로세스가 제한된다.
cgroup을 통해 CPU 사용량 제한 실습 (cgroup-tools 패키지 이용)
- cgroup-tools 패키지 설치
- sudo apt install -y group-tools
- cgcreate - cgroup을 이용한 자원 제한 그룹 생성
- cgdelete - cgroup 자원 제한 그룹 삭제
- sudo apt install -y group-tools
- 자원 제한 그룹 생성
- sudo cgreate -a <소유자 ID> -g cpu:<그룹 이름>
- /sys/fs/cgroup 디렉토리에 자원 제한 그룹 생성 됨
- CPU 자원 제한
- sudo cgset -r cpu.max=30000 <그룹 이름>
- CPU 사용량을 30%로 제한
- -r : 자원 제한 속성 지정
- sudo cgset -r cpu.max=30000 <그룹 이름>
namespace
- 프로세스 별로 별도의 커널 자원을 분할하는 Linux 커널 기능
- LXC (LinuX Container) 기술의 근간
- namespace 종류
- IPC, mnt, net, pid, pid_for_children, ust
- cgroup과 namespace
- cgroup - 프로세스 사용량 제한 목적
- namespace - 프로세스가 볼 수 있는 범위
- Container - 완전 격리된 프로세스
- cgroup에 의해서 자원 사용량 제한
- namespace를 통해 볼 수 있는 자원 제한
- namespace 종류
- PID namespace
- 프로세스 ID 정보를 격리, namespace 외 다른 프로세스에 접근 불가능
- Network namespace
- 네트워크 장치, IP 주소, 포트, 라우팅 테이블의 네트워크 리소스를 격리
- 가상 네트워크 장치 할당
- User namespace
- 프로세스 별로 UID, GID 정보 격리
- Mount namespace
- 프로세스 별로 마운트 되는 파일 시스템 격리
- IPC namespace
- IPC (프로세스 간 통신) 격리, 다른 프로세스의 접근이나 제어를 방지
- UTS namespace
- 호스트명이나 도메인명 격리
- PID namespace
namespace 생성
- unshare - namespace 생성 명령
- unshare [옵션] [프로그램 [argument]]
- -p : PID namespace 생성
- -m : Mount namespace 생성
- -i : IPC namespace 생성
- -f : child 프로세스 생성
- unshare [옵션] [프로그램 [argument]]
더보기
Mount namespace 실습
- 현재 Process ID 확인 - echo $$
- 관리자로 사용자 변경 - sudo su 또는 su -
- Mount namespace 생성
- unshare -m /bin/bash
- Mount namespace로 생성된 Process ID 확인 - echo $$
- tmpfs를 /mnt에 mount
- mount -t tmpfs tmpfs /mnt
- tmpfs
- 메모리 기반 임시 파일 시스템
- 사이즈를 지정하지 않으면 물리 메모리 절반 크기로 설정
- 휘발성 공간으로 reboot / booting 시 소멸
- tmpfs
- mount -t tmpfs tmpfs /mnt
- mount 확인
- mount | grep /mnt
- /mnt 디렉토리에 텍스트 파일 생성
- echo "hello" > text.txt
- 다른 터미널을 열어서 /mnt 디렉토리 내용 확인
- Mount namespace로 격리 된 프로세스는 접근할 수 없다.
- 따라서 /mnt 디렉토리 내용을 확인하면 내용이 없는 것으로 결과 출력
PID namespace 실습
- 현재 Process ID 확인 - echo $$
- 현재 상위 Process 정보 확인 - ps aux | head -n5
- namespace 생성
- unshare -pmif
- /proc 디렉토리에 proc mount
- mount -t proc none /proc
- 현재 상위 프로세스 정보 확인
- ps aux | haed -n5
root@ip-12-12-12-12:/home/ubuntu# ps aux | head -n5
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.5 166368 11476 ? Ss 03:54 0:02 /sbin/init
root 2 0.0 0.0 0 0 ? S 03:54 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? I< 03:54 0:00 [rcu_gp]
root 4 0.0 0.0 0 0 ? I< 03:54 0:00 [rcu_par_gp]
root@ip-12-12-12-12:/home/ubuntu# unshare -pmif
root@ip-12-12-12-12:/home/ubuntu# echo $$
1
root@ip-12-12-12-12:/home/ubuntu# mount -t proc none /proc
root@ip-12-12-12-12:/home/ubuntu# ps aux | head -n5
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.2 9100 5300 pts/1 S 06:45 0:00 -bash
root 13 0.0 0.1 10460 3268 pts/1 R+ 06:47 0:00 ps aux
root 14 0.0 0.0 6200 1056 pts/1 S+ 06:47 0:00 head -n5
root@ip-12-12-12-12:/home/ubuntu#
해당 실습들을 통해서 namespace로 완전히 격리됨을 알 수 있음
union file system
- Linux에서 사용하는 일반적인 파일 시스템은 mount를 하면 mount 된 내용만 확인할 수 있다.
- 기존 mount point에 대하여 새로운 파일 시스템으로 mount 하면
기존 파일 시스템은 가려지고 새로운 파일 시스템이 사용된다.
더보기
union file system 구성 실습
- 사용자 홈 디렉토리에 work 디렉토리 생성 - mkdir work
- 생성한 work 디렉토리에 파일 생성 - touch work/text.txt
- work 디렉토리를 새로운 파일 시스템으로 마운트
- sudo mount -t tmpfs tmpfs /home/ubuntu/work
- work 디렉토리 내용 확인
- work 디렉토리에 대한 mount 해제
- sudo umount /home/ubuntu/work
하면 아무 내용이 없음을 확인할 수 있다.
- union file system
- 하나의 디렉토리 위치에 여러 개 디렉토리를 마운트 하면 하나의 통합된 디렉토리처럼 보이게 하는 파일 시스템
- Docker Image와 Docker container가 union file system 기반으로 관리되고 있다.
- union file system 특징
- Image layer - 마지막 레이어를 제외하고 Read-only 성격
- Copy-on-write (COW) - 변경된 내용만 저장
- OverlayFS
- 하나의 파일 시스템을 다른 파일 시스템 상단에 overlay
- 하단 파일 시스템에 상관없이 구성 가능 (단, RedHat 계열 배포판에서는 XFS만 하단 파일 시스템으로 지원)
- Docker에서 사용하는 파일 시스템
- lowerdir (Image layer) - Read-only 영역, Docker Image 파일의 구조
- upperdir (Container layer) - Read-Write 영역, Docker Container 생성 시 Application에 의해 쓰기 되는 영역
더보기
OverlayFS 파일 시스템 구성 실습
- /tmp 디렉토리에 lower1, lower2, upper, merged, work 디렉토리 생성
- mkdir /tmp/{lower1,lower2,upper,merged,work}
- lower1, lower2 디렉토리에 파일 생성
- echo "lower1 a" /tmp/lower1/a.txt
- ...
- echo "lower2 b" /tmp/lower2/b.txt
- 파일 생성 확인
- ls -R /tmp/lower*
- 읽기 전용 overlay 생성
- sudo mount -t overlay overlay \
-o lowerdir=/tmp/lower1:/tmp/lower2 \
/tmp/merged- mount 파일 시스템 - overlay
- mount point - /tmp/merged
- lower1이 상위 lower2가 하위 레이어로 설정 - lowerdir=/tmp/lower1:/tmp/lower2
- lowerdir만 생성했기 때문에 /tmp/merged 디렉토리에는 새로운 내용을 추가할 수 없다.
- sudo mount -t overlay overlay \
- merged 디렉토리 마운트 정보 확인
- mount | grep merged
- 읽기/쓰기 가능한 overlay 생성
- sudo mount -t overlay overlay \
-o lowerdir=/tmp/lower1:/tmp/lower2,upperdir=/tmp/upper,workdir=/tmp/work/ \
/tmp/merged- /tmp/merged 디렉토리에 읽기 쓰기가 모두 가능하다.
- sudo mount -t overlay overlay \
- mount 해제
- sudo umount /tmp/merged
Docker Image와 Container
- Docker는 Client / Server 구조로 구성
- Docker Image는 read only 형식으로 Docker Container를 생성하기 위한 template
- Application을 위한 라이브러리와 package, 실행 환경 template
- Application이 실행하는데 필요한 모든 내용이 포함되어 있다.
- Docker image는 Layer 구조로 구성되어 있다.
- Docker image는 read only
- Docker container는 Docker image가 메모리에 로딩된 Instance
- Docker image로부터 생성된 Instance
- Docker image 부분은 read only
- Docker container가 데이터 기록하는 영역은 read / write 가능 영역
- Docker container 생성은 Application 실행을 의미한다.
- 참고 자료
- Docker home - https://www.docker.com/
- Docker hub (public registry) - https://hub.docker.com/
- Docker document - https://docs.docker.com/
TIF
버전 문제인지 모르겠으나
실습 중에 에러가 발생하는 상황들이 많아서 이해가 되지 않는 부분들이 많았다.
에러가 발생하는 상황들이 많아서 그런지 집중이 잘 되지 않았던 것 같다.
추가적으로 복습하면서 막히고 에러 나는 부분들은 검색해보고 해야 될 것 같다.
전 직장 거래처분들이 한 번씩 전화 주셔서 안부 묻고 격려해주시는데 꽤 기분 좋은 일인 것 같다.
2022. 09. 27 에 작성된 글입니다.
반응형
'구름 쿠버네티스' 카테고리의 다른 글
구름 쿠버네티스 전문가 과정 6기 - 41일차 (0) | 2023.10.24 |
---|---|
구름 쿠버네티스 전문가 과정 6기 - 40일차 (0) | 2023.10.23 |
구름 쿠버네티스 전문가 과정 6기 - 38일차 (1) | 2023.10.19 |
구름 쿠버네티스 전문가 과정 6기 - 37일차 (3) | 2023.10.17 |
구름 쿠버네티스 전문가 과정 6기 - 36일차 (0) | 2023.10.12 |