
incompatible changes: - Add GetDevicePluginOptions rpc call. This is needed when we switch from Registration service to probe-based plugin watcher. - Change AllocateRequest and AllocateResponse to allow device requests from multiple containers in a pod. Currently only made mechanical change on the devicemanager and test code to cope with the API but still issues an Allocate call per container. We can modify the devicemanager in 1.11 to issue a single Allocate call per pod. The change will also facilitate incremental API change to communicate pod level information through Allocate rpc if there is such future need.
162 lines
5.9 KiB
Protocol Buffer
162 lines
5.9 KiB
Protocol Buffer
// To regenerate api.pb.go run hack/update-device-plugin.sh
|
|
syntax = 'proto3';
|
|
|
|
package v1beta1;
|
|
|
|
import "github.com/gogo/protobuf/gogoproto/gogo.proto";
|
|
|
|
option (gogoproto.goproto_stringer_all) = false;
|
|
option (gogoproto.stringer_all) = true;
|
|
option (gogoproto.goproto_getters_all) = true;
|
|
option (gogoproto.marshaler_all) = true;
|
|
option (gogoproto.sizer_all) = true;
|
|
option (gogoproto.unmarshaler_all) = true;
|
|
option (gogoproto.goproto_unrecognized_all) = false;
|
|
|
|
|
|
// Registration is the service advertised by the Kubelet
|
|
// Only when Kubelet answers with a success code to a Register Request
|
|
// may Device Plugins start their service
|
|
// Registration may fail when device plugin version is not supported by
|
|
// Kubelet or the registered resourceName is already taken by another
|
|
// active device plugin. Device plugin is expected to terminate upon registration failure
|
|
service Registration {
|
|
rpc Register(RegisterRequest) returns (Empty) {}
|
|
}
|
|
|
|
message DevicePluginOptions {
|
|
// Indicates if PreStartContainer call is required before each container start
|
|
bool pre_start_required = 1;
|
|
}
|
|
|
|
message RegisterRequest {
|
|
// Version of the API the Device Plugin was built against
|
|
string version = 1;
|
|
// Name of the unix socket the device plugin is listening on
|
|
// PATH = path.Join(DevicePluginPath, endpoint)
|
|
string endpoint = 2;
|
|
// Schedulable resource name. As of now it's expected to be a DNS Label
|
|
string resource_name = 3;
|
|
// Options to be communicated with Device Manager
|
|
DevicePluginOptions options = 4;
|
|
}
|
|
|
|
message Empty {
|
|
}
|
|
|
|
// DevicePlugin is the service advertised by Device Plugins
|
|
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 disapears, ListAndWatch
|
|
// returns the new list
|
|
rpc ListAndWatch(Empty) returns (stream ListAndWatchResponse) {}
|
|
|
|
// Allocate is called during container creation so that the Device
|
|
// Plugin 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 Plugin during registeration phase,
|
|
// before each container start. Device plugin can run device specific operations
|
|
// such as reseting the device before making devices available to the container
|
|
rpc PreStartContainer(PreStartContainerRequest) returns (PreStartContainerResponse) {}
|
|
}
|
|
|
|
// ListAndWatch returns a stream of List of Devices
|
|
// Whenever a Device state change or a Device disapears, ListAndWatch
|
|
// returns the new list
|
|
message ListAndWatchResponse {
|
|
repeated Device devices = 1;
|
|
}
|
|
|
|
/* E.g:
|
|
* struct Device {
|
|
* ID: "GPU-fef8089b-4820-abfc-e83e-94318197576e",
|
|
* State: "Healthy",
|
|
*} */
|
|
message Device {
|
|
// A unique ID assigned by the device plugin used
|
|
// to identify devices during the communication
|
|
// Max length of this field is 63 characters
|
|
string ID = 1;
|
|
// Health of the device, can be healthy or unhealthy, see constants.go
|
|
string health = 2;
|
|
}
|
|
|
|
// - PreStartContainer is expected to be called before each container start if indicated by plugin during registration phase.
|
|
// - PreStartContainer allows kubelet to pass reinitialized devices to containers.
|
|
// - PreStartContainer allows Device Plugin to run device specific operations on
|
|
// the Devices requested
|
|
message PreStartContainerRequest {
|
|
repeated string devicesIDs = 1;
|
|
}
|
|
|
|
// PreStartContainerResponse will be send by plugin in response to PreStartContainerRequest
|
|
message PreStartContainerResponse {
|
|
}
|
|
|
|
// - Allocate is expected to be called during pod creation since allocation
|
|
// failures for any container would result in pod startup failure.
|
|
// - Allocate allows kubelet to exposes additional artifacts in a pod's
|
|
// environment as directed by the plugin.
|
|
// - Allocate allows Device Plugin to run device specific operations on
|
|
// the Devices requested
|
|
message AllocateRequest {
|
|
repeated ContainerAllocateRequest container_requests = 1;
|
|
}
|
|
|
|
message ContainerAllocateRequest {
|
|
repeated string devicesIDs = 1;
|
|
}
|
|
|
|
// AllocateResponse includes the artifacts that needs to be injected into
|
|
// a container for accessing 'deviceIDs' that were mentioned as part of
|
|
// 'AllocateRequest'.
|
|
// Failure Handling:
|
|
// if Kubelet sends an allocation request for dev1 and dev2.
|
|
// Allocation on dev1 succeeds but allocation on dev2 fails.
|
|
// The Device plugin should send a ListAndWatch update and fail the
|
|
// Allocation request
|
|
message AllocateResponse {
|
|
repeated ContainerAllocateResponse container_responses = 1;
|
|
}
|
|
|
|
message ContainerAllocateResponse {
|
|
// List of environment variable to be set in the container to access one of more devices.
|
|
map<string, string> envs = 1;
|
|
// Mounts for the container.
|
|
repeated Mount mounts = 2;
|
|
// Devices for the container.
|
|
repeated DeviceSpec devices = 3;
|
|
// Container annotations to pass to the container runtime
|
|
map<string, string> annotations = 4;
|
|
}
|
|
|
|
// Mount specifies a host volume to mount into a container.
|
|
// where device library or tools are installed on host and container
|
|
message Mount {
|
|
// Path of the mount within the container.
|
|
string container_path = 1;
|
|
// Path of the mount on the host.
|
|
string host_path = 2;
|
|
// If set, the mount is read-only.
|
|
bool read_only = 3;
|
|
}
|
|
|
|
// DeviceSpec specifies a host device to mount into a container.
|
|
message DeviceSpec {
|
|
// Path of the device within the container.
|
|
string container_path = 1;
|
|
// Path of the device on the host.
|
|
string host_path = 2;
|
|
// Cgroups permissions of the device, candidates are one or more of
|
|
// * r - allows container to read from the specified device.
|
|
// * w - allows container to write to the specified device.
|
|
// * m - allows container to create device files that do not yet exist.
|
|
string permissions = 3;
|
|
}
|