어쩌다 IT
article thumbnail
반응형

리뷰 (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) - 공유 라이브러리를 메모리에 로드하는 역할
    • 공유 라이브러리가 복사될 디렉토리 생성
    • 공유 라이브러리 복사
      • 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 update
    • sudo apt install -y stress
  • 관리자 계정으로 전환
    • su -
    • sudo su
  • cgroup 디렉토리로 이동
    • cd /sys/fs/cgroup
  • 실습을 위한 임시 디렉토리 생성 및 이동
    • mkdir utils
    • cd utils
  • 임시 디렉토리 이동해서 ls 출력하면 cgroup에서 기본적으로 생성한 파일들이 있음
    • 일반 파일, 0 byte
  • 현재 shell의 Process ID 확인
    • echo $$
  • 현재 Process ID 정보를 tasks 파일에 저장
    • echo $$ > tasks
    • tasks 파일 내용은 cgroup에 의해 자원을 제한을 적용할 Process ID

 

프로세스 생성 개수 제한 실습

  • pids.max 파일 내용은 생성할 수 있는 프로세스 수 제한, 기본은 max
  • utils 디렉토리에 있는 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 cgreate -a <소유자 ID> -g cpu:<그룹 이름>
    • /sys/fs/cgroup 디렉토리에 자원 제한 그룹 생성 됨
  • CPU 자원 제한
    • sudo cgset -r cpu.max=30000 <그룹 이름>
      • CPU 사용량을 30%로 제한
      • -r : 자원 제한 속성 지정

 

namespace

  • 프로세스 별로 별도의 커널 자원을 분할하는 Linux 커널 기능
  • LXC (LinuX Container) 기술의 근간
  • namespace 종류
    • IPC, mnt, net, pid, pid_for_children, ust
  • cgroup과 namespace
    • cgroup - 프로세스 사용량 제한 목적
    • namespace - 프로세스가 볼 수 있는 범위

namespace

 

  • Container - 완전 격리된 프로세스
    • cgroup에 의해서 자원 사용량 제한
    • namespace를 통해 볼 수 있는 자원 제한

  • namespace 종류
    • PID namespace
      • 프로세스 ID 정보를 격리, namespace 외 다른 프로세스에 접근 불가능
    • Network namespace
      • 네트워크 장치, IP 주소, 포트, 라우팅 테이블의 네트워크 리소스를 격리
      • 가상 네트워크 장치 할당
    • User namespace
      • 프로세스 별로 UID, GID 정보 격리
    • Mount namespace
      • 프로세스 별로 마운트 되는 파일 시스템 격리
    • IPC namespace
      • IPC (프로세스 간 통신) 격리, 다른 프로세스의 접근이나 제어를 방지
    • UTS namespace
      • 호스트명이나 도메인명 격리

 

namespace 생성

  • unshare - namespace 생성 명령
    • unshare [옵션] [프로그램 [argument]]
      • -p : PID namespace 생성
      • -m : Mount namespace 생성
      • -i : IPC namespace 생성
      • -f : child 프로세스 생성
더보기

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 시 소멸
  • 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 디렉토리에는 새로운 내용을 추가할 수 없다.
  • 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 디렉토리에 읽기 쓰기가 모두 가능하다.
  • 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 실행을 의미한다.
  • 참고 자료

TIF

버전 문제인지 모르겠으나

실습 중에 에러가 발생하는 상황들이 많아서 이해가 되지 않는 부분들이 많았다.

에러가 발생하는 상황들이 많아서 그런지 집중이 잘 되지 않았던 것 같다.

추가적으로 복습하면서 막히고 에러 나는 부분들은 검색해보고 해야 될 것 같다.

 

 

전 직장 거래처분들이 한 번씩 전화 주셔서 안부 묻고 격려해주시는데 꽤 기분 좋은 일인 것 같다.

 

 

2022. 09. 27 에 작성된 글입니다.

반응형
profile

어쩌다 IT

@jwlish

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!