Kubernetes 中如何開發一個 kubectl 的插件命令

背景

在平常使用中,Kubectl 做爲和 Kubernetes 集羣進行交互的工具,提供了豐富的功能。可是偶爾也有時候,你想作一些 Kubectl 暫時還不支持的功能。那麼在這種狀況下,如何不改變 Kubectl 的代碼而且從新編譯就能引入新的功能呢? 這個問題的答案就是採用 Kubectl 的 Plugin 機制。工具

Kubectl 的 Plugin 機制在 v1.8.0 版本的時候就引入了,而且在 v1.12.0 版本中進行了大規模的重構以適應更加複雜多樣的場景,而且最終在 v1.14.0 版本中穩定下來。因此你必須使用 Kubectl v1.12.0 及以上版本才能夠支持當前的插件命令。插件

插件命令

所謂的插件命令其實很簡單,只要符合如下幾個特色便可:code

(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");
}

而後咱們編譯一下:get

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

而後咱們把這個命令所在的目錄放到系統的 $PATH 變量中,最後經過 kubectl 命令嘗試下。cmd

$  kubectl hello
hello, i am a kubelet plugin command

經過上面的輸出咱們能夠看到,這個插件命令已經成功完成了,那麼剩下來就是利用你熟悉的語言來編寫二進制工具來知足你的需求了。kubernetes

發現插件

Kubectl 提供了一個 plugin 的命令,該命令可使用子命令 list 來列舉當前系統中的插件命令。具體的搜索方法以下:io

(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/

相關文章
相關標籤/搜索