[구름 k8s] TIL 2-4-2

Peppie·2022년 9월 27일
0

1. Docker / 기반 기술 이해

cgroup (Control Group)

프로세스들이 사용하는 시스템 자원의 사용 정보 수집/제한시키는 Linux 커널 기능
모든 프로세스에 대해 리소스 사용 정보 수집
제한 가능한 자원 : CPU, Memory, Network, Device, Block IO

cgroup 기본 디렉토리

/sys/fs/cgroup

cgroup 종류

Docker는 cgroupv1 사용

cgroup 사용 가능한 서브 시스템

blkio : 블록 장치(storage)에 대한 입출력 제한
cpu : 스케줄러를 이용해 해당 cgroup에 속한 프로세스 CPU 사용시간 제한
cpuacct : cgroup에 속한 CPU 자원 정보 생성
cpuset : 개별 CPU 및 메모리 로드에 대한 cgroup 할당
devices : cgroup 작업 단위로 장치에 대한 액세스 허용/거부
freeze : cgroup 작업 일시정지 or 다시 시작
memory : cgroup에 속한 프로세스의 메모리 사용 제한
net_cls : 네트워크 태그 지정
ns : namespace 서브 시스템

실습 내용

cgroup을 통해 cpu 사용량 제한 실습 (cgroup-tools 패키지 이용)

  • cgroup-tools 패키지 설치 : sudo apt install -y cgroup-tools
    • cgcreate 명령 : cgroup을 이용한 자원 제한 그룹 생성
    • cgdelete 명령 : cgroup 자원 제한 그룹 삭제
  • 자원 제한 그룹 생성 : sudo cgcreate -a <소유자 ID> -g cpu:<그룹 이름>

    /sys/fs/cgroup 디렉토리에 자원 제한 그룹 생성

    • -a : 그룹 소유자 ID
    • -g : 자원 제한 그룹명
  • CPU 자원 제한
    • sudo cgset -r cpu.cfs_quota_us=30000
      설정 에러 발생시 아래 내용으로 설정
    • sudo cgset -r cpu.max=3000 <그룹 이름>
      CPU 사용량을 30%로 제한
      -r : 자원 제한 속성 지정
    • sudo cgexec -g cpu:<그룹 이름> stress -c 1
      stress 명령을 자원 제한 그룹에 적용
      -g : 자원 제한 그룹명
    • sudo cgdelete cpu:<그룹 이름>
      자원 제한 그룹 삭제

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

  • pids.max 파일 내용을 생성할 수 있는 프로세스 수 설정 : 기본은 max (최대한으로 생성)
  • utils 디렉토리에 있는 pids.max 파일의 내용을 원하는 프로세스 개수로 변경
    • echo 20 > pids.max
  • fork bomb : 프로세스 무제한 생성을 통한 서비스 거부 공격 방법 (해킹방법 中 1)
    • :(){ :|:& };:
  • pids.max 값이 생성 가능한 프로세스 수를 제한 -> 실제 fork bomb에 의해서 프로세스가 무한 생성되려 해도 pids.max에 설정된 값 만큼만 프로세스 제한

namespace

프로세스별로 별도의 커널 자원은 분할하는 Linux 커널 기능
LXC (LinuX Container) 기술의 근간

namespace 종류

IPC, mnt, net, pid, pid_for_children, uts

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

호스트명 or 도메인명 격리

실습 내용

unshare 명령

namespace 생성 명령

unshare [옵션]  [프로그램 [argument]]

-p : PID namespace 생성
-m : Mount namespace 생성
-i : IPC namespace 생성
-f : child 프로세스 생성

Mount namespace 실습

  • 현재 프로세스 ID 확인 : echo $$

  • 관리자로 사용자 변경 : sudo su

  • Mount namespace 생성 : unshare -m /bin/bash

  • Mount namespace로 생성된 프로세스 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 디렉토리 내용을 확인하면 내용이 없는 것으로 결과 출력
  • nsenter 명령

    • namespace enter
    • 격리된 namespace에 진입하는 명령
      nsenter [옵션] [program [argument]]
      • -t : PID
      • -a : 전체 namespace

