New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add kubectl plugin mechanism KEP #2437

Merged
merged 2 commits into from Aug 16, 2018

Conversation

@juanvallejo
Member

juanvallejo commented Jul 30, 2018

cc @soltysh @seans3

Adds proposal describing an updated, git-style plugin mechanism.

@juanvallejo

This comment has been minimized.

Show comment
Hide comment
@mikedanese

This comment has been minimized.

Show comment
Hide comment
@mikedanese

mikedanese Aug 2, 2018

Member

Can we add kubectl to the title? Kubernetes has a lot of different types of plugins.

Member

mikedanese commented Aug 2, 2018

Can we add kubectl to the title? Kubernetes has a lot of different types of plugins.

@juanvallejo juanvallejo changed the title from Add updated plugin mechanism KEP to Add kubectl plugin mechanism KEP Aug 2, 2018

@philips

This comment has been minimized.

Show comment
Hide comment
@philips

philips Aug 8, 2018

Contributor

Can you add some color on why plugins are useful? I get the technical details but I don't know what the goal is. Thanks!

Contributor

philips commented Aug 8, 2018

Can you add some color on why plugins are useful? I get the technical details but I don't know what the goal is. Thanks!

@juanvallejo

This comment has been minimized.

Show comment
Hide comment
@juanvallejo

juanvallejo Aug 9, 2018

Member

@philips

Can you add some color on why plugins are useful? I get the technical details but I don't know what the goal is. Thanks!

Sure, will update KEP to expand more on this

Member

juanvallejo commented Aug 9, 2018

@philips

Can you add some color on why plugins are useful? I get the technical details but I don't know what the goal is. Thanks!

Sure, will update KEP to expand more on this

@juanvallejo

This comment has been minimized.

Show comment
Hide comment
@juanvallejo

juanvallejo Aug 9, 2018

Member

Updated Motivation section to expand on the reasoning for having plugins.

Member

juanvallejo commented Aug 9, 2018

Updated Motivation section to expand on the reasoning for having plugins.

@philips

This comment has been minimized.

Show comment
Hide comment
@philips

philips Aug 9, 2018

Contributor

@juanvallejo thanks, looks good.

Contributor

philips commented Aug 9, 2018

@juanvallejo thanks, looks good.

@soltysh

/lgtm

@k8s-ci-robot k8s-ci-robot added the lgtm label Aug 15, 2018

@soltysh

This comment has been minimized.

Show comment
Hide comment
@soltysh

soltysh Aug 15, 2018

Contributor

This topic was discussed for almost past 6 months during various SIG-CLI meetings. The KEP itself was posted few weeks ago and was broadcast to kubernetes-dev and sig-cli ML. During today's SIG-CLI there were no objections so I'm approving this PR as is.

Contributor

soltysh commented Aug 15, 2018

This topic was discussed for almost past 6 months during various SIG-CLI meetings. The KEP itself was posted few weeks ago and was broadcast to kubernetes-dev and sig-cli ML. During today's SIG-CLI there were no objections so I'm approving this PR as is.

@philips

This comment has been minimized.

Show comment
Hide comment
@philips

philips Aug 15, 2018

Contributor
Contributor

philips commented Aug 15, 2018

@soltysh

This comment has been minimized.

Show comment
Hide comment
@soltysh

soltysh Aug 16, 2018

Contributor

/approve

Contributor

soltysh commented Aug 16, 2018

/approve

@soltysh

This comment has been minimized.

Show comment
Hide comment
@soltysh

soltysh Aug 16, 2018

Contributor

@cblecker mind approving the KEP number bump for this one?

Contributor

soltysh commented Aug 16, 2018

@cblecker mind approving the KEP number bump for this one?

@cblecker

This comment has been minimized.

Show comment
Hide comment
@cblecker

cblecker Aug 16, 2018

Member

/approve

Member

cblecker commented Aug 16, 2018

/approve

@k8s-ci-robot

This comment has been minimized.

Show comment
Hide comment
@k8s-ci-robot

k8s-ci-robot Aug 16, 2018

Contributor

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: cblecker, soltysh

The full list of commands accepted by this bot can be found here.

The pull request process is described here

Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

Contributor

k8s-ci-robot commented Aug 16, 2018

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: cblecker, soltysh

The full list of commands accepted by this bot can be found here.

The pull request process is described here

Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@k8s-ci-robot k8s-ci-robot merged commit bf64c8b into kubernetes:master Aug 16, 2018

3 checks passed

cla/linuxfoundation juanvallejo authorized
Details
pull-community-verify Job succeeded.
Details
tide In merge pool.
Details

