쿠버네티스 04. 스토리지
2주 과정, 하루 2~3시간

쿠버네티스 04. 스토리지

파드의 임시 볼륨부터 PV와 PVC, StorageClass, CSI 내부 동작, 스냅샷과 확장, StatefulSet 저장소, 장애 드릴까지 한 번에 깊게 다룹니다. 01~03 사이트를 끝냈다고 가정합니다.

다음 할 일

…

실습 방법 보기
전체 진행0 / 0
진행 상황: 이 브라우저에 저장

공부하는 방법

매일 1시간몰아서 8시간보다 매일 1시간이 오래 남습니다. 과제마다 예상 시간이 적혀 있습니다.
읽기 20%, 손 80%개념을 읽었으면 바로 kubectl로 객체를 보고, docker exec로 노드 안의 실제 디렉터리까지 눈으로 확인합니다.
일부러 부수기설정을 틀리게 바꾸고, 에러 메시지만 보고 원인을 찾습니다.
소리 내 설명하기단계 끝의 자가 점검에 답을 보지 않고 말해 봅니다. 막히면 그 과제로 돌아갑니다.
맥북에서 실습하기Windows에서 한다면 건너뛰세요

맥에서는 Ubuntu 가상 머신(VM)을 하나 띄워 그 안에서 실습합니다. 그러면 이 사이트의 명령을 Windows(WSL)와 똑같이 쓸 수 있습니다. 사이트에 "WSL Ubuntu 터미널"이라고 나오면 "VM 터미널"로 읽으세요.

  1. Homebrew 설치 (맥용 설치 관리자)회사 맥이면 설치 전에 IT팀 승인을 확인하세요.
    /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
  2. Ubuntu 가상 머신 만들고 들어가기Multipass는 무료입니다. 이 VM이 Windows의 WSL 역할을 합니다.
    brew install --cask multipass                                  # 가상 머신 관리 도구 설치
    multipass launch --name ubuntu --cpus 2 --memory 4G --disk 20G  # Ubuntu VM 만들기 (쿠버네티스는 --memory 8G 권장)
    multipass shell ubuntu                                          # VM 터미널로 들어가기
    # 여기서부터 사이트의 "WSL Ubuntu 터미널" 명령을 그대로 실행
  3. 맥 브라우저에서 VM 안의 서비스 열기WSL과 달리 localhost가 자동으로 연결되지 않습니다.
    multipass info ubuntu | grep IPv4  # VM의 IP 확인 (예: 192.168.64.5)
    # 브라우저에서 localhost 대신 http://<VM IP>:<포트> 로 접속
    # kubectl port-forward 는 --address 0.0.0.0 을 붙여야 맥에서 열림
  4. 끝나면 정리VM은 켜 두면 맥의 메모리를 계속 씁니다.
    multipass stop ubuntu            # VM 끄기 (내용은 남음)
    multipass start ubuntu           # 다시 켜기
    multipass delete --purge ubuntu  # 완전히 삭제

kind 클러스터와 Docker는 VM 안에서 설치하고 만듭니다. 멀티 노드 실습은 VM 메모리를 8G 이상으로 주세요.

WSL 설치, PowerShell 명령건너뜁니다. 위 2번 VM이 대신합니다.
Apple Silicon(M1 이후) 맥VM에서 uname -m이 aarch64면 다운로드 주소의 amd64를 arm64로 바꿉니다. arm64 버전이 없는 이미지는 exec format error가 날 수 있습니다.
Docker Desktop맥도 큰 회사는 유료입니다. VM 안의 Docker Engine을 쓰고, 맥에서 직접 쓰려면 무료인 Colima를 씁니다.
파일 주고받기multipass transfer 파일 ubuntu: 또는 multipass mount ~/study ubuntu:/home/ubuntu/study
브라우저로 열기localhost 대신 VM IP를 씁니다 (위 3번).

