레이블이 ps인 게시물을 표시합니다. 모든 게시물 표시
레이블이 ps인 게시물을 표시합니다. 모든 게시물 표시

runc 사용하기

# runc 는 docker, kubernetes(k8s)등에서 사용하는 OCI(Open Container Initiative) 표준을 준수하는 container 기동(spawning and running) CLI 툴이다.

# golang 설치
wget https://go.dev/dl/go1.17.5.linux-amd64.tar.gz
sudo rm -rf /usr/local/go
sudo tar -C /usr/local/ -zxf go1.17.5.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin
go version

# runc 빌드 및 설치(최신 golang 버전 필요)
cd runc
make && sudo make install

# 일반유저(vagrant)도 docker 명령을 실행할 수 있게 vagrant 계정을 docker 그룹에 추가
# 한번 exit 하고 다시 로그인해야 한다.
sudo usermod -aG docker vagrant

# busybox 이미지의 파일시스템(파일들)을 tar 로 export
docker export $(docker create busybox) -o busybox_exported.tar

# root 계정으로 전환
sudo -Es

# container 에 압축 풀기
# runc 기동시 rootfs 이름의 디렉토리를 찾는다.
cd ~
mkdir -p ./ysoftman_container/rootfs
tar xvf busybox_exported.tar -C ./ysoftman_container/rootfs

# runc 에서 사용할 명세서 생성
# 기본 명세의 config.json 파일이 생성된다.
# spec -> create a new specification file
cd ysoftman_container
tree -L 2
runc spec
ls config.json

# runc 로 ysoftman1 이름의 컨테이너 기동
runc run ysoftman1

# ysoftman1 컨테이너에서 namespace 확인
ls -ahl /proc/$$/ns

# 호스트 터미널 하나더 열고 root 계정으로 전환
sudo -Es

# 호스트에서 runc 같와 runc 가 실행한 sh 프로세스가 확인
ps -ef | grep -E "runc| sh$"

# 호스트에서 
# runc 네임스페이스 확인
lsns -p $(ps -ef | grep -v grep | grep "runc run ysoftman1" | awk '{print $2}')

# ysoftman1컨테이너(runc)가 실행한 sh pid 로 namespace 상태 확인
lsns -p $(ps --ppid=$(ps -ef | grep -v grep | grep "runc run ysoftman1" | awk '{print $2}') -o pid | grep -v PID)

# 호스트에서 runc 로 기동된 컨테이너 리스트 보기
runc list

# 테스트 결과

# runc help
checkpoint  checkpoint a running container
create      create a container
delete      delete any resources held by the container often used with detached container
events      display container events such as OOM notifications, cpu, memory, and IO usage statistics
exec        execute new process inside the container
kill        kill sends the specified signal (default: SIGTERM) to the container's init process
list        lists containers started by runc with the given root
pause       pause suspends all processes inside the container
ps          ps displays the processes running inside a container
restore     restore a container from a previous checkpoint
resume      resumes all processes that have been previously paused
run         create and run a container
spec        create a new specification file
start       executes the user defined process in a created container
state       output the state of a container
update      update container resource constraints
features    show the enabled features

#####

# 위 golang, runc, busybox 준비되어 있는 상태에서
# rootless container 생성해 보기
# root 계정이라면 일반 계정으로 나오기
exit

# ysoftman_rootless_container 에 압축풀기
cd ~
mkdir -p ./ysoftman_rootless_container/rootfs
tar xvf busybox_exported.tar -C ./ysoftman_rootless_container/rootfs

# rootless 옵션으로 runc 에서 사용할 명세서 생성
cd ysoftman_rootless_container
runc spec --rootless

# /tmp/runc 를 루트로 하는 ysoftman_rootless_container 실행
runc --root /tmp/runc run ysoftman_rootless_container

# 컨터이너에서 user id 와 네임스페이스 확인
id
ls -l /proc/$$/ns

# 호스트에서
# 루트 경로 및 state.json 확인해보기
tree /tmp/runc
cat /tmp/runc/ysoftman_rootless_container/state.json | jq . | head -10

# 호스트에서 runc 같와 runc 가 실행한 sh 프로세스가 확인
ps -ef | grep -E "runc| sh$"

# runc 네임스페이스 확인
lsns -p $(ps -ef | grep -v grep | grep "runc run ysoftman_rootless_container" | awk '{print $2}')

# ysoftman1컨테이너(runc)가 실행한 sh pid 로 namespace 상태 확인
lsns -p $(ps --ppid=$(ps -ef | grep -v grep | grep "runc run ysoftman_rootless_container" | awk '{print $2}') -o pid | grep -v PID)

# user 네이스페이스 id 가 ysoftman_rootless_container 가 호스트와 다르다.
# ysoftman_rootless_container 의 root 로 보이지만 호스트의 root는 아니다.

# 테스트 결과

process 파일 이용하기

# 리눅스는 모든게 파일이다. 프로세스도 /proc/프로세스ID 파일로 확인할 수 있다.
# 현재 프로세스가 실행중이면 커맨드라인 파악
cat /proc/$$/cmdline

# 특정 (httpd) 프로세스의 쉘 환경변수 중 ysoftman 값 파악
sudo cat /proc/$(ps -e -o pid,command | command grep -i httpd | head -n1 | awk '{print $1}')/environ | tr '\0' '\n' | grep -iE ^ysoftman

# 참고로 현재 프로세스(pid)의 stdout 을 보기 위해 
# 새 터미널에서 cat /proc/{pid}/fd/1 를 실행후 입력하면 문자가 개별적으로
# pid 가 실행중인 /dev/pts/1 과 cat 이 실행중인 /dev/pts/2 중 한쪽에만 출력된다.


uptime cpu load high 찾기

# uptime 확인시 2년 넘게 운영되는 서버가
# system load average (cpu) 가 높게 나오고 계속 올라간다.
# top, htop 에서 프로세스들의 cpu 사용률 확인해 봤지만
# 아래 그림과 같이 높은 cpu 를 사용하는 프로세스는 보이지 않았다.
# 대신 cpu 1개가 계속 100% 상태다.


# 하지만 다음과 같이 pcpu(%cpu) 항목 보기로 cpu 사용률정렬(-r)해서 보면 보인다.
ps -eo %cpu,pid,user,args -r | head -3
%CPU   PID USER     COMMAND
 99    895 root     /sbin/rngd -f
 8.1 30810 root     /usr/lib/systemd/systemd-journald
 0.9 30738 root     htop

# 참고로 맥에서는 -f 기본에 %cpu 컬럼추가해서 봐도 된다.
ps -ef -o %cpu -r | head -3

# htop 에서 CPU% 가 99%인 /sbin/rngd 가 ps 로 보면 높은 cpu 사용률을 보인다.
# 찾아보니 rngd 는 Check and feed random data from hardware device to kernel 로 위와 같은 상황시 재부팅해야한다고 한다.
# 커널 3.10.0-514.21 부터 /dev/hwrnd 가 생겼고
# 기존 rngd 에서 에러가 발생할 수 있어 업데이트가 필요하다고 한다.