Kubernetes 中如何开发一个 kubectl 的插件命令

反射涟漪
• 阅读 10502

背景

在日常使用中,Kubectl 作为和 Kubernetes 集群进行交互的工具,提供了丰富的功能。但是偶尔也有时候,你想做一些 Kubectl 暂时还不支持的功能。那么在这种情况下,如何不改变 Kubectl 的代码并且重新编译就能引入新的功能呢? 这个问题的答案就是采用 Kubectl 的 Plugin 机制。

Kubectl 的 Plugin 机制在 v1.8.0 版本的时候就引入了,并且在 v1.12.0 版本中进行了大规模的重构以适应更加复杂多样的场景,并且最终在 v1.14.0 版本中稳定下来。所以你必须使用 Kubectl v1.12.0 及以上版本才可以支持当前的插件命令。

插件命令

所谓的插件命令其实很简单,只要符合以下几个特点即可:

(1) 该命令是一个可执行的文件;
(2) 该命令能够通过 $PATH 搜索到,也就是说如果需要,你必须把这个命令加入到 $PATH 中;
(3) 该命令必须以 kubectl- 开头,例如 kubectl-echo 就是一个合法的插件命令名称。

基于以上的要求,我们可以用任何语言去编写这个命令,比如我们最简单的用 C 语言写一个 kubectl-hello 的插件命令尝试下。

#include <stdio.h>
int
main(int argc, char *argv[])
{
    printf("hello, i am a kubelet plugin command\n");
}

然后我们编译一下:

$ gcc -o kubectl-hello kubectl-hello.c

然后我们把这个命令所在的目录放到系统的 $PATH 变量中,最后通过 kubectl 命令尝试下。

$  kubectl hello
hello, i am a kubelet plugin command

通过上面的输出我们可以看到,这个插件命令已经成功完成了,那么剩下来就是利用你熟悉的语言来编写二进制工具来满足你的需求了。

发现插件

Kubectl 提供了一个 plugin 的命令,该命令可以使用子命令 list 来列举当前系统中的插件命令。具体的搜索方法如下:

(1) 搜索系统的 $PATH 中指定的所有的目录,查找所有以 kubectl- 开头的文件;
(2) 如果搜索到的匹配以 kubectl- 开头的文件是可执行文件,那么会按照顺序作为插件命令输出;如果不是可执行文件,也会输出,但是同时会输出一个 Warning 的信息;

当前限制

虽然我们可以自定义插件命令,但是有个限制就是你无法定义一个 kubectl 已经存在的命令去试图覆盖原命令的行为。例如 kubectl-version 这样的命令永远不会被执行,因为 kubectl 会优先执行内置的 version 命令。基于这样的原因,你也无法给已有的命令增加额外的子命令。

使用插件

插件命令不需要安装,也不需要预加载任何东西。它继承 kubectl 命令的执行环境。kubectl 通过插件命令的名称来执行它。例如对于上面的名为 kubectl-hello 的命令,kubectl 就通过 $ kubectl hello 来执行它。

对于插件命令来讲,它接收到的第一个参数总是它文件所在的全路径。对于上面的 kubectl-hello 命令,我们稍作修改,用来打印所有的参数。

#include <stdio.h>
int
main(int argc, char *argv[])
{
    int        i = 0;
    printf("hello, i am a kubelet plugin command\n");
    printf("\n");
    for (; i < argc; i++) {
        printf("%s\n", argv[i]);
    }
}

输出如下:

$ kubectl hello kubernetes
hello, i am a kubelet plugin command

/Users/jemy/Bin/k8s-plugins/kubectl-hello
kubernetes

插件命名

对于插件的命令,必须了解的两点如下:

(1) 插件命令支持子命令,其格式必须为 kubectl-cmd-cmd1-cmd11 ,也就是每个命令通过 - 分隔。这样在调用的时候可以使用 $ kubectl cmd cmd1 cmd11 这样的方式来调用。
(2) 如果要在插件命令中使用多个单词构成一个命令,那么多个单词必须用 _ 进行分隔,例如对于 kubectl-hello_world 命令,可以通过 $ kubectl hello_world 这样的方式来调用。
(3) 插件命令必须自行解析所有传给该命令的选项参数,并进行相应的处理。

插件管理

