쿠버네티스 08. 클러스터 운영과 트러블슈팅
4주 과정, 하루 1시간

쿠버네티스 08. 클러스터 운영과 트러블슈팅

kind 대신 VM에 kubeadm으로 클러스터를 직접 세우고, 인증서, etcd 백업과 복구, 업그레이드, 관측성, 장애 드릴까지 CKA 수준으로 운영해 봅니다. VM이 어려우면 Killercoda의 kubeadm 실습 환경을 쓰세요.

다음 할 일

…

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

공부하는 방법

매일 1시간몰아서 8시간보다 매일 1시간이 오래 남습니다. 과제마다 예상 시간이 적혀 있습니다.
읽기 20%, 손 80%고장을 일부러 낸 다음, 증상 → 로그 → 원인 → 복구 순서로 kubectl, journalctl, crictl로 눈으로 확인합니다.
일부러 부수기설정을 틀리게 바꾸고, 에러 메시지만 보고 원인을 찾습니다.
소리 내 설명하기단계 끝의 자가 점검에 답을 보지 않고 말해 봅니다. 막히면 그 과제로 돌아갑니다.
맥북에서 실습하기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에서만 됩니다.

처음 보는 용어

kubeadmcontrol plane을 만들고 노드를 합류시키고 업그레이드하는 공식 도구입니다. 본사 개업과 리모델링을 대신해 주는 시공 업체입니다.
static podAPI 서버가 아니라 kubelet이 노드의 매니페스트 폴더를 보고 직접 띄우는 Pod입니다. control plane 구성 요소가 이렇게 뜹니다.
mirror podstatic pod를 kubectl로 볼 수 있게 API 서버에 등록한 읽기 전용 사본입니다. 지워도 kubelet이 다시 등록합니다.
containerdkubelet의 요청을 받아 이미지를 받고 컨테이너를 실행하는 런타임입니다. 도시락 데우는 전자레인지입니다.
cgroup 드라이버컨테이너 자원 제한을 리눅스 cgroup에 적용하는 방식입니다. kubelet과 런타임이 둘 다 systemd로 맞아야 합니다.
crictlCRI 규격으로 런타임에 직접 묻는 디버깅 도구입니다. API 서버가 죽어도 노드에서 컨테이너를 볼 수 있습니다.
PKICA와 인증서로 신원을 증명하는 체계입니다. kubeadm은 /etc/kubernetes/pki에 CA 세 개와 인증서들을 만듭니다.
SAN인증서가 유효한 이름과 IP 목록입니다. 목록에 없는 주소로 API 서버에 접속하면 x509 에러가 납니다.
kubeconfig접속할 클러스터 주소, CA, 사용자 인증서, 그 조합(context)을 적은 파일입니다. 어느 창구에 어떤 사원증을 들고 갈지 적은 쪽지입니다.
etcd 쿼럼쓰기를 확정하는 데 필요한 과반 멤버 수입니다. 멤버 n개면 (n/2 내림)+1이고, 3개는 1대, 5개는 2대 장애를 견딥니다.
스냅샷(etcd)etcd 데이터 전체를 한 파일로 저장한 백업입니다. etcdctl로 저장하고 etcdutl로 검사, 복구합니다.
defrag삭제된 데이터가 남긴 빈 공간을 정리해 DB 파일 크기를 줄이는 작업입니다. 도는 동안 해당 멤버가 멈추므로 하나씩 합니다.
버전 차이 정책구성 요소 간 허용되는 마이너 버전 차이 규칙입니다. control plane을 먼저 올리고 kubelet은 API 서버보다 새로울 수 없습니다.
drain노드를 스케줄 불가로 표시하고 Pod를 Eviction API로 퇴거시키는 작업입니다. PDB를 지킵니다.
PDB(PodDisruptionBudget)자발적 중단(drain 등) 때 최소로 살아 있어야 할 Pod 수를 정한 규칙입니다.
노드 Conditionskubelet이 보고하는 노드 상태(Ready, MemoryPressure, DiskPressure, PIDPressure)입니다. 문제가 있으면 taint가 자동으로 붙습니다.
eviction 임계값노드 자원이 이 값 아래로 내려가면 kubelet이 Pod를 퇴거시키는 기준입니다. 기본 memory.available 100Mi, nodefs.available 10% 등입니다.
Allocatable노드 용량에서 예약분과 eviction 임계값을 뺀, Pod에 줄 수 있는 자원량입니다. 스케줄러가 이 값으로 판단합니다.
kube-prometheus-stackPrometheus, Alertmanager, Grafana, kube-state-metrics, node-exporter를 한 번에 설치하는 Helm 차트입니다.
런북알림이나 증상별로 확인 명령, 원인 후보, 복구 절차, 확인 방법을 적은 운영 매뉴얼입니다.

계속 쓰게 될 자료