쿠버네티스 06. 리소스, 스케줄링, 오토스케일링
3주 과정, 하루 2시간

쿠버네티스 06. 리소스, 스케줄링, 오토스케일링

앞 사이트까지 Pod를 만들고 연결하는 법을 익혔다면, 이번에는 Pod가 어느 지점에 얼마만큼의 자리를 받고, 자리가 모자라면 어떻게 늘어나는지를 cgroup, kubelet, 스케줄러, 오토스케일러 순서로 파고듭니다. 위에서부터 하나씩 체크하세요.

다음 할 일

…

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

공부하는 방법

매일 1시간몰아서 8시간보다 매일 1시간이 오래 남습니다. 과제마다 예상 시간이 적혀 있습니다.
읽기 20%, 손 80%개념을 읽었으면 바로 kubectl describe와 events로 스케줄러와 kubelet이 무엇을 판단했는지 눈으로 확인합니다.
일부러 부수기설정을 틀리게 바꾸고, 에러 메시지만 보고 원인을 찾습니다.
소리 내 설명하기단계 끝의 자가 점검에 답을 보지 않고 말해 봅니다. 막히면 그 과제로 돌아갑니다.
맥북에서 실습하기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에서만 됩니다.

처음 보는 용어

requests컨테이너가 최소로 보장받을 CPU와 메모리. 스케줄러가 자리를 계산할 때 쓰고, CPU는 cgroup 가중치가 됩니다. 회의실 예약입니다.
limits컨테이너가 쓸 수 있는 최대치. CPU는 CFS 쿼터로 스로틀링, 메모리는 넘으면 OOMKilled. 최대 수용 인원입니다.
CPU 스로틀링CPU limits(100ms마다 쓸 수 있는 시간)를 다 써서 남은 구간 동안 멈추는 현상. 평균 사용량으로는 안 보이고 지연으로 나타납니다.
OOMKilled메모리 limits를 넘어 커널이 컨테이너를 종료한 상태. Exit Code 137과 함께 보입니다.
QoS 클래스requests와 limits 설정으로 자동으로 정해지는 등급(Guaranteed, Burstable, BestEffort). 퇴출과 OOM 순서에 영향을 줍니다.
Allocatable노드 전체 용량에서 시스템 예약과 퇴출 기준을 뺀, Pod에게 줄 수 있는 양. 스케줄러는 이 값을 봅니다.
퇴출(Eviction)kubelet이 노드 자원 압박이나 ephemeral-storage 초과 때 Pod를 Failed로 끝내는 것. drain이 쓰는 eviction API와 이름이 같지만 주체가 다릅니다.
ephemeral-storage컨테이너 쓰기 레이어, 로그, emptyDir 같은 노드 로컬 디스크 사용량. requests와 limits를 걸 수 있습니다.
LimitRange네임스페이스 안 컨테이너의 기본 requests/limits와 최소, 최대를 정하는 규칙.
ResourceQuota네임스페이스 전체의 requests, limits 합계와 오브젝트 개수 한도. 팀별 예산입니다.
스케줄링 프레임워크스케줄러를 큐, Filter(통과/탈락), Score(점수), Bind(기록) 같은 확장 지점과 플러그인으로 나눈 구조.
노드 어피니티Pod가 원하는 노드 레이블 조건. required는 반드시, preferred는 가능하면. 좌석 선호입니다.
taint와 tolerationtaint는 노드가 Pod를 밀어내는 표시(예약석), toleration은 그 표시를 견딜 수 있다는 Pod의 허가증.
topologySpreadConstraints영역이나 노드 사이의 Pod 개수 차이를 maxSkew 이하로 유지하는 분산 규칙.
PriorityClass와 선점Pod의 우선순위 숫자. 자리가 없으면 높은 Pod가 낮은 Pod를 밀어내고(선점) 들어갑니다.
PDB(PodDisruptionBudget)drain 같은 자발적 중단 때 최소 몇 개는 유지한다는 약속. eviction API가 확인합니다.
HPA지표(CPU, 메모리, 커스텀)에 따라 Pod 개수를 늘리고 줄이는 컨트롤러. 손님 수에 따라 직원 늘리기입니다.
VPA사용량 기록으로 requests 추천값을 계산하고, 모드에 따라 Pod에 적용하는 도구. 직원 책상 크기 조절입니다.
Cluster Autoscaler와 KarpenterPending Pod를 보고 노드를 늘리고 줄이는 도구. CA는 노드 그룹 크기를, Karpenter는 맞는 인스턴스를 직접 골라 만듭니다. 지점 늘리기입니다.
KEDA큐 길이 같은 이벤트 지표로 HPA를 만들어 주고, 이벤트가 없으면 0개까지 줄이는 이벤트 기반 오토스케일러.

계속 쓰게 될 자료