노드

노드 (Nodes)

Kubernetes는 컨트롤 플레인이 관리하며 Pod를 실행하는 데 필요한 서비스를 포함하는 머신을 노드라고 불러요. 보통 클러스터에는 여러 노드가 있고, 학습 환경이나 리소스가 제한된 환경에서는 노드가 하나뿐일 수도 있어요.

노드의 컴포넌트에는 kubelet, 컨테이너 런타임, kube-proxy가 있어요.

출처: Kubernetes 공식 문서 — Nodes

관리 (Management)

API 서버에 Node를 추가하는 방법은 크게 두 가지가 있어요:

  1. 노드의 kubelet이 컨트롤 플레인에 자체 등록(self-register)
  2. 당신(또는 다른 인간 사용자)이 Node 객체를 수동으로 추가

노드의 자체 등록 (Self-registration of Nodes)

kubelet 플래그 --register-node가 true(기본값)일 때 kubelet은 API 서버에 자신을 등록하려고 시도해요. 이는 대부분의 배포판이 사용하는 선호 패턴입니다.

자체 등록을 위해 kubelet은 다음 옵션으로 시작됩니다:

  • --kubeconfig - API 서버에 자신을 인증할 자격 증명의 경로.
  • --cloud-provider - 자신에 대한 메타데이터를 읽기 위해 클라우드 제공자와 통신하는 방법.
  • --register-node - API 서버에 자동 등록.
  • --register-with-taints - 주어진 taint 목록으로 노드를 등록(쉼표로 구분된 <key>=<value>:<effect>). register-node가 false면 아무런 동작도 하지 않아요.
  • --node-ip - 노드의 IP 주소의 선택적 쉼표 구분 목록.

이 인자를 제공하지 않으면 kubelet은 노드의 기본 IPv4 주소(있을 경우)를 사용해요. 노드에 IPv4 주소가 없다면 kubelet은 노드의 기본 IPv6 주소를 사용합니다.

  • --node-labels - 클러스터에서 노드를 등록할 때 추가할 라벨(NodeRestriction admission 플러그인이 강제하는 라벨 제약 참고).
  • --node-status-update-frequency - kubelet이 노드 상태를 API 서버에 게시하는 빈도를 지정.

Node 인가 모드와 NodeRestriction admission 플러그인이 활성화되면 kubelet은 자신의 Node 리소스만 생성/수정하도록 인가받아요.

노드 상태 (Node status)

노드의 상태에는 다음 정보가 포함됩니다:

  • 주소(Addresses)
  • 조건(Conditions)
  • 용량과 할당 가능량(Capacity and Allocatable)
  • 정보(Info)

kubectl로 노드 상태와 기타 세부 정보를 볼 수 있어요:

kubectl describe node <insert-node-name-here>

자세한 내용은 Node 상태를 참고하세요.

노드 하트비트 (Node heartbeats)

Kubernetes 노드가 보내는 하트비트는 클러스터가 각 노드의 가용성을 판단하고, 장애가 감지되면 조치를 취하는 데 도움을 줘요.

노드에는 두 가지 형태의 하트비트가 있어요:

  • Node의 .status에 대한 업데이트.
  • kube-node-lease 네임스페이스 안의 Lease 객체. 각 Node는 연관된 Lease 객체를 가지고 있어요.

노드 컨트롤러 (Node controller)

노드 컨트롤러는 노드의 다양한 측면을 관리하는 Kubernetes 컨트롤 플레인 컴포넌트예요. 노드 컨트롤러는 노드 수명 주기에서 여러 역할을 맡아요. 첫 번째는 노드가 등록될 때(만약 CIDR 할당이 켜져 있다면) 노드에 CIDR 블록을 할당하는 것입니다.

축출(eviction)의 속도 제한 (Rate limits on eviction)

노드를 가용 영역(availability zone)에 분산하는 핵심 이유는 전체 영역이 다운됐을 때 워크로드를 정상 영역으로 옮길 수 있게 하기 위해서예요. 그래서 영역의 모든 노드가 비정상이면 노드 컨트롤러는 정상 속도인 --node-eviction-rate로 축출합니다. 모서리(edge) 경우는 모든 영역이 ...

노드 컨트롤러는 또한 NoExecute taint가 있는 노드에서 실행 중인 Pod를 축출하는 책임도 있어요. 단, 그 Pod가 그 taint를 견딜(tolerate) 수 있는 경우는 제외해요. 노드 컨트롤러는 노드 도달 불가(not reachable)나 준비 안 됨(not ready) 같은 노드 문제에 해당하는 taint도 추가해요. 즉 스케줄러는 비정상 노드에 Pod를 배치하지 않게 됩니다.

리소스 용량 추적 (Resource capacity tracking)

Node 객체는 노드의 리소스 용량에 대한 정보(예: 사용 가능한 메모리 양과 CPU 수)를 추적해요.

자체 등록하는 노드는 등록 중에 자신의 용량을 보고해요. Node를 수동으로 추가한다면, 추가할 때 노드의 용량 정보를 설정해야 합니다.

Kubernetes 스케줄러는 노드의 모든 Pod에 충분한 리소스가 있도록 보장해요. 스케줄러는 노드의 컨테이너 요청(request)의 합이 노드 용량을 초과하지 않는지 확인합니다. 이 요청 합계는 kubelet이 관리하는 모든 컨테이너를 포함하되, ...는 제외해요.

노드 토폴로지 (Node topology)

TopologyManager 기능 게이트를 활성화했다면 kubelet은 리소스 할당 결정을 내릴 때 토폴로지 힌트를 사용할 수 있어요. 자세한 내용은 노드의 토폴로지 관리 정책 제어를 참고하세요.

다음으로 볼 것 (What's next)

다음 내용에 대해 더 배워보세요:

  • 노드를 구성하는 컴포넌트들.
  • Node의 API 정의.
  • 아키텍처 설계 문서의 Node 섹션.
  • 정상/비정상 노드 셧다운(Graceful/non-graceful node shutdown).
  • 클러스터의 노드 개수와 크기를 관리하는 노드 오토스케일링(Node autoscaling).
  • Taints와 Tolerations.
  • 노드 리소스 매니저(Node Resource Manager).
  • Windows 노드의 리소스 관리.

더 알아보기 (Learn more)