들어가기 전에

- 일반적인 pod가 동작하는 방식에 대한 간단한 설명

파드 생성 명령어를 입력하면, 클러스터 내에 있는 master 노드(control plane)의 API pod로 요청이 들어간다.

API pod는 master 노드 내의 etcd 파드에 저장되어있는 클러스터의 상태정보를 꺼내어 scheduler pod 에 전달하여 pod 를 실행하기 가장 적합한 node 가 어딘지 조회한다.

API 는 해당 노드의 kubelet 에 pod 실행을 요청하며, kubelet 은 노드 내의 컨테이너 엔진을 통해 registry hub 에서 컨테이너 이미지를 다운받아 파드 형태로 실행하게 된다. 실행이 완료되면 컨테이너 엔진은 다시 kubelet 에게 실행정보를 전달하고, kubelet 은 다시 master 노드의 API 에 실행정보를 전달한다. API 는 etcd 파드에 해당 정보를 저장한다.

 

- 그렇다면 static pod 는 어떻게 실행될까?

일반 pod 는 API 를 통해 실행되는 반면, static pod 는 각 노드의 kubelet 에 의해 직접 실행된다.

더 자세히 설명하면, 각 node 에 daemon 형태로 떠있는 kubelet 프로세스는 각 노드 파일시스템의 /var/lib/kubelet/config.yaml 파일의 kubelet 구성정보를 기반으로 동작하는데, 이 파일에 static pod 를 배치시킬 위치 정보를 설정할 수 있다.(기본값 /etc/kubernets/manifests 디렉토리) 즉, /etc/kubernets/manifests 디렉토리 내에 pod.yaml 파일을 저장하면, kubelet 은 해당 정보로 pod 를 실행한다.(이것이 static pod). 반대로 해당 pod.yaml 을 삭제하면 kubelet 은 해당 pod 를 삭제한다.

 

여기서 master 노드(control plane)에 존재하는 API, etcd, scheduler, controller 등의 component 들도 실제로는 pod 인데, 어떻게 API pod 가 아직 생성되지 않은 상태에서 생성이 되는지에 대한 의문이 풀린다. mster node 의 kubelet daemon이 바라보는 manifests 내에 해당 컴포넌트들이 설정되어있기 때문이다.(모두 static pod 인 것이다)

 

 

 

참고: CKA의 static pod 를 문제에서는 configure kubelet to start a pod on the node 로 표현함.

1. pod 템플릿 생성

$ kubectl run <파드명> --image=<이미지명> --dry-run=client -o yaml

출력된 파드 설정 내용을 복사해둔다.

 

2. 작업할 node 접속

$ ssh <접속할노드명>

 

3. root 전환

$ sudo -i

 

4. static pod 설정파일을 생성하여 pod 실행

$ cat /var/lib/kubelet/config.yaml # kubelet 구성파일 출력

출력된 정보 중 staticPodPath 경로 확인 후 해당 경로로 이동

$ cd /etc/kubernetes/manifests

 

$ cat > <pod설정파일명>.yaml

복사했던 pod 설정정보 shift + insert 로 붙여넣고 ctrl + d 로 저장(불필요한 내용은 제거)

자동으로 static pod 가 실행된다.

 

5. master 노드로 복귀 후 static pod 확인

$ kubectl get pods

<pod명>-<node명> 규칙으로 파드가 생성된 것을 확인 가능

 

참고영상: https://www.youtube.com/watch?v=u0Wg0HBVmmk&list=PLApuRlvrZKojqx9-wIvWP3MPtgy2B372f&index=7&ab_channel=TTABAE-LEARN

'Kubernetes' 카테고리의 다른 글

[Kubernetes] pod 생성하기  (0) 2025.05.25
[Kubernetes] etcd 파드 스냅샷 백업 및 복구 방법  (0) 2025.05.25
블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,

1. 클러스터 전환

$ kubectl config use-context <사용할컨텍스트명>

 

2. 네임스페이스 생성

$ kubectl create namespace <네임스페이스명> # 네임스페이스 생성
$ kubectl get namespaces # 네임스페이스 확인

 

3. 네임스페이스 내부에 pod 생성

공식문서: https://kubernetes.io/docs/reference/kubectl/generated/kubectl_run/

