k8s之kubectl插件


概述

在日常使用中,Kubectl 作為和 Kubernetes 集群進行交互的工具,提供了豐富的功能。但是偶爾也有時候,你想做一些 Kubectl 暫時還不支持的功能。那么在這種情況下,如何不改變 Kubectl 的代碼並且重新編譯就能引入新的功能呢? 這個問題的答案就是采用 Kubectl 的 Plugin 機制。

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

插件規則

插件本身是一個可執行文件,kubectl可直接使用插件,其有如下特點:

1) 插件是一個可執行文件,任何可執行文件均可;

2) 插件路徑要在系統$PATH里,插件本身可直接執行;

3) 插件命令必須以kubectl-開頭,如kubectl-echo,但不可與已有插件名相同,特別是k8s原有插件。

4) 插件命令支持子命令,其格式必須為 kubectl-cmd-cmd1-cmd11 ,也就是每個命令通過 - 分隔。這樣在調用的時候可以使用 $ kubectl cmd cmd1 cmd11 這樣的方式來調用。

5) 如果要在插件命令中使用多個單詞構成一個命令,那么多個單詞必須用 _ 進行分隔,例如對於 kubectl-hello_world 命令,可以通過 $ kubectl hello_world 這樣的方式來調用。 

6) 插件命令必須自行解析所有傳給該命令的選項參數,並進行相應的處理。

編寫一個最簡單的插件kubectl-hello,編譯后放到/usr/local/bin目錄下執行

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

$ gcc -o kubectl-hello kubectl-hello.c
$  kubectl hello k8s
hello, i am a kubelet plugin command

/usr/local/bin/kubectl-hello
k8s

注:無法定義一個 kubectl 已經存在的命令去試圖覆蓋原命令的行為。例如 kubectl-version 這樣的命令永遠不會被執行,因為 kubectl 會優先執行內置的 version 命令。基於這樣的原因,你也無法給已有的命令增加額外的子命令。

注:對於插件命令來講,它接收到的第一個參數總是它文件所在的全路徑。

插件應用

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

(1) 搜索系統的 $PATH 中指定的所有的目錄,查找所有以 kubectl- 開頭的文件; 

(2) 如果搜索到的匹配以 kubectl- 開頭的文件是可執行文件,那么會按照順序作為插件命令輸出;如果不是可執行文件,也會輸出,但是同時會輸出一個 Warning 的信息。

插件管理krew

鑒於 kubernetes 本身並沒有提供插件命令的包管理器用來安裝和更新插件命令,我們可以使用 Kubernetes-sigs 項目中的 krew 來完成相關工作。

krew是一個Kubernetes的包管理工具,它的功能就是提供簡單的方法下載、檢索、管理其他插件,類似操作系統的apt、yum、brew等工具,其命名也似乎模仿的brew工具。

krew在krew index項目中維護支持的插件列表以及下載路徑,目前所有插件都是在github中發布下載,但由於眾所周知的原因,國內從github下載速度非常慢 。

為了提高下載速度,fast-krew腳本使用axel下載替換原來的下載方式,提高下載速度。

github:https://github.com/kubernetes-sigs/krew.git

 

參考:

https://kubernetes.io/docs/tasks/extend-kubectl/kubectl-plugins/

k8s實踐(十三):kubectl插件管理工具krew https://blog.51cto.com/3241766/2452592

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

分享幾個Kubernetes實用插件和工具  知乎

如何編寫一個支持 Krew 的 kubectl 插件

認證插件  kubernete中文社區


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM