Oh My Algorithm
☸️인프라·DevOps

Kubernetes 알고리즘

원하는 상태를 선언하면 계속 그 상태로 맞춘다. 아래 12개 항목을 인터랙티브 시각화로 단계별로 학습해 보세요.

☸️파드 (Pod)

쿠버네티스가 다루는 가장 작은 단위는 컨테이너가 아니라 파드입니다. 파드는 컨테이너 하나 이상을 한 묶음으로 감싸고, 그 안의 컨테이너들은 IP 하나와 볼륨을 함께 씁니다. 그래서 서로를 localhost 로 부르고 같은 파일을 나눠 볼 수 있습니다. 배치도 생사도 묶음 단위라, 파드가 노드에 놓이는 단위이자 다시 시작되는 단위가 됩니다.

함께 배치 · 함께 재시작
☸️노드와 파드 (Node & Pod)

노드는 클러스터에 자원을 대는 기계이고, 파드는 그 위에 잠깐 놓이는 것입니다. 노드는 스스로 무엇을 띄울지 정하지 않습니다 — 만드는 것은 컨트롤러, 놓을 자리를 고르는 것은 스케줄러이고, 노드의 kubelet 은 받아서 띄웁니다. 그래서 파드는 노드를 옮겨 다니지 않습니다. 옮겨 간 것처럼 보이는 것은 사실 지워지고 다른 곳에 새로 만들어진 것입니다.

빌린 기계 · 놓이는 것
☸️잡 · 크론잡 (Job & CronJob)

디플로이먼트는 파드가 몇 개 떠 있는지를 지키고, 잡은 몇 번 성공했는지를 셉니다. 정산이나 데이터 이관처럼 끝나야 하는 일을 개수로 다루면 파드가 끝날 때마다 빈자리로 보여 영원히 다시 뜹니다. 잡은 정해진 완료 횟수를 채우면 새 파드를 만들지 않고 멈추고, 크론잡은 그 잡을 정해진 시각마다 찍어냅니다.

끝나는 일 · 완료 횟수
☸️원하는 상태 (Desired State)

쿠버네티스에는 절차를 시키지 않고 결과를 선언합니다. 웹 서버를 세 개 두라고 적어 두면, 컨트롤러가 지금 상태를 계속 들여다보며 선언과 다를 때마다 차이를 좁힙니다. 노드가 죽어 파드가 사라져도 누가 복구 명령을 내리지 않습니다. 셋이어야 하는데 둘이라는 사실만으로 새 파드가 만들어집니다.

선언형 · 컨트롤 루프
☸️롤링 업데이트 (Rolling Update)

디플로이먼트는 파드를 고치지 않고 갈아 끼웁니다. 새 버전을 선언하면 새 ReplicaSet 을 만들고, 새 파드 하나가 준비를 마친 뒤에야 낡은 파드 하나를 내립니다. 그래서 교체가 진행되는 내내 이용 가능한 개수가 선언한 값 아래로 내려가지 않습니다. 무중단은 특별한 장치가 아니라 이 순서에서 나옵니다.

무중단 교체 · 롤백
☸️오토스케일링 (HPA)

개수를 직접 적는 대신 목표를 적어 두는 방식입니다. 오토스케일러는 파드들의 평균 사용률을 주기적으로 재고, 목표와의 비율만큼 개수를 곱해 필요한 수를 구합니다. 늘어난 파드가 같은 부하를 나눠 지면 사용률이 내려가고, 그 값이 다시 다음 판단의 입력이 됩니다 — 개수와 지표가 서로를 끌어당기는 되먹임입니다.

지표 되먹임 · 목표 사용률
☸️프로브 (Liveness · Readiness)

컨테이너가 떠 있다는 것과 요청을 받을 수 있다는 것은 다릅니다. kubelet 은 주기적으로 컨테이너에 물어보고, 같은 응답 없음에 두 가지로 답합니다. readiness 가 실패하면 서비스 엔드포인트에서 빼기만 하고, liveness 가 실패하면 컨테이너를 죽여 다시 띄웁니다. 어느 쪽을 걸었는지가 장애 때 트래픽만 끊길지 프로세스가 재시작될지를 가릅니다.

빼기 vs 재시작
☸️서비스 (Service)

파드는 죽고 다시 태어나며 그때마다 IP 가 바뀝니다. 서비스는 그 앞에 변하지 않는 주소를 하나 세우고, 뒤에 설 파드를 이름이 아니라 라벨 조건으로 고릅니다. 조건에 맞는 파드가 뜨면 저절로 목록에 들어오고 사라지면 빠지지만, 부르는 쪽이 쓰는 주소는 조금도 바뀌지 않습니다.

고정 주소 · 라벨 셀렉터
☸️인그레스 (Ingress)

서비스가 세운 주소는 클러스터 안에서만 닿습니다. 밖에서 들어오는 트래픽까지 받으려면 서비스마다 문을 내야 하고, 그러면 IP도 인증서도 서비스 수만큼 늘어납니다. 인그레스는 그 문을 하나로 모으고, 요청의 호스트와 경로가 어느 규칙에 걸리는지로 목적지를 정합니다. 도메인이 여럿이어도 입구는 하나입니다.

입구 하나 · 호스트·경로 라우팅
☸️ConfigMap · 시크릿 (Config & Secret)

같은 코드가 개발과 운영에서 다르게 돌아야 합니다. 값을 이미지에 구워 넣으면 코드는 똑같은데 환경 수만큼 이미지가 갈라지고, 값 하나를 고칠 때마다 다시 굽게 됩니다. 설정을 ConfigMap 과 시크릿으로 빼 두면 이미지는 하나로 남고, 파드가 뜰 때 환경변수나 파일로 값이 얹힙니다.

이미지 하나 · 설정 주입
☸️볼륨 · PV/PVC (Persistent Volume)

컨테이너가 남긴 파일은 컨테이너와 수명을 같이합니다. 파드가 다시 뜨면 그 자리는 비어 있고, 다른 노드로 옮겨 가면 더 분명해집니다. 남아야 하는 데이터는 파드 밖에 둬야 하고, 그때 파드는 디스크를 직접 고르는 대신 얼마나 어떻게 쓸지를 PVC 로 요청합니다.

요청과 실물 · 파드보다 오래 사는 자리
☸️스케줄링 · requests/limits (Scheduling)

파드를 만들어도 곧바로 도는 것은 아닙니다. 어느 노드에 놓을지 정해져야 컨테이너가 시작됩니다. 스케줄러가 보는 값은 지금 쓰고 있는 양이 아니라 파드가 선언한 requests 의 합, 즉 예약된 몫입니다. 담을 수 없는 노드를 걸러 내고 남은 후보에 점수를 매겨 한 곳을 고릅니다.

예약된 몫 · 필터와 점수