DRA 디바이스 메타데이터에 접근하기
DRA 디바이스 메타데이터에 접근하기 (Access DRA Device Metadata)
이 페이지는 동적 리소스 할당(DRA)을 사용하는 컨테이너에서 디바이스 메타데이터에 접근하는 방법을 보여줘요. 디바이스 메타데이터는 워크로드가 컨테이너 안의 잘 알려진 경로에서 JSON 파일을 읽어 디바이스 속성이나 네트워크 인터페이스 세부 정보 같은 할당된 디바이스에 대한 정보를 발견하게 해줘요.
이 페이지를 읽기 전에 동적 리소스 할당(DRA)과 워크로드에 디바이스 할당에 익숙해져야 해요.
출처: 문서
본문
시작하기 전에
Kubernetes 클러스터가 있어야 하고 kubectl 명령줄 도구가 클러스터와 통신하도록 구성되어 있어야 해요. 이 튜토리얼은 컨트롤 플레인 호스트가 아닌 노드가 최소 두 개 있는 클러스터에서 실행하는 것을 권장해요. 아직 클러스터가 없다면 minikube를 이용해 만들거나, 아래 Kubernetes 플레이그라운드 중 하나를 사용할 수 있어요.
버전을 확인하려면 kubectl version을 입력해요. 클러스터 관리자가 DRA, 연결된 디바이스, 드라이버를 설정했는지 확인해요. 자세한 내용은 클러스터에서 DRA 설정을 참고해요. 클러스터에 배포된 DRA 드라이버가 디바이스 메타데이터를 지원하는지 확인해요. DRA kubelet plugin을 사용하는 드라이버 작성자는 EnableDeviceMetadata로 지원을 활성화하고, 선택된 버전에 metadata.resource.k8s.io/v1beta1을 포함해야 해요. 드라이버는 더 오래된 소비자와의 호환성을 위해 v1alpha1을 내보낼 수도 있어요.
ResourceClaim으로 디바이스 메타데이터에 접근
직접 참조되는 ResourceClaim으로 디바이스를 할당하면 디바이스 메타데이터 파일이 컨테이너 안 다음 위치에 나타나요.
/var/run/kubernetes.io/dra-device-attributes/resourceclaims/<claimName>/<requestName>/<driverName>-metadata.json
- 다음 예시 매니페스트를 검토해요: dra/dra-device-metadata-pod.yaml. 이 매니페스트는
gpu.example.comDeviceClass에서 디바이스를 요청하는gpu-claim이라는 ResourceClaim과, 디바이스 메타데이터를 읽는 파드를 만들어요. - ResourceClaim과 파드를 만들어요.
- 파드가 실행된 후 컨테이너 로그를 확인해 메타데이터를 봐요.
- 전체 메타데이터 파일을 검사하려면 컨테이너에 exec로 들어가요. 메타데이터 파일은 JSON 스트림이에요. 드라이버가 선택한 각 API 버전에 대해, 드라이버가 구성한 순서대로 객체 하나를 포함해요. 드라이버는 가장 새 버전을 먼저 넣어야 해요. 객체들은 동등한 디바이스 메타데이터를 포함하므로, 명령이 두 개 이상의 JSON 객체를 출력할 수 있어요. 출력은 모델, 드라이버 버전, 디바이스 UUID 같은 디바이스 속성을 포함해요. 디바이스 용량은 메타데이터 스키마의 일부가 아니에요. JSON 구조에 대한 자세한 내용은 메타데이터 스키마를 참고해요.
ResourceClaimTemplate으로 디바이스 메타데이터에 접근
ResourceClaimTemplate을 사용하면 Kubernetes가 각 파드에 대해 ResourceClaim을 생성해요. 생성된 클레임 이름은 예측할 수 없으므로, 메타데이터 파일은 대신 파드의 클레임 참조 이름을 사용하는 경로에 나타나요.
/var/run/kubernetes.io/dra-device-attributes/resourceclaimtemplates/<podClaimName>/<requestName>/<driverName>-metadata.json
<podClaimName>은 파드의 spec.resourceClaims[] 항목의 name 필드에 해당해요. JSON 메타데이터에는 이 매핑을 기록하는 podClaimName 필드도 포함돼요.
- 다음 예시 매니페스트를 검토해요: dra/dra-device-metadata-template-pod.yaml. 이 매니페스트는 ResourceClaimTemplate과 파드를 만들어요. 각 파드는 자체 생성된 ResourceClaim을 얻어요. 메타데이터 경로는 파드의 클레임 참조 이름
my-gpu를 사용해요. - ResourceClaimTemplate과 파드를 만들어요.
- 파드가 실행된 후 메타데이터를 확인해요.
애플리케이션에서 메타데이터 읽기
Go 애플리케이션
k8s.io/dynamic-resource-allocation/devicemetadata 패키지는 메타데이터 파일을 읽기 위한 기성 함수를 제공해요. 이 함수들은 버전 협상을 자동으로 처리하고, 메타데이터 스트림을 디코딩해 내부 타입으로 변환하므로, 수동 버전 검사 없이 코드가 스키마 버전을 가로질러 동작해요. 알 수 없는 API 버전의 객체는 건너뛰고 첫 번째 호환 객체를 반환해요.
직접 참조되는 ResourceClaim의 경우:
import "k8s.io/dynamic-resource-allocation/devicemetadata"
dm, err := devicemetadata.ReadResourceClaimMetadata("gpu-claim", "gpu")
템플릿 생성 클레임(파드의 클레임 참조 이름 사용)의 경우:
dm, err := devicemetadata.ReadResourceClaimTemplateMetadata("my-gpu", "gpu")
특정 드라이버 이름을 알고 있다면 단일 드라이버의 메타데이터 파일을 읽을 수 있어요.
dm, err := devicemetadata.ReadResourceClaimMetadataWithDriverName("gpu.example.com", "gpu-claim", "gpu")
모든 드라이버를 읽는 함수는 병합된 요청과 디바이스별 속성을 가진 *metadata.DeviceMetadata를 반환해요. 드라이버 이름을 받는 함수는 그 드라이버 파일의 완전한 메타데이터 객체를 반환해요.
읽기 도우미 함수는 검증 없이 메타데이터를 디코딩해요. 검증을 선택하려면 파일을 열고 DecodeMetadataFromStream을 사용해요.
import (
"encoding/json"
"os"
"k8s.io/dynamic-resource-allocation/api/metadata"
"k8s.io/dynamic-resource-allocation/devicemetadata"
)
func readMetadata(path string) (*metadata.DeviceMetadata, error) {
file, err := os.Open(path)
if err != nil {
return nil, err
}
defer file.Close()
var deviceMetadata metadata.DeviceMetadata
var validationErr error
err = devicemetadata.DecodeMetadataFromStream(
json.NewDecoder(file),
&deviceMetadata,
devicemetadata.DecodeMetadataWithValidationResult(&validationErr),
)
if err != nil {
return nil, err
}
if validationErr != nil {
return nil, validationErr
}
return &deviceMetadata, nil
}
디코딩과 검증은 별도의 결과가 있어요. 검증 오류가 디코더가 deviceMetadata를 채우는 것을 막지는 않아요. 검증은 메타데이터가 커스텀 드라이버에서 오는 경우 유용한데, DRA kubelet plugin은 객체를 쓰기 전에 검증하지 않기 때문이에요.
다른 언어의 애플리케이션은 JSON 스트림을 한 번에 객체 하나씩 디코딩하고, 각 apiVersion을 검사해 알 수 없는 버전은 건너뛰고, 지원하는 첫 버전을 사용할 수 있어요.
정리
생성한 리소스를 삭제해요.
kubectl delete -f https://k8s.io/examples/dra/dra-device-metadata-pod.yaml
kubectl delete -f https://k8s.io/examples/dra/dra-device-metadata-template-pod.yaml
다음 단계
- DRA 디바이스 메타데이터 더 알아보기
- DRA로 워크로드에 디바이스 할당
- 설계에 대한 더 많은 정보는 KEP-5304 참고