DevOps

Kubernetes - kubelet

Vince_rf 2024. 10. 19. 15:08

kubelet은 Kubernetes 클러스터 내에서 각 노드(Node)에서 실행되는 에이전트(daemon)로, 해당 노드에서 실행되는 Pod와 컨테이너들을 관리하고 모니터링하는 핵심 구성 요소입니다. 노드에서 실행 중인 컨테이너 상태를 관리하며, Kubernetes 마스터의 명령에 따라 컨테이너 생성, 삭제, 상태 보고 등의 작업을 수행합니다.

1. kubelet의 역할

kubelet은 노드 수준에서 Kubernetes 클러스터의 상태를 유지하고 제어하는 역할을 합니다. 다음과 같은 주요 역할을 담당합니다:

  • Pod 실행 및 관리: kubelet은 API 서버로부터 받은 Pod의 정의에 따라 해당 노드에서 컨테이너를 생성, 시작, 종료 등의 작업을 수행합니다.
  • 컨테이너 라이프사이클 관리: 노드에서 실행 중인 컨테이너의 상태를 지속적으로 모니터링하고, 컨테이너가 정상적으로 실행 중인지 확인합니다.
  • Pod 상태 보고: Pod의 상태(예: Running, Failed, Pending 등)를 Kubernetes API 서버로 보고합니다.
  • 리소스 할당 및 관리: kubelet은 노드의 CPU, 메모리 등의 리소스를 관리하고, Pod가 요청한 리소스가 적절하게 할당되도록 합니다.
  • Log 및 Metrics 관리: 각 컨테이너의 로그 및 성능 지표(metrics)를 수집하여 클러스터 내의 모니터링 시스템에 제공할 수 있습니다.
  • 노드 상태 관리: kubelet은 노드의 상태(리소스 사용량, 상태 정보 등)를 주기적으로 API 서버에 보고합니다.

2. kubelet의 동작 원리

kubelet의 동작 원리는 **컨트롤 루프(Control Loop)**에 기반하여 이루어집니다. kubelet은 지속적으로 노드의 상태를 확인하고, API 서버로부터 전달받은 작업 명령을 수행하면서 클러스터 상태를 유지합니다.

Step 1. Pod Spec 수신

  • kubelet은 API 서버로부터 해당 노드에 배치된 **Pod 스펙(Pod Spec)**을 수신합니다. Pod 스펙은 Pod를 정의하는 YAML/JSON 형식의 설명서로, Pod에 포함된 컨테이너들의 설정, 리소스 요구 사항, 네트워크 설정 등을 포함합니다.
  • Pod 스펙은 etcd에 저장된 상태에서 kube-apiserver를 통해 전달되며, 이는 클러스터 관리자가 정의한 배포 규칙을 따릅니다.

Step 2. Pod의 컨테이너 실행

  • kubelet은 수신한 Pod 스펙에 따라, 해당 노드에서 필요한 컨테이너를 생성하고 실행하는 작업을 시작합니다.
  • 이 과정에서 kubelet은 **컨테이너 런타임(Container Runtime)**과 상호작용하여 컨테이너를 실제로 실행합니다. Kubernetes는 다양한 컨테이너 런타임을 지원하며, 주로 Docker, containerd, CRI-O 등이 사용됩니다.

Step 3. Pod의 라이프사이클 관리

  • kubelet은 Pod가 실행되면, 지속적으로 Pod 및 컨테이너의 상태를 모니터링합니다. 컨테이너가 비정상적으로 종료되거나, 리소스 부족 문제 등이 발생할 경우 이를 감지하여 재시작하거나 오류를 보고합니다.
  • Pod의 라이프사이클 관리에는 다음과 같은 작업들이 포함됩니다:
    • 컨테이너의 생성 및 종료: Pod의 상태에 따라 컨테이너를 시작하거나 종료합니다.
    • Health 체크: Pod에 정의된 Liveness ProbeReadiness Probe를 사용해 컨테이너의 상태를 주기적으로 체크하고, 필요할 경우 재시작합니다.
    • 자동 복구: 컨테이너가 실패하거나 종료된 경우, kubelet은 자동으로 컨테이너를 재시작하거나 새로운 Pod를 실행하도록 요청할 수 있습니다.

Step 4. Pod 상태 보고

  • kubelet은 Pod의 상태 정보를 주기적으로 Kubernetes API 서버에 보고합니다. 이 보고는 클러스터의 전체적인 상태를 파악하고, 관리자가 Pod의 상태를 모니터링할 수 있게 해줍니다.
  • Pod의 상태는 Running, Pending, Failed, Succeeded 등의 상태로 나타나며, 이러한 상태 정보는 etcd에 기록됩니다.

Step 5. 리소스 관리 및 할당

  • kubelet은 Pod가 요청한 리소스(CPU, 메모리 등)를 할당하고, 해당 노드에서 사용할 수 있는 리소스가 적절하게 분배되도록 관리합니다.
  • 만약 리소스가 부족하거나 과도한 리소스 사용이 발생하면, kubelet은 API 서버에 이를 보고하여 스케줄링 정책이나 리소스 관리에 반영될 수 있도록 합니다.