PID namespace

  • 현재 PID 확인 : echo $$
  • 현재 상위 프로세스 정보 확인 : ps aux | head -n5
  • namespace 생성 : unshare -pmif
  • /proc 디렉토리에 proc mount : mount -t proc none /proc
  • 현재 상위 프로세스 정보 확인 : ps aux | head -n5

union file system

Linux에서 사용하는 일반적인 파일 시스템은 mount 실행시 mount된 내용만 확인 가능

  • 사용자 홈 디렉토리에 work 디렉토리 생성 : mkdir work
  • 생성한 work 디렉토리에 파일 생성 : touch work/text.txt
  • work 디렉토리를 새로운 파일 시스템으로 마운트 : sudo mount -t tmpfs tmpfs /home/ubuntu/work
  • work 디렉토리 내용 확인 : ls -lRF work 또는 mount | grep tmpfs
  • work 디렉토리에 대한 mount 해제 : sudo umount /home/ubuntu/work


기존 mount point에 대하여 새로운 파일 시스템으로 mount하면 기존 파일 시스템은 가려지고 새로운 파일 시스템이 사용됨

union file system

하나의 디렉토리 위치에 여러개의 디렉토리를 마운트하면 하나의 통합된 디렉토리처럼 보이게 하는 파일 시스템

  • Docker Image와 Docker Container가 union file system 기반으로 관리됨

특징

  • Image Layer : 마지막 레이어(RW)를 제외하고 Read-only 성격
  • Copy-on_write (COW) : 변경된 내용만 저장

OverlayFS

  • 하나의 파일 시스템을 다른 파일 시스템 상단에 overlay

  • 하단 파일 시스템에 상관없이 구성 가능
    (단 RedHat 계열 Linux 배포판에서는 XFS만 하단 파일 시스템으로 지원)

  • Docker에서 사용하는 파일 시스템

  • lowerdir (Image Layer) : Read-only 영역 -> 쓰기 불가능, Docker Image 파일의 구조

  • uppderdir (Container Layer) : Read-Write 영역 -> 쓰기 가능
    Docker Container 생성시 Application에 의해 쓰기 되는 영역

실습 내용

OverlayFS 파일 시스템 구성 실습

  • /tmp 디렉토리에 lower1, lower2, merged, upper, work 디렉토리 생성
    : mkdir /tmp/{lower1,lower2,upper,merged,work}
  • lower1, lower2 디렉토리에 파일 생성

    echo "lower1 a" > /tmp/lower1/a.txt
    echo "lower1 b" > /tmp/lower1/b.txt
    echo "lower2 a" > /tmp/lower2/a.txt
    echo "lower2 c" > /tmp/lower2/b.txt

  • 읽기 전용 overlay 생성
    sudo mount -t overlay overlay -o lowerdir=/tmp/lower1:/tmp/lower2 /tmp/merged
    • mount 파일 시스템 : overlay
    • mount 포인트 : /tmp/merged
    • lowerdir=/tmp/lower1:/tmp/lower2
    • /tmp/merged 디렉토리에는 새로운 내용 추가 불가능 (읽기전용이니까)
    • mount | grep merged : merged 디렉토리 마운트 정보 확인
  • 읽기/쓰기 가능한 overlay
sudo mount \
-t overlay overlay \
-o lowerdir=/tmp/lower1:/tmp/lower2,upperdir=/tmp/upper,workdir=/tmp/work \
/tmp/merged

/tmp/merged 디렉토리는 읽기쓰기 모두 가능
실습 끝나면 sudo umount /tmp/merged로 마운트 해제 (선택사항)

Docker Image와 Container

docker는 Client/Server 구조로 구성
docker hub (public registry) / docker document

Docker Image

read only 형식으로 docker container를 생성하기 위한 template

  • application을 위한 라이브러리와 package & 실행환경 template
  • application이 실행되는데 필요한 모든 내용 포함
  • docker image는 layer 구조로 구성됨
  • docker image는 read only

Docker Container

docker image가 메모리에 로딩된 인스턴스

  • docker image로부터 생성된 인스턴스

  • docker image 부분은 read only

  • docker container가 데이터 기록하는 영역은 read/write 기능 영역

  • docker container 생성 means 어플리케이션 실행

  • docker registrydocker image 저장소 -> 대표적인 public registry는 docker hub

2. TIF

정말 뭐가 뭐라는지 1도 모르겠다. 사람살려

0개의 댓글