Kubernetes 알고리즘
원하는 상태를 선언하면 계속 그 상태로 맞춘다. 아래 12개 항목을 인터랙티브 시각화로 단계별로 학습해 보세요.
쿠버네티스가 다루는 가장 작은 단위는 컨테이너가 아니라 파드입니다. 파드는 컨테이너 하나 이상을 한 묶음으로 감싸고, 그 안의 컨테이너들은 IP 하나와 볼륨을 함께 씁니다. 그래서 서로를 localhost 로 부르고 같은 파일을 나눠 볼 수 있습니다. 배치도 생사도 묶음 단위라, 파드가 노드에 놓이는 단위이자 다시 시작되는 단위가 됩니다.
함께 배치 · 함께 재시작노드는 클러스터에 자원을 대는 기계이고, 파드는 그 위에 잠깐 놓이는 것입니다. 노드는 스스로 무엇을 띄울지 정하지 않습니다 — 만드는 것은 컨트롤러, 놓을 자리를 고르는 것은 스케줄러이고, 노드의 kubelet 은 받아서 띄웁니다. 그래서 파드는 노드를 옮겨 다니지 않습니다. 옮겨 간 것처럼 보이는 것은 사실 지워지고 다른 곳에 새로 만들어진 것입니다.
빌린 기계 · 놓이는 것디플로이먼트는 파드가 몇 개 떠 있는지를 지키고, 잡은 몇 번 성공했는지를 셉니다. 정산이나 데이터 이관처럼 끝나야 하는 일을 개수로 다루면 파드가 끝날 때마다 빈자리로 보여 영원히 다시 뜹니다. 잡은 정해진 완료 횟수를 채우면 새 파드를 만들지 않고 멈추고, 크론잡은 그 잡을 정해진 시각마다 찍어냅니다.
끝나는 일 · 완료 횟수쿠버네티스에는 절차를 시키지 않고 결과를 선언합니다. 웹 서버를 세 개 두라고 적어 두면, 컨트롤러가 지금 상태를 계속 들여다보며 선언과 다를 때마다 차이를 좁힙니다. 노드가 죽어 파드가 사라져도 누가 복구 명령을 내리지 않습니다. 셋이어야 하는데 둘이라는 사실만으로 새 파드가 만들어집니다.
선언형 · 컨트롤 루프디플로이먼트는 파드를 고치지 않고 갈아 끼웁니다. 새 버전을 선언하면 새 ReplicaSet 을 만들고, 새 파드 하나가 준비를 마친 뒤에야 낡은 파드 하나를 내립니다. 그래서 교체가 진행되는 내내 이용 가능한 개수가 선언한 값 아래로 내려가지 않습니다. 무중단은 특별한 장치가 아니라 이 순서에서 나옵니다.
무중단 교체 · 롤백개수를 직접 적는 대신 목표를 적어 두는 방식입니다. 오토스케일러는 파드들의 평균 사용률을 주기적으로 재고, 목표와의 비율만큼 개수를 곱해 필요한 수를 구합니다. 늘어난 파드가 같은 부하를 나눠 지면 사용률이 내려가고, 그 값이 다시 다음 판단의 입력이 됩니다 — 개수와 지표가 서로를 끌어당기는 되먹임입니다.
지표 되먹임 · 목표 사용률컨테이너가 떠 있다는 것과 요청을 받을 수 있다는 것은 다릅니다. kubelet 은 주기적으로 컨테이너에 물어보고, 같은 응답 없음에 두 가지로 답합니다. readiness 가 실패하면 서비스 엔드포인트에서 빼기만 하고, liveness 가 실패하면 컨테이너를 죽여 다시 띄웁니다. 어느 쪽을 걸었는지가 장애 때 트래픽만 끊길지 프로세스가 재시작될지를 가릅니다.
빼기 vs 재시작파드는 죽고 다시 태어나며 그때마다 IP 가 바뀝니다. 서비스는 그 앞에 변하지 않는 주소를 하나 세우고, 뒤에 설 파드를 이름이 아니라 라벨 조건으로 고릅니다. 조건에 맞는 파드가 뜨면 저절로 목록에 들어오고 사라지면 빠지지만, 부르는 쪽이 쓰는 주소는 조금도 바뀌지 않습니다.
고정 주소 · 라벨 셀렉터서비스가 세운 주소는 클러스터 안에서만 닿습니다. 밖에서 들어오는 트래픽까지 받으려면 서비스마다 문을 내야 하고, 그러면 IP도 인증서도 서비스 수만큼 늘어납니다. 인그레스는 그 문을 하나로 모으고, 요청의 호스트와 경로가 어느 규칙에 걸리는지로 목적지를 정합니다. 도메인이 여럿이어도 입구는 하나입니다.
입구 하나 · 호스트·경로 라우팅같은 코드가 개발과 운영에서 다르게 돌아야 합니다. 값을 이미지에 구워 넣으면 코드는 똑같은데 환경 수만큼 이미지가 갈라지고, 값 하나를 고칠 때마다 다시 굽게 됩니다. 설정을 ConfigMap 과 시크릿으로 빼 두면 이미지는 하나로 남고, 파드가 뜰 때 환경변수나 파일로 값이 얹힙니다.
이미지 하나 · 설정 주입컨테이너가 남긴 파일은 컨테이너와 수명을 같이합니다. 파드가 다시 뜨면 그 자리는 비어 있고, 다른 노드로 옮겨 가면 더 분명해집니다. 남아야 하는 데이터는 파드 밖에 둬야 하고, 그때 파드는 디스크를 직접 고르는 대신 얼마나 어떻게 쓸지를 PVC 로 요청합니다.
요청과 실물 · 파드보다 오래 사는 자리파드를 만들어도 곧바로 도는 것은 아닙니다. 어느 노드에 놓을지 정해져야 컨테이너가 시작됩니다. 스케줄러가 보는 값은 지금 쓰고 있는 양이 아니라 파드가 선언한 requests 의 합, 즉 예약된 몫입니다. 담을 수 없는 노드를 걸러 내고 남은 후보에 점수를 매겨 한 곳을 고릅니다.
예약된 몫 · 필터와 점수