@juanvallejo juanvallejo deleted the juanvallejo:jvallejo/add-plugins-kep branch Aug 16, 2018

k8s-merge-robot added a commit to kubernetes/kubernetes that referenced this pull request Aug 17, 2018

Merge pull request #66876 from juanvallejo/jvallejo/prototype-plugins
Automatic merge from submit-queue (batch tested with PRs 67062, 67169, 67539, 67504, 66876). If you want to cherry-pick this change to another branch, please follow the instructions <a href="https://github.com/kubernetes/community/blob/master/contributors/devel/cherry-picks.md">here</a>.

Update the kubectl plugin mechanism

**Release note**:
```release-note
The plugin mechanism functionality to closely follow the git plugin design
```

Replace the existing plugin mechanism with the design proposed in kubernetes/community#2437.

~~_The full implementation of the plugin mechanism itself is entirely contained within the first commit._~~

## Walkthrough

Under the new design, there is no plugin installation or loading required to use plugins.
A plugin is simply any executable file on a user's PATH whose name begins with `kubectl-`.
- Plugins receive the inherited environment from the `kubectl` binary. All environment variables
accessible by `kubectl` become accessible by the plugin.
- Plugins decide which command path they wish to implement based on their name. For example, a plugin wanting to provide a new command `foo`, would simply be named `kubectl-foo`.

### Creating a plugin

Below is an example plugin, that we will use for this walkthrough. Plugins may be written in any language, and handle arguments and flags in any way, optionally (as a convention) providing a way to retrieve their version via a `version` subcommand.

```bash
#!/bin/bash

# optional argument handling
if [[ "$1" == "version" ]]
then
    echo "1.0.0"
    exit 0
fi

# optional argument handling
if [[ "$1" == "config" ]]
then
    echo $KUBECONFIG
    exit 0
fi

echo "I am a plugin named kubectl-foo"
```

### Using a plugin

To use a plugin, simply make it executable:

```bash
sudo chmod +x ./kubectl-foo
```

and place it anywhere in your PATH:

```bash
sudo mv ./kubectl-foo /usr/local/bin
```

You may now invoke your plugin as a `kubectl` command:

```bash
$ kubectl foo
I am a plugin named kubectl-foo
```

All args and flags are passed as-is to the executable:

```bash
$ kubectl foo version
1.0.0
```

All environment variables are also passed as-is to the executable:

```bash
$ export KUBECONFIG=~/.kube/config
$ kubectl foo config
/home/<user>/.kube/config

$ KUBECONFIG=/etc/kube/config kubectl foo config
/etc/kube/config
```

Additionally, the first argument that is passed to a plugin will always be the full path to the location where it was invoked (`$0` would equal `/usr/local/bin/kubectl-foo` in our example above).

### Plugin discoverability

Seeing as how the `kubectl plugin` command is left as a no-op with this PR (perhaps it could serve as an entrypoint towards additional plugin functionality in the future), a small subcommand has been included that _lists all available plugin executables on a user's PATH_, along with any warnings it finds.

Example usage of this new subcommand is included below:

```bash
$ kubectl plugin list
The following kubectl-compatible plugins are available:

test/fixtures/pkg/kubectl/plugins/kubectl-foo
plugins/kubectl-foo
  - warning: plugins/kubectl-foo is overshadowed by a similarly named plugin: test/fixtures/pkg/kubectl/plugins/kubectl-foo
plugins/kubectl-invalid
  - warning: plugins/kubectl-invalid identified as a kubectl plugin, but it is not executable
plugins/kubectl-bar

error: 2 plugin warnings were found
```

cc @kubernetes/kubectl-maintainers @kubernetes/sig-cli-pr-reviews @soltysh @seans3 @mengqiy
@carolynvs

This comment has been minimized.

Show comment
Hide comment
@carolynvs

carolynvs Aug 24, 2018

Contributor

I haven't been following the dev list closely enough lately, but I just resurfaced and saw this 🎁. Exciting to see us moving forward with plugins!

Contributor

carolynvs commented Aug 24, 2018

I haven't been following the dev list closely enough lately, but I just resurfaced and saw this 🎁. Exciting to see us moving forward with plugins!

@soltysh

This comment has been minimized.

Show comment
Hide comment
@soltysh

soltysh Aug 28, 2018

Contributor

Yes! And thank you for your patience Carolyn :)

Contributor

soltysh commented Aug 28, 2018

Yes! And thank you for your patience Carolyn :)

calebamiles pushed a commit to calebamiles/community that referenced this pull request Sep 5, 2018

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment