2.9. 장치 플러그인을 사용하여 Pod를 사용하여 외부 리소스에 액세스
장치 플러그인을 사용하면 사용자 정의 코드를 작성하지 않고도 OpenShift Container Platform Pod에서 특정 장치 유형(GPU, InfiniBand 또는 벤더별 초기화 및 설정이 필요한 기타 유사한 컴퓨팅 리소스)을 사용할 수 있습니다.
2.9.1. 장치 플러그인 이해
장치 플러그인은 클러스터 전체에서 하드웨어 장치를 사용할 수 있는 일관되고 이식 가능한 솔루션을 제공합니다. 장치 플러그인은 확장 메커니즘을 통해 이러한 장치를 제공하여 컨테이너에서 이러한 장치를 사용할 수 있도록 하고, 이러한 장치의 상태 점검을 제공하며, 안전하게 공유합니다.
OpenShift Container Platform은 장치 플러그인 API를 지원하지만 장치 플러그인 컨테이너는 개별 공급 업체에서 지원합니다.
장치 플러그인은 특정 하드웨어 리소스를 관리하는 노드( kubelet
외부)에서 실행되는 gRPC 서비스입니다. 모든 장치 플러그인은 다음 원격 프로시저 호출(RPC)을 지원해야 합니다.
service DevicePlugin { // GetDevicePluginOptions returns options to be communicated with Device // Manager rpc GetDevicePluginOptions(Empty) returns (DevicePluginOptions) {} // ListAndWatch returns a stream of List of Devices // Whenever a Device state change or a Device disappears, ListAndWatch // returns the new list rpc ListAndWatch(Empty) returns (stream ListAndWatchResponse) {} // Allocate is called during container creation so that the Device // Plug-in can run device specific operations and instruct Kubelet // of the steps to make the Device available in the container rpc Allocate(AllocateRequest) returns (AllocateResponse) {} // PreStartcontainer is called, if indicated by Device Plug-in during // registration phase, before each container start. Device plug-in // can run device specific operations such as resetting the device // before making devices available to the container rpc PreStartcontainer(PreStartcontainerRequest) returns (PreStartcontainerResponse) {} }
장치 플러그인 예
간편한 장치 플러그인 참조 구현을 위해 장치 관리자 코드에 vendor/k8s.io/kubernetes/pkg/kubelet/cm/deviceplugin/device_plugin_stub.go 라는 스텁 장치 플러그인이 있습니다.
2.9.1.1. 장치 플러그인을 배포하는 방법
- 장치 플러그인 배포에 권장되는 접근 방식은 데몬 세트입니다.
- 시작 시 장치 플러그인은 노드의 /var/lib/kubelet/device-plugin/ 에 UNIX 도메인 소켓을 생성하여 장치 관리자의 RPC를 제공하려고 합니다.
- 장치 플러그인은 하드웨어 리소스, 호스트 파일 시스템에 대한 액세스, 소켓 생성을 관리해야 하므로 권한 있는 보안 컨텍스트에서 실행해야 합니다.
- 배포 단계에 대한 자세한 내용은 각 장치 플러그인 구현에서 확인할 수 있습니다.
2.9.2. 장치 관리자 이해
장치 관리자는 장치 플러그인이라는 플러그인을 사용하여 특수 노드 하드웨어 리소스를 알리기 위한 메커니즘을 제공합니다.
업스트림 코드 변경없이 특수 하드웨어를 공개할 수 있습니다.
OpenShift Container Platform은 장치 플러그인 API를 지원하지만 장치 플러그인 컨테이너는 개별 공급 업체에서 지원합니다.
장치 관리자는 장치를 확장 리소스(Extended Resources)으로 공개합니다. 사용자 pod는 다른 확장 리소스 를 요청하는 데 사용되는 동일한 제한/요청 메커니즘을 사용하여 장치 관리자에 의해 공개된 장치를 사용할 수 있습니다.
시작 시 장치 플러그인은 /var/lib/kubelet/device-plugins/kubelet.sock 에서 Register
를 호출하는 장치 관리자에 자신을 등록하고 장치 관리자 요청을 제공하기 위해 /var/lib/kubelet/device-plugins/<plugin>.sock 에서 gRPC 서비스를 시작합니다.
장치 관리자는 새 등록 요청을 처리하는 동안 장치 플러그인 서비스에서 ListAndWatch
원격 프로시저 호출(RPC)을 호출합니다. 이에 대한 응답으로 장치 관리자는 플러그인에서 gRPC 스트림을 통해 장치 오브젝트 목록을 가져옵니다. 장치 관리자는 플러그인의 새 업데이트에 대한 스트림을 계속 확인합니다. 플러그인 측에서 플러그인은 스트림을 열린 상태로 유지하고 장치 상태가 변경될 때마다 동일한 스트리밍 연결을 통해 새 장치 목록이 장치 관리자로 전송됩니다.
새로운 pod 승인 요청을 처리하는 동안 Kubelet은 장치 할당을 위해 요청된 Extended Resources
를 장치 관리자에게 전달합니다. 장치 관리자는 데이터베이스에서 해당 플러그인이 존재하는지 확인합니다. 플러그인이 존재하고 로컬 캐시별로 할당 가능한 장치뿐만 아니라 사용 가능한 장치가 있는 경우 Allocate
RPC가 특정 장치 플러그인에서 호출됩니다.
또한 장치 플러그인은 드라이버 설치, 장치 초기화 및 장치 재설정과 같은 다른 여러 장치별 작업을 수행할 수도 있습니다. 이러한 기능은 구현마다 다릅니다.
2.9.3. 장치 관리자 활성화
장치 관리자는 장치 플러그인을 구현하여 업스트림 코드 변경없이 특수 하드웨어를 알릴 수 있습니다.
장치 관리자는 장치 플러그인이라는 플러그인을 사용하여 특수 노드 하드웨어 리소스를 알리기 위한 메커니즘을 제공합니다.
다음 명령을 입력하여 구성할 노드 유형의 정적
MachineConfigPool
CRD와 연결된 라벨을 가져옵니다. 다음 중 하나를 실행합니다.Machine config를 표시합니다:
# oc describe machineconfig <name>
예를 들면 다음과 같습니다.
# oc describe machineconfig 00-worker
출력 예
Name: 00-worker Namespace: Labels: machineconfiguration.openshift.io/role=worker 1
- 1
- 장치 관리자에 필요한 라벨입니다.
프로세스
구성 변경을 위한 사용자 정의 리소스 (CR)를 만듭니다.
장치 관리자 CR의 설정 예
apiVersion: machineconfiguration.openshift.io/v1 kind: KubeletConfig metadata: name: devicemgr 1 spec: machineConfigPoolSelector: matchLabels: machineconfiguration.openshift.io: devicemgr 2 kubeletConfig: feature-gates: - DevicePlugins=true 3
장치 관리자를 만듭니다.
$ oc create -f devicemgr.yaml
출력 예
kubeletconfig.machineconfiguration.openshift.io/devicemgr created
- 노드에서 /var/lib/kubelet/device-plugins/kubelet.sock이 작성되었는지 확인하여 장치 관리자가 실제로 사용 가능한지 확인합니다. 이는 장치 관리자 gRPC 서버가 새 플러그인 등록을 수신하는 UNIX 도메인 소켓입니다. 이 소켓 파일은 장치 관리자가 활성화된 경우에만 Kubelet을 시작할 때 생성됩니다.