VM 없이 맥에서 바로 하고 싶다면 brew install kubectl kind helm colima docker 로 도구를 깔 수 있습니다. 단, 리눅스 내부(namespace, cgroup, systemd, iptables)를 들여다보는 실습은 VM에서만 됩니다.

처음 보는 용어

Volume파드 안 컨테이너들이 같이 쓰는 저장 공간. 종류에 따라 수명이 파드와 같거나(emptyDir) 파드보다 깁니다(PV).
emptyDir파드가 노드에 배치될 때 만들어지는 빈 디렉터리. 파드가 지워지면 같이 사라집니다. medium: Memory면 메모리에 만듭니다.
hostPath노드의 파일 경로를 컨테이너에 그대로 붙이는 볼륨. 노드 장악 위험이 있어 Pod Security baseline에서 막힙니다.
projected 볼륨configMap, secret, downwardAPI, 서비스 어카운트 토큰을 한 디렉터리에 모아 붙이는 볼륨.
PersistentVolume(PV)실제 저장소 하나를 쿠버네티스 객체로 나타낸 것. 클러스터 범위이고 관리자나 provisioner가 만듭니다.
PersistentVolumeClaim(PVC)사용자가 '이만큼, 이런 방식으로 쓸 저장소'를 요청하는 신청서. 네임스페이스 안에 있고 PV와 1:1로 묶입니다.
StorageClassPV를 자동으로 만드는 방법을 적은 객체. provisioner, 회수 정책, 바인딩 시점, 확장 허용 여부를 정합니다.
동적 프로비저닝PVC가 생기면 provisioner가 저장소와 PV를 자동으로 만들어 주는 방식. 관리자가 PV를 미리 만들 필요가 없습니다.
reclaimPolicyPVC가 지워졌을 때 PV와 실제 저장소를 남길지(Retain) 지울지(Delete) 정하는 규칙.
accessModes볼륨을 몇 노드(또는 파드)에서 어떻게 쓸지. RWO, ROX, RWX, RWOP 네 가지이며 RWO는 노드 기준입니다.
volumeMode볼륨을 포맷된 디렉터리(Filesystem)로 붙일지, 포맷 없는 장치(Block)로 붙일지 정하는 필드.
WaitForFirstConsumerPVC를 쓰는 파드가 노드에 배치될 때까지 저장소 생성을 미루는 바인딩 방식. 노드나 영역에 묶인 저장소에 필수입니다.
CSI쿠버네티스와 스토리지 제품을 잇는 표준 인터페이스. 드라이버는 CreateVolume, NodePublishVolume 같은 gRPC를 구현합니다.
CSI 사이드카쿠버네티스 객체를 watch해 CSI 호출로 바꿔 주는 보조 컨테이너. external-provisioner, attacher, resizer, snapshotter 등이 있습니다.
CSIDriver와 CSINodeCSIDriver는 드라이버의 성질(attach 필요 여부 등)을, CSINode는 노드별 등록 드라이버와 노드 ID, 토폴로지를 담는 객체.
VolumeAttachment어떤 PV를 어느 노드에 붙였는지 기록하는 객체. attach/detach 컨트롤러가 만들고 external-attacher가 처리합니다.
VolumeSnapshotPVC의 특정 시점 스냅샷을 요청하는 객체. 실제 스냅샷은 VolumeSnapshotContent, 방법은 VolumeSnapshotClass가 담습니다.
volumeClaimTemplatesStatefulSet이 파드마다 이름이 고정된 PVC를 만들 때 쓰는 틀. 스케일을 줄여도 PVC는 기본적으로 남습니다.
fsGroup파드 securityContext 필드. 지원하는 볼륨의 소유 그룹을 이 값으로 바꿔 비 root 컨테이너도 쓸 수 있게 합니다.
Velero쿠버네티스 객체와 볼륨 데이터를 객체 저장소에 백업하고 다른 클러스터에 복원하는 오픈소스 도구.

계속 쓰게 될 자료