$ kubectl run <파드명> \
  --namespace <네임스페이스명> \
  --image=<사용할이미지명:버전> \
  --env=<key=value> \
  --dry-run-client \ # 테스트로 돌리기
  -o yaml # 생성 결과를 yaml 형태로 출력하기
$ kubectl get pod --namespace <네임스페이스명> # 특정 네임스페이스에서 동작중인 파드 확인

 

 

 

참고영상: https://www.youtube.com/watch?v=c5kdKi3wAaM&list=PLApuRlvrZKojqx9-wIvWP3MPtgy2B372f&index=6&ab_channel=TTABAE-LEARN

블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,

1. 현재 컨텍스트 확인

$ kubectl config current-context

 

 

2. 작업 시스템(node) 접속 및 환경 확인

$ ssh <node명> # 특정 node에 ssh 접속
$ etcd --version # etcd 버전 확인
$ etcdctl version # etcdctl 버전 확인

 

3. etcd backup

공식문서: https://kubernetes.io/docs/tasks/administer-cluster/configure-upgrade-etcd/#restoring-an-etcd-cluster

$ ETCDCTL_API=3 etcdctl \
  --endpoints=https://127.0.0.1:2379 \
  --cacert=<인증서ca파일경로> \
  --cert=<클라이언트인증서파일경로> \
  --key=<클라이언트키파일경로> \
  snapshot save <백업스냅샷파일경로>

 

4. restore

공식문서: https://kubernetes.io/docs/tasks/administer-cluster/configure-upgrade-etcd/#restoring-an-etcd-cluster

$ ETCDCTL_API=3 etcdctl \
  --data-dir <복구한스냅샷이풀릴경로> \
  snapshot restore <복구할스냅샷파일경로>

 

5. etcd 파드의 data 경로 수정 적용

 

특정 네임스페이스로 동작중인 etcd pod 확인

$ kubectl get pod -n kube-system

 

 

출력 중 etcd pod 확인 가능

해당 etcd pod의 설정경로는 /etc/kubernetes/manifests/etcd.yaml 이며, spec.volumes[].name: etcd-data 의 hostPath.path 부분을 복구한 스냅샷이 풀린 경로로 수정하여 저장하면 static pod 이기 때문에 자동으로 restart 되며 적용됨.

docker ps | grep etcd 로 etcd pod 내의 컨테이너가 정상적으로 up 되었는지 확인.

 

 

 

참고 영상: https://www.youtube.com/watch?v=dv_5WCYS5P8&list=PLApuRlvrZKojqx9-wIvWP3MPtgy2B372f&index=4&ab_channel=TTABAE-LEARN

'Kubernetes' 카테고리의 다른 글

[Kubernetes] static pod 생성하기  (0) 2025.05.25
[Kubernetes] pod 생성하기  (0) 2025.05.25
블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,

1. 명령어 설명

리눅스 dd 명령어는 블록 단위로 파일복사, 파일변환을 수행하는 명령어이다.

리눅스 시스템에서는 디스크도 파일로 간주되므로, 디스크 및 디스크의 파티션을 복제하는데 사용 가능하다.

아래와 같은 용도로 자주 사용된다.

  • 파일 및 장치 복사
  • 디스크 및 파티션 백업/복원
  • 사이즈를 지정한 swap 파일 생성
  • 사이즈를 지정한 더미파일 생성
  • 디스크 I/O 성능 측정
Usage: dd [OPERAND]...
  or:  dd OPTION
Copy a file, converting and formatting according to the operands.

  bs=BYTES        read and write up to BYTES bytes at a time (default: 512);
                  overrides ibs and obs
  cbs=BYTES       convert BYTES bytes at a time
  conv=CONVS      convert the file as per the comma separated symbol list
  count=N         copy only N input blocks
  ibs=BYTES       read up to BYTES bytes at a time (default: 512)
  if=FILE         read from FILE instead of stdin
  iflag=FLAGS     read as per the comma separated symbol list
  obs=BYTES       write BYTES bytes at a time (default: 512)
  of=FILE         write to FILE instead of stdout
  oflag=FLAGS     write as per the comma separated symbol list
  seek=N          skip N obs-sized blocks at start of output
  skip=N          skip N ibs-sized blocks at start of input
  status=LEVEL    The LEVEL of information to print to stderr;
                  'none' suppresses everything but error messages,
                  'noxfer' suppresses the final transfer statistics,
                  'progress' shows periodic transfer statistics

