목록으로

Programming Notes

Kubernetes v1.34: Pods에서 DRA 리소스 상태를 보고하다

AI/ML 및 기타 고성능 워크로드의 증가는 GPU, TPU, FPGA와 같은 특수 하드웨어를 많은 Kubernetes 클러스터의 핵심 구성 요소로 만들었습니다. 그러나 장치가 있는 Pod의 장애 탐색에 대한 이전 블로그 게시물 에서 논의되었듯이, 이 하드웨어에 장애가 발생하면...

AI/ML 및 기타 고성능 워크로드의 증가는 GPU, TPU, FPGA와 같은 특수 하드웨어를 많은 Kubernetes 클러스터의 핵심 구성 요소로 만들었습니다. 그러나 장치가 있는 Pod의 장애 탐색에 대한 이전 블로그 게시물에서 논의되었듯이, 이 하드웨어에 장애가 발생하면 진단이 어려워 상당한 다운타임을 초래할 수 있습니다. Kubernetes v1.34 출시와 함께, 이러한 장치의 상태에 대한 가시성을 제공하는 새로운 알파 기능을 발표하게 되어 기쁩니다.

이 작업은 Device Plugin이 관리하는 장치의 상태를 보고하는 메커니즘을 처음 도입한 KEP-4680의 기능을 확장합니다. 이제 이 기능은 **동적 리소스 할당(DRA)**으로 확장됩니다. ResourceHealthStatus 피처 게이트에 의해 제어되는 이 개선 사항은 DRA 드라이버가 장치 상태를 Pod의 .status 필드에 직접 보고할 수 있도록 하여 운영자와 개발자에게 중요한 통찰력을 제공합니다.

왜 장치 상태를 Pod 상태에 노출해야 하는가?

스테이트풀 애플리케이션이나 장기 실행 작업의 경우, 장치 오류는 방해적이고 비용이 많이 들 수 있습니다. 장치 상태를 Pod의 .status 필드에 노출함으로써 Kubernetes는 사용자와 자동화 도구가 문제를 신속하게 진단할 수 있는 표준화된 방법을 제공합니다. Pod에 오류가 발생하면, 이제 상태를 확인하여 비정상적인 장치가 근본 원인인지 확인할 수 있으며, 이는 애플리케이션 코드 디버깅에 소요될 수 있는 귀중한 시간을 절약해 줍니다.

작동 방식

이 기능은 Kubelet과 DRA 드라이버 간의 새로운 선택적 통신 채널을 도입하며, 세 가지 핵심 구성 요소로 구성됩니다.

새로운 gRPC 상태 서비스

dra-health/v1alpha1 API 그룹에 DRAResourceHealth라는 새로운 gRPC 서비스가 정의됩니다. DRA 드라이버는 이 서비스를 구현하여 Kubelet에 장치 상태 업데이트를 스트리밍할 수 있습니다. 이 서비스에는 관리하는 장치의 상태(Healthy, Unhealthy, Unknown)를 보내는 NodeWatchResources 서버 스트리밍 RPC가 포함됩니다.

Kubelet 통합

Kubelet의 DRAPluginManager는 어떤 드라이버가 상태 서비스를 구현하는지 감지합니다. 각 호환 드라이버에 대해, 상태 업데이트를 수신하기 위한 장기 실행 NodeWatchResources 스트림을 시작합니다. DRA 관리자는 이 업데이트를 소비하고 Kubelet 재시작 시에도 유지되는 영구적인 healthInfoCache에 저장합니다.

Pod 상태 채우기

장치 상태가 변경되면 DRA 관리자는 변경의 영향을 받는 모든 Pod를 식별하고 Pod 상태 업데이트를 트리거합니다. v1.ContainerStatus API 객체에 allocatedResourcesStatus라는 새 필드가 추가됩니다. Kubelet은 이 필드를 컨테이너에 할당된 각 장치의 현재 상태로 채웁니다.

실용적인 예시

Pod가 CrashLoopBackOff 상태인 경우, kubectl describe pod <pod-name>을 사용하여 상태를 검사할 수 있습니다. 할당된 장치에 오류가 발생한 경우, 출력에 이제 allocatedResourcesStatus 필드가 포함되어 문제를 명확하게 나타냅니다.

status:
  containerStatuses:
  - name: my-gpu-intensive-container
    # ... 다른 컨테이너 상태
    allocatedResourcesStatus:
    - name: "claim:my-gpu-claim"
      resources:
      - resourceID: "example.com/gpu-a1b2-c3d4"
        health: "Unhealthy"

이 명시적인 상태는 문제가 애플리케이션이 아닌 기본 하드웨어에 있음을 명확히 합니다.

이제 Pod와 관련된 비정상적인 장치에 반응하여 Pod의 스케줄을 취소함으로써 오류 감지 로직을 개선할 수 있습니다.

이 기능 사용 방법

Kubernetes v1.34의 알파 기능이므로, 이 기능을 사용하려면 다음 단계를 수행해야 합니다.

  1. kube-apiserver 및 kubelet에 ResourceHealthStatus 피처 게이트를 활성화합니다.
  2. v1alpha1 DRAResourceHealth gRPC 서비스를 구현하는 DRA 드라이버를 사용하고 있는지 확인합니다.

DRA 드라이버

DRA 드라이버를 개발 중이라면 장치 장애 감지 전략을 고려하고 드라이버가 이 기능과 통합되었는지 확인해야 합니다. 이렇게 하면 드라이버가 사용자 경험을 개선하고 하드웨어 문제 디버깅을 간소화할 수 있습니다.

다음 단계는?

이것은 Kubernetes가 장치 장애를 처리하는 방식을 개선하기 위한 광범위한 노력의 첫 단계입니다. 이 알파 기능에 대한 피드백을 수집하면서 커뮤니티는 베타 버전으로 졸업하기 전에 몇 가지 주요 개선 사항을 계획하고 있습니다.

  • 자세한 상태 메시지: 문제 해결 경험을 개선하기 위해 gRPC API에 사람이 읽을 수 있는 메시지 필드를 추가할 계획입니다. 이를 통해 DRA 드라이버는 "GPU 온도가 임계값을 초과했습니다" 또는 "NVLink 연결이 끊어졌습니다"와 같은 특정 컨텍스트를 상태에 제공할 수 있습니다.
  • 구성 가능한 상태 시간 초과: 장치 상태를 "알 수 없음"으로 표시하는 시간 초과는 현재 하드코딩되어 있습니다. 우리는 다양한 하드웨어의 다양한 상태 보고 특성을 더 잘 수용하기 위해 이를 (아마도 드라이버별로) 구성 가능하게 만들 계획입니다.
  • 향상된 사후 문제 해결: 이미 종료된 Pod에 상태 업데이트가 적용되지 않을 수 있는 알려진 제한 사항을 해결할 것입니다. 이 수정 사항은 실패 당시 장치의 상태가 보존되도록 보장하며, 이는 배치 작업 및 기타 "완료까지 실행" 워크로드의 문제 해결에 중요합니다.

이 기능은 KEP-4680의 일부로 개발되었으며, 베타 버전으로 졸업하기 위한 작업에서 커뮤니티 피드백이 중요합니다. Kubernetes에서 장치 장애 처리를 개선하기 위한 더 많은 계획이 있으며, SIG Node 커뮤니티와 함께 이 기능을 사용해보고 경험을 공유해 주시기를 권장합니다!