鉴于 kubernetes 本身并没有提供插件命令的包管理器用来安装和更新插件命令,我们可以使用 Kubernetes-sigs 项目中的 krew 来完成相关工作。

参考文档:https://kubernetes.io/docs/tasks/extend-kubectl/kubectl-plugins/

点赞
收藏
评论区
推荐文章
可莉 可莉
3年前
15.linux上安装kubectl和Minikube
1.安装kubectlkubectl是负责与k8s集群talk的工具,就像dockercli对话docker集群一样地址:https://kubernetes.io/docs/tasks/tools/installkubectl/Linux环境步骤:下载kubectl文件(因为涉及到翻墙的问
Stella981 Stella981
3年前
Kubernetes工作流程
Kubernetes工作流程!(https://oscimg.oschina.net/oscnet/125154c88288a56d3f8a0a76942105107de.png)客户端创建pod流程:1.用户管理员创建Pod的请求默认是通过kubectl客户端管理命令apiser
Stella981 Stella981
3年前
CentOS7环境部署kubenetes1.12版本五部曲之四:安装dashboard
本文是《CentOS7环境部署kubenetes1.12版本五部曲》系列的第四篇,前面的实站已经搭建了kubernetes1.12集群,操作都是在控制台用kubectl命令来完成的,今天咱们一起将WEB管理页面部署上去;前提本次实战需要科学上网,才能kubernetes相关的操作用于学习和实践;实战1.在master节点的
Wesley13 Wesley13
3年前
Ubuntu 国内安装 kubernetes
由于墙的原因,国内要安装kubernetes非常的麻烦,因此只要解决这个问题,就可以顺利安装kubernetes的三个官法工具kubelet、kubeadm、kubectl。安装环境:OS:Ubuntu18.04.11.添加相应的源我在这里使用阿里源,命令如下:sudovim/
Stella981 Stella981
3年前
Kubernetes使用命令
kubeadm/kubelet/kubectl区别kubeadm是kubernetes集群快速构建工具kubelet运行在所有节点上,负责启动POD和容器,以系统服务形式出现kubectl:kubectl是kubenetes命令行工具,提供指令Kubernete
Wesley13 Wesley13
3年前
K8S知道,K9S呢?
k9s是用于管理Kubernetes集群的CLI。通过封装kubectl功能,k9s可以让开发者快速查看并解决运行Kubernetes时的日常问题。部分特性跟踪在Kubernetes集群运行的资源的实时活动处理Kubernetes标准资源和自定义资源跟踪与资源相关联的
Stella981 Stella981
3年前
Kubernetes 中 kubectl.sh 各种参数(待译)
kubectl是控制Kubernetes的集群管理器。详情查看https://github.com/kubernetes/kubernetes用法: kubectl\flags\ kubectl\command\可用命令: get                
Stella981 Stella981
3年前
K8s常用命令操作
一、kubernetes常用命令 一、kubectl命令补全  1、master安装命令补全,并临时生效yuminstallybashcompletionsource/usr/share/bashcompletion/bash_completion
Stella981 Stella981
3年前
Kubernetes 1.20.2高可用集群快速升级及扩容
2021年已经到来,让我们有一个新的开始。Kubernetes1.20.2已经正式发布,高可用集群也可以直接升级(hub.docker.com已经停更,使用registry.cnhangzhou.aliyuncs.com/google\_containers)。快速升级(含国内镜像快速下载链接)包括升级kubeadm/kubectl/kube
Stella981 Stella981
3年前
Kubernetes管理员手边必备的9个kubectl命令
!(https://oscimg.oschina.net/oscnet/732b33e9fb366548cea5320a5a561d08650.jpg)!(https://oscimg.oschina.net/oscnet/acde74394ef93bf606f61d3d9be886c6c40.jpg)导语将这9个关键的kubec
Stella981 Stella981
3年前
Kubernetes 使用 kubeconfig 文件组织集群访问
kubeconfig文件用于组织关于集群、用户、命名空间和认证机制的信息。命令行工具 kubectl 从kubeconfig文件中得到它要选择的集群以及跟集群APIserver交互的信息。注意: 用于配置集群访问信息的文件叫作 kubeconfig文件,这是一种引用配置文件的通用方式,并不是说它的文件名就是 kubeconfig。默认情