N and BYTES may be followed by the following multiplicative suffixes:
c =1, w =2, b =512, kB =1000, K =1024, MB =1000*1000, M =1024*1024, xM =M,
GB =1000*1000*1000, G =1024*1024*1024, and so on for T, P, E, Z, Y.

 

2. 자주 사용하는 옵션

  • bs: 한번에 읽고 쓸 수 있는 최대 바이트 크기. 즉, block size
  • count: 복사할 block 수. 즉, bs * count 크기의 사이즈만큼 복사
  • if: 입력 파일 경로
  • of: 출력 파일 경로

3. 옵션에 사용되는 suffix 단위

  • c: 1byte (Character)
  • w: 2bytes (Word)
  • b: 512bytes (Block)
  • K: 1024bytes (Kibibyte, KiB)

4. 사용예시

[더미파일 생성]

# dd if=/dev/zero of=/dummyfile bs=1024 count=1024

=> 파일을 /dummyfile 경로에 생성하되, 0 문자(정확히는, ASCII NUL(0x00) 문자)를 복사해 채우며, 1024 byte 블록 단위로 1024번에 걸쳐 복사한다.

 

[디스크/파티션 복제]

# dd if=/dev/sdb1 of=/dev/sdc1 bs=1024

=> /dev/sdb1 파티션을 /dev/sdc1 파티션으로 복제하되, 1024byte 블록 단위로 복제한다.

 

[디스크/파티션 초기화]

# dd if=/dev/zero of=/dev/sdb1

=> /dev/sdb1 파티션을 초기화한다.

 

[파일을 복사하며 내용 중 소문자를 모두 대문자로 변환]

# dd if=/log1 of=/log1_upper bs=1024 conv=ucase

=> /log1 의 내용을 /log1_upper 로 1024byte 블록 단위로 복사하며, 모든 소문자를 대문자로 변환한다.

 

*/dev/zero 는 0을 무한히 반환하는 특수 파일

블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,

1. swap 파일 생성

명령어: dd if=/dev/zero of=/swapfile1 bs=1024 count=1048576

 

옵션 설명

  • bs: block size 로, byte 단위로 지정(1024byte == 1Kib)
  • count: block 갯수 지정
  • if: 빈 값으로 채우기 위해 /dev/zero 고정
  • of: 스왑파일경로 지정

 

2. swap 파일 권한 변경

명령어: chmod 600 {스왑파일명}

e.g) chmod 600 /swapfile1

 

3. swap 파일에 swap 파일 시스템 생성

swap 포멧으로 설정하는 행위

명령어: mkswap {스왑파일명}

e.g) mkswap /swapfile1

 

4. 부팅시 스왑파일 자동 활성화 설정 및 swap 활성화

/etc/fstab 에 아래 내용을 추가

/swapfile1 swap swap defaults 0 0

 

swapon -a

 

5. 확인

명령어: swapon -s

Type 이 file 인 스왑 생성 확인

블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,

1. 디스크 추가

디스크 추가 후 lsblk 로 추가된 디스크 확인

 

2. 스왑용 파티션 생성

fdisk 또는 gdisk 명령어로 생성

명령어: gdisk {블록디바이스명}

e.g) gdisk /dev/sdc

 

안내된 커맨드에 따라 파티션 생성

스왑 파티션의 GUID 를 지정하는데, 이때 L 을 입력하여 스왑 파티션 코드를 확인하여 입력해야함

 

3. swap 파일 시스템 설정

스왑용 파티션을 스왑 타입으로 포멧하는 행위이다.

명령어: mkswap {파티션명}

e.g) mkswap /dev/sdc1

 

이제 blkid {파티션명} 으로 파티션 확인시 TYPE="swap" 으로 확인된다.

 

4. swap 활성화

명령어: swapon {파티션명}

e.g) swapon /dev/sdc1

 

5. swap 활성화 확인

swapon -s

 

6. 부팅시 스왑 파티션 자동 마운트 설정

/etc/fstab 파일에 아래 내용 등록

{스왑파티션명} swap swap defaults 0 0

 

7. /etc/fstab 에 등록된 내용 중 마운트되지 않은 스왑 파티션을 마운트

명령어: swapon -a

블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,

리눅스에서는 프로세스를 실행할 메모리 공간이 부족한 경우, 기존 프로세스 중 일부를 swap 공간(디스크 파티션 or 파일)으로 이동시켜 메모리 공간을 확보한다.

swap 공간으로 이동시키는 프로세스를 선택하는 기준은 아래와 같다.

  • 가장 오랫동안 사용되지 않은 프로세스(LRU)
  • priority 점수가 가장 높은(=우선순위가 낮음) 프로세스(0~39)

swap 공간으로 이동한 프로세스는 다시 호출될 때 메모리에 여유공간이 있다면 메모리로 다시 불러와진다.

 

1. swap 사용량 확인

  • free
  • top
  • swapon -s

e.g)

# free
              total        used        free      shared  buff/cache   available
Mem:        4017408      528376     2969828       13620      519204     3332876
Swap:       1048572           0     1048572

# top
top - 13:05:38 up 11:19,  0 users,  load average: 1.93, 1.98, 2.05
Tasks:   4 total,   1 running,   3 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.1 us,  0.1 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :   3923.2 total,   2896.2 free,    520.0 used,    507.1 buff/cache
MiB Swap:   1024.0 total,   1024.0 free,      0.0 used.   3250.7 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
    1 root      20   0    3620   2432   2304 S   0.0   0.1   0:00.09 bash
    8 root      20   0    3884   2944   2560 S   0.0   0.1   0:00.21 bash
   92 root      20   0    1948   1024   1024 S   0.0   0.0   0:00.00 sleep
  102 root      20   0    5732   2560   2176 R   0.0   0.1   0:00.00 top
  
# swapon -s
Filename				Type		Size	Used	Priority
/var/lib/swap                          	file    	1048572	0	-2

 

2. swap 비활성화

swapoff {스왑파일경로}

  • 스왑파일경로: swapon -s 로 조회된 Filename 경로

 

3. swap 활성화

swapon {스왑파일경로}

  • 스왑파일경로: swapon -s 로 조회된 Filename 경로

 

4. 부팅시 자동 활성화

/etc/fstab 에 아래 내용 추가

{스왑장치명} none swap sw 0 0
블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,

1. 디스크 용량 확장

 

2. 파티션 확장

growpart 패키지 사용

마지막 파티션을 확장하는 유틸리티. 마지막 파티션만 확장이 가능하며, 무조건 디스크의 마지막 섹터까지 모두 확장된다.

 

설치방법

  • centos: yum install -y cloud-utils-growpart
  • ubuntu: apt install -y cloud-guest-utils

 

사용방법

growpart {디스크명} {파티션번호}

e.g) growpart /dev/sdb 1

 

3. 파티션 내 파일시스템 확장

디스크 용량과 파티션 용량을 확장했더라도, 해당 파티션의 파일시스템을 포멧(타입 지정)해주지 않으면 파일시스템상에서 인식하지 못함.(df 명령어로 확인)

따라서, 파일시스템 확장을 수행해주어야 한다.

확장하려는 파일시스템 타입이 ext4 인지 xfs 인지에 따라 명령어가 다름

  • ext4: resize2fs {파티션명} {사이즈}
  • xfs: xfs_growfs {파티션명}

ext4 포멧인 경우는 파일시스템 확장/축소 모두 사이즈를 지정해서 가능하며, xfs 인 경우는 확장만 가능함

resize2fs 사이즈 파라미터 생략시 현재 파티션 사이즈를 사용

축소는 마운트 된 상태에서는 불가능하며, 확장은 마운트 된 상태에서도 가능하다.

블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,

디스크를 추가했다고 바로 사용할 수 있는게 아니라, 파일 시스템에 연결을 해 주어야 함.

즉, 특정 디렉토리와 추가한 디스크를 연결해준다고 이해하면 됨.

 

파티셔닝을 통해 1개의 물리적인 디스크를 2개 이상의 논리적인 블록 디바이스로 인식할 수 있음.(/dev/sdb1, /dev/sdb2, ...)

1개의 디스크 전체를 파티셔닝하지 않고 사용할 수도 있지만, 일반적으로 관리/확장성을 고려해 파티셔닝을 진행.

 

1. 추가 장착한 디스크 확인

명령어: lsblk

 