Step 6. 로그 및 메트릭 수집

  • kubelet은 컨테이너의 **로그(logs)**와 메트릭(metrics) 데이터를 수집하고 관리합니다. 이러한 데이터는 kubelet을 통해 노드 외부로 전달되며, 클러스터의 모니터링 시스템에서 사용할 수 있습니다.
  • 컨테이너의 로그는 주로 애플리케이션의 상태를 파악하는 데 사용되며, 메트릭은 리소스 사용량(CPU, 메모리, 네트워크 등)을 측정합니다.

3. kubelet과 컨테이너 런타임

kubelet은 컨테이너 자체를 직접 관리하지 않으며, 대신 **컨테이너 런타임(Container Runtime)**을 통해 컨테이너의 실행을 관리합니다. Kubernetes는 **CRI(Container Runtime Interface)**라는 표준 인터페이스를 통해 다양한 컨테이너 런타임과 상호작용합니다.

주요 컨테이너 런타임:

  • Docker: Kubernetes에서 가장 많이 사용되었던 컨테이너 런타임. 그러나 1.20 버전 이후로 Docker는 더 이상 기본 런타임이 아니며, 다른 런타임으로 대체되고 있습니다.
  • containerd: Docker와 관련된 런타임 중 하나로, 경량화된 컨테이너 런타임입니다.
  • CRI-O: 오픈 컨테이너 이니셔티브(Open Container Initiative, OCI) 표준을 따르는 런타임으로, Kubernetes와의 통합성이 높습니다.

kubelet은 이러한 런타임과 통신하여 컨테이너를 생성, 삭제, 상태 확인 등의 작업을 수행합니다. CRI를 통해 컨테이너 런타임의 세부 사항에 구애받지 않고, 다양한 런타임을 유연하게 사용할 수 있게 합니다.

4. Pod의 라이프사이클 관리

kubelet은 Pod의 라이프사이클을 철저하게 관리하여 Pod가 예상대로 동작하는지 확인하고, 문제가 발생하면 복구 작업을 수행합니다.

주요 관리 항목:

  • Liveness Probe: 컨테이너가 아직 살아 있는지(정상적으로 동작하는지)를 확인하기 위한 방법입니다. Liveness Probe가 실패할 경우, kubelet은 컨테이너를 재시작합니다.
  • Readiness Probe: 컨테이너가 트래픽을 처리할 준비가 되었는지를 확인하는 프로브입니다. Readiness Probe가 실패하면, 해당 컨테이너는 서비스의 엔드포인트 목록에서 제거되어 트래픽이 전달되지 않도록 합니다.
  • Startup Probe: 컨테이너가 시작 준비가 되었는지를 확인하는 데 사용됩니다. 이 Probe는 컨테이너가 느리게 시작될 수 있는 애플리케이션에 유용합니다.

5. kubelet과 Node 관리

kubelet은 노드의 리소스를 관리하는 데 중요한 역할을 하며, 노드의 상태를 지속적으로 Kubernetes 마스터에 보고합니다.

  • Node 상태 체크: 노드의 CPU, 메모리, 디스크 사용량, 네트워크 상태 등을 모니터링하고, 노드가 정상적으로 동작하고 있는지 확인합니다.
  • 노드 상태 보고: 노드가 Ready 상태인지, 혹은 NotReady 상태인지 주기적으로 API 서버에 보고하며, 이를 통해 클러스터 관리자 및 다른 컨트롤러들이 클러스터의 상태를 파악할 수 있습니다.
  • Eviction 관리: 리소스 부족 시, kubelet은 Eviction 메커니즘을 통해 리소스 사용량이 높은 Pod 또는 우선순위가 낮은 Pod를 종료시켜 리소스를 확보할 수 있습니다.

6. kubelet의 리소스 요청과 제한 관리

kubelet은 Pod 스펙에서 지정된 리소스 요청 및 제한에 따라 각 컨테이너에 적절한 CPU 및 메모리를 할당합니다. Kubernetes의 **리소스 요청(Request)**과 리소스 제한(Limit) 기능을 통해 각 컨테이너가 사용할 수 있는 리소스를 제어하고 관리합니다.

  • 리소스 요청: 컨테이너가 실행되기 위해 필요한 최소 리소스입니다. 스케줄러는 이 요청을 기준으로 Pod를 특정 노드에 배치합니다.
  • 리소스 제한: 컨테이너가 사용할 수 있는 최대 리소스입니다. 컨테이너가 리소스 제한을 초과하지 않도록 관리합니다.

요약

  • **kubelet**은 Kubernetes 클러스터 내에서 각 노드에서 실행되는 에이전트로, Pod 및 컨테이너의 실행과 관리를 담당합니다.
  • API 서버로부터 Pod 스펙을 수신하여, 컨테이너 런타임과 상호작용하여 Pod의 컨테이너를 실행하고, 해당 컨테이너의 상태를 지속적으로 모니터링합니다.
  • Pod의 라이프사이클을 관리하며, Pod 및 노드 상태를 주기적으로 API 서버에 보고합니다.
  • 리소스 관리컨테이너 로그/메트릭 수집 등 다양한 기능을 통해 노드에서의 작업을 자동화하고 최적화합니다.

'DevOps' 카테고리의 다른 글

CKA 예제 리마인더 - 1. Pod  (0) 2024.10.24
Kubernetes - kube-proxy  (0) 2024.10.19
Kubernetes - kube-scheduler  (0) 2024.10.19
Kubernetes - kube-controller-manager  (1) 2024.10.19
Kubernetes - kube-apiserver  (0) 2024.10.19