forked from kubernetes/kubernetes
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add probe based mechanism for kubelet plugin discovery
- Loading branch information
1 parent
401bab3
commit 3a2e3bc
Showing
20 changed files
with
1,079 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
29 changes: 29 additions & 0 deletions
29
hack/update-generated-kubelet-plugin-registration-dockerized.sh
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
#!/bin/bash | ||
|
||
# Copyright 2018 The Kubernetes Authors. | ||
# | ||
# Licensed under the Apache License, Version 2.0 (the "License"); | ||
# you may not use this file except in compliance with the License. | ||
# You may obtain a copy of the License at | ||
# | ||
# http://www.apache.org/licenses/LICENSE-2.0 | ||
# | ||
# Unless required by applicable law or agreed to in writing, software | ||
# distributed under the License is distributed on an "AS IS" BASIS, | ||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
# See the License for the specific language governing permissions and | ||
# limitations under the License. | ||
|
||
set -o errexit | ||
set -o nounset | ||
set -o pipefail | ||
|
||
KUBE_ROOT="$(cd "$(dirname "${BASH_SOURCE}")/../" && pwd -P)" | ||
KUBELET_PLUGIN_REGISTRATION_ROOT="${KUBE_ROOT}/pkg/kubelet/apis/pluginregistration/v1alpha1/" | ||
KUBELET_EXAMPLE_PLUGIN_V1BETA1="${KUBE_ROOT}/pkg/kubelet/util/pluginwatcher/example_plugin_apis/v1beta1/" | ||
KUBELET_EXAMPLE_PLUGIN_V1BETA2="${KUBE_ROOT}/pkg/kubelet/util/pluginwatcher/example_plugin_apis/v1beta2/" | ||
|
||
source "${KUBE_ROOT}/hack/lib/protoc.sh" | ||
kube::protoc::generate_proto ${KUBELET_PLUGIN_REGISTRATION_ROOT} | ||
kube::protoc::generate_proto ${KUBELET_EXAMPLE_PLUGIN_V1BETA1} | ||
kube::protoc::generate_proto ${KUBELET_EXAMPLE_PLUGIN_V1BETA2} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
#!/bin/bash | ||
|
||
# Copyright 2018 The Kubernetes Authors. | ||
# | ||
# Licensed under the Apache License, Version 2.0 (the "License"); | ||
# you may not use this file except in compliance with the License. | ||
# You may obtain a copy of the License at | ||
# | ||
# http://www.apache.org/licenses/LICENSE-2.0 | ||
# | ||
# Unless required by applicable law or agreed to in writing, software | ||
# distributed under the License is distributed on an "AS IS" BASIS, | ||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
# See the License for the specific language governing permissions and | ||
# limitations under the License. | ||
|
||
set -o errexit | ||
set -o nounset | ||
set -o pipefail | ||
|
||
KUBE_ROOT=$(dirname "${BASH_SOURCE}")/.. | ||
|
||
# NOTE: All output from this script needs to be copied back to the calling | ||
# source tree. This is managed in kube::build::copy_output in build/common.sh. | ||
# If the output set is changed update that function. | ||
|
||
${KUBE_ROOT}/build/run.sh hack/update-generated-kubelet-plugin-registration-dockerized.sh "$@" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
#!/bin/bash | ||
|
||
# Copyright 2018 The Kubernetes Authors. | ||
# | ||
# Licensed under the Apache License, Version 2.0 (the "License"); | ||
# you may not use this file except in compliance with the License. | ||
# You may obtain a copy of the License at | ||
# | ||
# http://www.apache.org/licenses/LICENSE-2.0 | ||
# | ||
# Unless required by applicable law or agreed to in writing, software | ||
# distributed under the License is distributed on an "AS IS" BASIS, | ||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
# See the License for the specific language governing permissions and | ||
# limitations under the License. | ||
|
||
set -o errexit | ||
set -o nounset | ||
set -o pipefail | ||
|
||
KUBE_ROOT=$(dirname "${BASH_SOURCE}")/.. | ||
ERROR="Kubelet Plugin Registration api is out of date. Please run hack/update-generated-kubelet-plugin-registration.sh" | ||
KUBELET_PLUGIN_REGISTRATION_ROOT="${KUBE_ROOT}/pkg/kubelet/apis/pluginregistration/v1alpha1/" | ||
|
||
source "${KUBE_ROOT}/hack/lib/protoc.sh" | ||
kube::golang::setup_env | ||
|
||
function cleanup { | ||
rm -rf ${KUBELET_PLUGIN_REGISTRATION_ROOT}/_tmp/ | ||
} | ||
|
||
trap cleanup EXIT | ||
|
||
mkdir -p ${KUBELET_PLUGIN_REGISTRATION_ROOT}/_tmp | ||
cp ${KUBELET_PLUGIN_REGISTRATION_ROOT}/api.pb.go ${KUBELET_PLUGIN_REGISTRATION_ROOT}/_tmp/ | ||
|
||
KUBE_VERBOSE=3 "${KUBE_ROOT}/hack/update-generated-kubelet-plugin-registration.sh" | ||
kube::protoc::diff "${KUBELET_PLUGIN_REGISTRATION_ROOT}/api.pb.go" "${KUBELET_PLUGIN_REGISTRATION_ROOT}/_tmp/api.pb.go" ${ERROR} | ||
echo "Generated Kubelet Plugin Registration api is up to date." |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
package(default_visibility = ["//visibility:public"]) | ||
|
||
load( | ||
"@io_bazel_rules_go//go:def.bzl", | ||
"go_library", | ||
) | ||
|
||
go_library( | ||
name = "go_default_library", | ||
srcs = [ | ||
"api.pb.go", | ||
"constants.go", | ||
], | ||
importpath = "k8s.io/kubernetes/pkg/kubelet/apis/pluginregistration/v1alpha1", | ||
deps = [ | ||
"//vendor/github.com/gogo/protobuf/gogoproto:go_default_library", | ||
"//vendor/github.com/gogo/protobuf/proto:go_default_library", | ||
"//vendor/golang.org/x/net/context:go_default_library", | ||
"//vendor/google.golang.org/grpc:go_default_library", | ||
], | ||
) | ||
|
||
filegroup( | ||
name = "package-srcs", | ||
srcs = glob(["**"]), | ||
tags = ["automanaged"], | ||
visibility = ["//visibility:private"], | ||
) | ||
|
||
filegroup( | ||
name = "all-srcs", | ||
srcs = [":package-srcs"], | ||
tags = ["automanaged"], | ||
) | ||
|
||
filegroup( | ||
name = "go_default_library_protos", | ||
srcs = ["api.proto"], | ||
visibility = ["//visibility:public"], | ||
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,60 @@ | ||
// To regenerate api.pb.go run hack/update-generated-kubelet-plugin-registration.sh | ||
syntax = 'proto3'; | ||
|
||
package pluginregistration; | ||
|
||
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; | ||
|
||
// PluginInfo is the message sent from a plugin to the Kubelet pluginwatcher for plugin registration | ||
message PluginInfo { | ||
// Type of the Plugin. CSIPlugin or DevicePlugin | ||
string type = 1; | ||
// Plugin name that uniquely identifies the plugin for the given plugin type. | ||
// For DevicePlugin, this is the resource name that the plugin manages and | ||
// should follow the extended resource name convention. | ||
// For CSI, this is the CSI driver registrar name. | ||
string name = 2; | ||
// Optional endpoint location. If found set by Kubelet component, | ||
// Kubelet component will use this endpoint for specific requests. | ||
// This allows the plugin to register using one endpoint and possibly use | ||
// a different socket for control operations. CSI uses this model to delegate | ||
// its registration external from the plugin. | ||
string endpoint = 3; | ||
// Plugin service API versions the plugin supports. | ||
// For DevicePlugin, this maps to the deviceplugin API versions the | ||
// plugin supports at the given socket. | ||
// The Kubelet component communicating with the plugin should be able | ||
// to choose any preferred version from this list, or returns an error | ||
// if none of the listed versions is supported. | ||
repeated string supported_versions = 4; | ||
} | ||
|
||
// RegistrationStatus is the message sent from Kubelet pluginwatcher to the plugin for notification on registration status | ||
message RegistrationStatus { | ||
// True if plugin gets registered successfully at Kubelet | ||
bool plugin_registered = 1; | ||
// Error message in case plugin fails to register, empty string otherwise | ||
string error = 2; | ||
} | ||
|
||
// RegistrationStatusResponse is sent by plugin to kubelet in response to RegistrationStatus RPC | ||
message RegistrationStatusResponse { | ||
} | ||
|
||
// InfoRequest is the empty request message from Kubelet | ||
message InfoRequest { | ||
} | ||
|
||
// Registration is the service advertised by the Plugins. | ||
service Registration { | ||
rpc GetInfo(InfoRequest) returns (PluginInfo) {} | ||
rpc NotifyRegistrationStatus(RegistrationStatus) returns (RegistrationStatusResponse) {} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
/* | ||
Copyright 2018 The Kubernetes Authors. | ||
Licensed under the Apache License, Version 2.0 (the "License"); | ||
you may not use this file except in compliance with the License. | ||
You may obtain a copy of the License at | ||
http://www.apache.org/licenses/LICENSE-2.0 | ||
Unless required by applicable law or agreed to in writing, software | ||
distributed under the License is distributed on an "AS IS" BASIS, | ||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
See the License for the specific language governing permissions and | ||
limitations under the License. | ||
*/ | ||
|
||
package pluginregistration | ||
|
||
const ( | ||
CSIPlugin = "CSIPlugin" | ||
DevicePlugin = "DevicePlugin" | ||
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,58 @@ | ||
package(default_visibility = ["//visibility:public"]) | ||
|
||
load( | ||
"@io_bazel_rules_go//go:def.bzl", | ||
"go_library", | ||
"go_test", | ||
) | ||
|
||
go_library( | ||
name = "go_default_library", | ||
srcs = [ | ||
"example_plugin.go", | ||
"plugin_watcher.go", | ||
], | ||
importpath = "k8s.io/kubernetes/pkg/kubelet/util/pluginwatcher", | ||
deps = [ | ||
"//pkg/kubelet/apis/pluginregistration/v1alpha1:go_default_library", | ||
"//pkg/kubelet/util/pluginwatcher/example_plugin_apis/v1beta1:go_default_library", | ||
"//pkg/kubelet/util/pluginwatcher/example_plugin_apis/v1beta2:go_default_library", | ||
"//pkg/util/filesystem:go_default_library", | ||
"//vendor/github.com/fsnotify/fsnotify:go_default_library", | ||
"//vendor/github.com/golang/glog:go_default_library", | ||
"//vendor/golang.org/x/net/context:go_default_library", | ||
"//vendor/google.golang.org/grpc:go_default_library", | ||
], | ||
) | ||
|
||
filegroup( | ||
name = "package-srcs", | ||
srcs = glob(["**"]), | ||
tags = ["automanaged"], | ||
visibility = ["//visibility:private"], | ||
) | ||
|
||
filegroup( | ||
name = "all-srcs", | ||
srcs = [ | ||
":package-srcs", | ||
"//pkg/kubelet/util/pluginwatcher/example_plugin_apis/v1beta1:all-srcs", | ||
"//pkg/kubelet/util/pluginwatcher/example_plugin_apis/v1beta2:all-srcs", | ||
], | ||
tags = ["automanaged"], | ||
visibility = ["//visibility:public"], | ||
) | ||
|
||
go_test( | ||
name = "go_default_test", | ||
srcs = ["plugin_watcher_test.go"], | ||
embed = [":go_default_library"], | ||
deps = [ | ||
"//pkg/kubelet/apis/pluginregistration/v1alpha1:go_default_library", | ||
"//pkg/kubelet/util/pluginwatcher/example_plugin_apis/v1beta1:go_default_library", | ||
"//pkg/kubelet/util/pluginwatcher/example_plugin_apis/v1beta2:go_default_library", | ||
"//vendor/github.com/stretchr/testify/require:go_default_library", | ||
"//vendor/golang.org/x/net/context:go_default_library", | ||
"//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", | ||
], | ||
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
This folder contains a utility, pluginwatcher, for Kubelet to register | ||
different types of node-level plugins such as device plugins or CSI plugins. | ||
It discovers plugins by monitoring inotify events under the directory returned by | ||
kubelet.getPluginsDir(). Lets refer this directory as PluginsSockDir. | ||
For any discovered plugin, pluginwatcher issues Registration.GetInfo grpc call | ||
to get plugin type, name and supported service API versions. For any registered plugin type, | ||
pluginwatcher calls the registered callback function with the received plugin | ||
name, supported service API versions, and the full socket path. The Kubelet | ||
component that receives this callback can acknowledge or reject the plugin | ||
according to its own logic, and use the socket path to establish its service | ||
communication with any API version supported by the plugin. | ||
|
||
Here are the general rules that Kubelet plugin developers should follow: | ||
- Run as 'root' user. Currently creating socket under PluginsSockDir, a root owned directory, requires | ||
plugin process to be running as 'root'. | ||
- Implements the Registration service specified in | ||
pkg/kubelet/apis/pluginregistration/v*/api.proto. | ||
- The plugin name sent during Registration.GetInfo grpc should be unique | ||
for the given plugin type (CSIPlugin or DevicePlugin). | ||
- The socket path needs to be unique and doesn't conflict with the path chosen | ||
by any other potential plugins. Currently we only support flat fs namespace | ||
under PluginsSockDir but will soon support recursive inotify watch for | ||
hierarchical socket paths. | ||
- A plugin should clean up its own socket upon exiting or when a new instance | ||
comes up. A plugin should NOT remove any sockets belonging to other plugins. | ||
- A plugin should make sure it has service ready for any supported service API | ||
version listed in the PluginInfo. | ||
- For an example plugin implementation, take a look at example_plugin.go | ||
included in this directory. |
Oops, something went wrong.