摘要:基于以上的要求,我們可以用任何語言去編寫這個命令,比如我們最簡單的用語言寫一個的插件命令嘗試下。發(fā)現(xiàn)插件提供了一個的命令,該命令可以使用子命令來列舉當前系統(tǒng)中的插件命令。它繼承命令的執(zhí)行環(huán)境。
背景
在日常使用中,Kubectl 作為和 Kubernetes 集群進行交互的工具,提供了豐富的功能。但是偶爾也有時候,你想做一些 Kubectl 暫時還不支持的功能。那么在這種情況下,如何不改變 Kubectl 的代碼并且重新編譯就能引入新的功能呢? 這個問題的答案就是采用 Kubectl 的 Plugin 機制。
Kubectl 的 Plugin 機制在 v1.8.0 版本的時候就引入了,并且在 v1.12.0 版本中進行了大規(guī)模的重構(gòu)以適應更加復雜多樣的場景,并且最終在 v1.14.0 版本中穩(wěn)定下來。所以你必須使用 Kubectl v1.12.0 及以上版本才可以支持當前的插件命令。
插件命令所謂的插件命令其實很簡單,只要符合以下幾個特點即可:
(1) 該命令是一個可執(zhí)行的文件;
(2) 該命令能夠通過 $PATH 搜索到,也就是說如果需要,你必須把這個命令加入到 $PATH 中;
(3) 該命令必須以 kubectl- 開頭,例如 kubectl-echo 就是一個合法的插件命令名稱。
基于以上的要求,我們可以用任何語言去編寫這個命令,比如我們最簡單的用 C 語言寫一個 kubectl-hello 的插件命令嘗試下。
#includeint main(int argc, char *argv[]) { printf("hello, i am a kubelet plugin command "); }
然后我們編譯一下:
$ gcc -o kubectl-hello kubectl-hello.c
然后我們把這個命令所在的目錄放到系統(tǒng)的 $PATH 變量中,最后通過 kubectl 命令嘗試下。
$ kubectl hello hello, i am a kubelet plugin command
通過上面的輸出我們可以看到,這個插件命令已經(jīng)成功完成了,那么剩下來就是利用你熟悉的語言來編寫二進制工具來滿足你的需求了。
發(fā)現(xiàn)插件Kubectl 提供了一個 plugin 的命令,該命令可以使用子命令 list 來列舉當前系統(tǒng)中的插件命令。具體的搜索方法如下:
(1) 搜索系統(tǒng)的 $PATH 中指定的所有的目錄,查找所有以 kubectl- 開頭的文件;
(2) 如果搜索到的匹配以 kubectl- 開頭的文件是可執(zhí)行文件,那么會按照順序作為插件命令輸出;如果不是可執(zhí)行文件,也會輸出,但是同時會輸出一個 Warning 的信息;
雖然我們可以自定義插件命令,但是有個限制就是你無法定義一個 kubectl 已經(jīng)存在的命令去試圖覆蓋原命令的行為。例如 kubectl-version 這樣的命令永遠不會被執(zhí)行,因為 kubectl 會優(yōu)先執(zhí)行內(nèi)置的 version 命令?;谶@樣的原因,你也無法給已有的命令增加額外的子命令。
使用插件插件命令不需要安裝,也不需要預加載任何東西。它繼承 kubectl 命令的執(zhí)行環(huán)境。kubectl 通過插件命令的名稱來執(zhí)行它。例如對于上面的名為 kubectl-hello 的命令,kubectl 就通過 $ kubectl hello 來執(zhí)行它。
對于插件命令來講,它接收到的第一個參數(shù)總是它文件所在的全路徑。對于上面的 kubectl-hello 命令,我們稍作修改,用來打印所有的參數(shù)。
#includeint main(int argc, char *argv[]) { int i = 0; printf("hello, i am a kubelet plugin command "); printf(" "); for (; i < argc; i++) { printf("%s ", 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 ,也就是每個命令通過 - 分隔。這樣在調(diào)用的時候可以使用 $ kubectl cmd cmd1 cmd11 這樣的方式來調(diào)用。
(2) 如果要在插件命令中使用多個單詞構(gòu)成一個命令,那么多個單詞必須用 _ 進行分隔,例如對于 kubectl-hello_world 命令,可以通過 $ kubectl hello_world 這樣的方式來調(diào)用。
(3) 插件命令必須自行解析所有傳給該命令的選項參數(shù),并進行相應的處理。
鑒于 kubernetes 本身并沒有提供插件命令的包管理器用來安裝和更新插件命令,我們可以使用 Kubernetes-sigs 項目中的 krew 來完成相關工作。
參考文檔:https://kubernetes.io/docs/tasks/extend-kubectl/kubectl-plugins/
文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/32995.html
摘要:當服務器可以作為節(jié)點以后,用戶可以在容器中運行基于平臺的應用了比如程序等這也使得成為第一個全功能的跨平臺集群管理工具。同時,新解決方案還采用了臨時密鑰來加強節(jié)點間證書傳遞的安全性。 部分翻譯自https://sysdig.com/blog/whats... Kubernetes 1.14的亮點新功能: 支持Windows容器服務 可以通過kubeadm動態(tài)地創(chuàng)建一個高可用集群 將ku...
摘要:分布式文件系統(tǒng)和數(shù)據(jù)庫,由于性能和成本,是持久性本地存儲的主要用例。在裸機上,除了性能之外,本地存儲通常更便宜,并且使用它是配置分布式文件系統(tǒng)的必要條件。 作者:1.14發(fā)布團隊 我們很高興地宣布推出Kubernetes 1.14,這是我們2019年的首次發(fā)布! showImg(https://segmentfault.com/img/bVbqrJZ?w=300&h=293); Kub...
摘要:分布式文件系統(tǒng)和數(shù)據(jù)庫,由于性能和成本,是持久性本地存儲的主要用例。在裸機上,除了性能之外,本地存儲通常更便宜,并且使用它是配置分布式文件系統(tǒng)的必要條件。 作者:1.14發(fā)布團隊 我們很高興地宣布推出Kubernetes 1.14,這是我們2019年的首次發(fā)布! showImg(https://segmentfault.com/img/bVbqrJZ?w=300&h=293); Kub...
摘要:有些人將其稱為容器編排平臺,而并非唯一的此類平臺。但是在中,您可以快速擴展出多個實例你看看使用擴展你的網(wǎng)站是何其便捷。當你指向群集的地址和節(jié)點的端口號時,你就已經(jīng)可見瀏覽器中正在運行的程序了。 showImg(https://segmentfault.com/img/remote/1460000017838786?w=1120&h=757); Laravel 是開發(fā) PHP 應用程序的...
摘要:此次新版的最重大更新無疑為對節(jié)點的生產(chǎn)級支持。持久化本地存儲的最主要用例是分布式文件系統(tǒng)和數(shù)據(jù)庫,主要是由于性能和成本的原因。在裸機上,除了性能之外,本地存儲通常也更便宜,并且使用它是配置分布式文件系統(tǒng)的必要條件。 Kubernetes 1.14現(xiàn)已正式發(fā)布,這是Kubernetes在2019年的首次更新! Kubernetes 1.14由31個增強功能組成:10個功能現(xiàn)進入Stabl...
閱讀 1683·2021-11-16 11:44
閱讀 2411·2021-10-11 11:07
閱讀 4079·2021-10-09 09:41
閱讀 681·2021-09-22 15:52
閱讀 3203·2021-09-09 09:33
閱讀 2720·2019-08-30 15:55
閱讀 2295·2019-08-30 15:55
閱讀 850·2019-08-30 15:55