쿠버네티스 03. 워크로드와 설정
3주 과정, 하루 1~2시간

쿠버네티스 03. 워크로드와 설정

Pod 한 개의 생명주기부터 Deployment, StatefulSet, DaemonSet, Job, 설정 주입, 장애 드릴까지 CKAD 수준으로 깊게 다룹니다. 앞 사이트에서 익힌 kind 클러스터와 kubectl 기본기를 그대로 씁니다. 위에서부터 하나씩 체크하세요.

다음 할 일

…

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

공부하는 방법

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

처음 보는 용어

Pod phasePod의 큰 상태 다섯 가지(Pending, Running, Succeeded, Failed, Unknown)입니다. kubectl의 STATUS 열은 이보다 자세한 요약입니다.
restartPolicy컨테이너가 끝났을 때 다시 시작할지 정하는 규칙입니다. Always, OnFailure, Never가 있고 Deployment는 Always만 씁니다.
CrashLoopBackOff컨테이너가 반복해서 종료되어 kubelet이 점점 길게(최대 5분) 기다렸다가 다시 시작하는 상태입니다.
terminationGracePeriodSecondsPod 삭제 시 preStop과 종료 정리에 주는 전체 시간(기본 30초)입니다. 넘으면 SIGKILL로 강제 종료합니다.
preStop 훅종료 시그널을 보내기 전에 kubelet이 실행하는 명령입니다. 엔드포인트 제거가 퍼질 시간을 벌 때 sleep을 넣습니다.
EndpointSliceService 뒤에 있는 Pod 주소와 상태(ready, serving, terminating) 목록입니다. kube-proxy가 이것을 보고 규칙을 만듭니다.
init 컨테이너앱 컨테이너보다 먼저 순서대로 실행되어 성공해야 하는 준비용 컨테이너입니다.
네이티브 사이드카initContainers에 restartPolicy: Always를 붙인 컨테이너입니다. 앱보다 먼저 시작하고 늦게 끝나며 Job 완료를 막지 않습니다.
Downward APIPod 이름, IP, 노드, 레이블, 리소스 한도 같은 자기 정보를 환경 변수나 파일로 넣어 주는 기능입니다.
startupProbe앱 시작이 끝났는지 검사합니다. 성공할 때까지 liveness와 readiness 검사를 미룹니다.
readinessProbe트래픽을 받을 준비가 됐는지 검사합니다. 실패하면 Service 엔드포인트에서 빠지지만 재시작되지 않습니다.
livenessProbe컨테이너가 살아 있는지 검사합니다. 연속으로 실패하면 kubelet이 컨테이너를 다시 시작합니다.
maxSurge / maxUnavailable롤링 업데이트 중 원하는 수보다 더 띄울 수 있는 Pod 수와, 모자라도 되는 Pod 수입니다.
progressDeadlineSeconds롤아웃이 이 시간 동안 진척이 없으면 Deployment에 ProgressDeadlineExceeded를 기록합니다. 자동 롤백은 하지 않습니다.
헤드리스 ServiceclusterIP: None인 Service입니다. 가상 IP 없이 Pod마다 DNS 이름을 만들어 StatefulSet과 함께 씁니다.
partitionStatefulSet 롤링 업데이트에서 이 순번 이상인 Pod만 새 버전으로 바꾸게 하는 값입니다.
Indexed JobcompletionMode: Indexed인 Job입니다. Pod마다 0부터 시작하는 번호(JOB_COMPLETION_INDEX)를 받아 일을 나눕니다.
concurrencyPolicyCronJob의 이전 Job이 아직 돌 때 새 회차를 어떻게 할지 정합니다. Allow, Forbid, Replace가 있습니다.
subPath볼륨 안의 파일 하나만 골라 마운트하는 방법입니다. ConfigMap, Secret 갱신이 반영되지 않는 함정이 있습니다.
immutableConfigMap, Secret을 바꿀 수 없게 고정하는 옵션입니다. 실수로 바뀌는 것을 막고 kubelet의 watch 부하를 줄입니다.

계속 쓰게 될 자료