e.g) /dev/sdb 조회 확인

 

2. 파티셔닝

명령어: fdisk 또는 gdisk

fdisk {장치명}

 

e.g) fdisk /dev/sdb

입력 후 가이드에 커맨드를 입력하여 따라 파티션 조회/생성/수정/삭제 진행

 

자주 쓰는 파티셔닝 커맨드

  • p: 파티션 정보 출력
  • n: 새 파티션 생성
  • d: 파티션 삭제
  • t: 파티션 타입 변경
  • w: 저장 후 fdisk 종료
  • q: 저장 없이 fdisk 종료

 

3. 디스크 포멧(포멧타입 지정)

명령어: mkfs[ options] -t {파일시스템 타입} {장치명}

 

대표적인 filesystem 타입

  • ext4: ubuntu 배포판의 기본값
  • xfs: centos 배포판의 기본값
  • vfat: windows 와 호환됨
  • ntfs: windows 와 호환됨

 

참고

mkfs -t ext4 를 실행하면 실제로는 mkfs.ext4 로 동작함

mkfs -t xfs 를 실행하면 실제로는 mkfs.xfs 로 동작함

 

e.g) mkfs -t ext4 /dev/sdb1

실행하여 포멧을 지정하면 4Kib 크기의 블록들이 생성되고, 각각의 블록에는 index(inode) 가 붙어서 접근이 용이하게 된다.

blkid {장치명} 을 실행하면 파티션 id인 PARTUUID 이외에, 파일시스템상 id인 UUID 와 TYPE 정보도 출력된다.

 

4. 장치연결(mount)

디스크를 파일시스템의 특정 디렉토리에 연결하는 행위

명령어: mount {장치명} {마운트경로}

 

e.g) mount /dev/sdb1 /backup

 

mount 명령어를 인자 없이 실행하면 전체 마운트된 목록을 출력한다.

 

마운트 해제: umount {장치명 or 마운트경로}

 

5. 부팅시 자동마운트 되도록 설정

mount 설정파일인 /etc/fstab 파일에 설정

각 항목 설명

file system mount point type options dump fsck
장치명 or UUID 마운트 디렉토리 파일시스템 타입 마운트 옵션

defaults: rw, nouser, auto, exec, suid(일반적인 파일 시스템에 사용)
dump 명령어로 백업 허용 여부

0: 허용안함
1: 허용함
fsck 명령어로 부팅시 파일시스템 검사 여부

0: 검사안함
1: 1순위로 검사(root 파일 시스템)
2: 2순위로 검사(root 이외 파일 시스템)

 

e.g) /etc/fstab

# <file system> <mount point> <type> <options> <dump> <pass>
/dev/sdb1 /backup ext4 defaults 0 0

 

6. 자동마운트 설정 추가한 파일시스템을 마운트

명령어: mount -a

/etc/fstab 에 등록된 파일시스템 중 아직 마운트 안 된 파일시스템 전부 마운트 하는 명령어

블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,

1. 디스크 확인

리눅스 시스템에서 디스크는 블록 디바이스로 취급되며, 이를 확인하는 명령어. 

$ lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
vda    254:0    0  59.6G  0 disk
`-vda1 254:1    0  59.6G  0 part /etc/hosts
vdb    254:16   0   140M  1 disk
vdc    254:32   0 621.6M  1 disk

 

vda 블록 디바이스는 파티션이 vda1 하나로 이루어져 있음을 의미

vdb 블록 디바이스는 파티셔닝이 되어있지 않음을 의미

 

블록 디바이스(디스크) 이름 규칙

디스크 종류 디바이스 이름 규칙 파티션 이름 규칙 비고
플로피 디스크 /dev/fd0, /dev/fd1    
CDROM /dev/sr0, /dev/cdrom    
IDE 디스크 /dev/hda, /dev/hdb    
SCSI 디스크 /dev/sda, /dev/sdb /dev/sda1, /dev/sda2  
NVMe /dev/nvme0n1, /dev/nvme0n2 /dev/nvme0n1p1, /dev/nvme0n1p2 컨소시엄에서 SSD 전용으로 만든 표준

 

 

2. 블록 디바이스 id 확인

blkid

블록 디바이스의 uuid 와 파일 시스템 타입을 출력

 

 

 

블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,