노드
노드 (Nodes)
Kubernetes는 컨트롤 플레인이 관리하며 Pod를 실행하는 데 필요한 서비스를 포함하는 머신을 노드라고 불러요. 보통 클러스터에는 여러 노드가 있고, 학습 환경이나 리소스가 제한된 환경에서는 노드가 하나뿐일 수도 있어요.
노드의 컴포넌트에는 kubelet, 컨테이너 런타임, kube-proxy가 있어요.
관리 (Management)
API 서버에 Node를 추가하는 방법은 크게 두 가지가 있어요:
- 노드의 kubelet이 컨트롤 플레인에 자체 등록(self-register)
- 당신(또는 다른 인간 사용자)이 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 노드의 리소스 관리.