明晚8:30,k3s實戰課程開啟!將由Rancher研發總監帶你暢游k3s與邊緣AI的奇妙世界,課程內容完全由實際使用場景中總結而來,別錯過啦~!訪問以下鏈接即可傳送到課程現場:
http://z-mz.cn/PmxF
作者丨Daniel Weibel
原文鏈接:
https://learnk8s.io/blog/kubectl-productivity
本文來自Rancher Labs
如果你正在使用Kubernetes,那么kubectl一定是你最常使用的工具,無論你需要學習任何工具,都應該先提前了解kubectl并有效地使用它,本文包含了一系列技巧,可以讓你更高效而且有效地使用kubectl,同時,可以加深你對Kubernetes各個方面作業方式的理解,
本文的目標不僅是使你使用Kubernetes的日常作業更高效,而且更愉快!

目 錄
-
什么是kubectl?
-
使用命令補全功能保存輸入
-
迅速查找資源規范
-
使用自定義列輸出格式
-
輕松在集群和命名空間之間切換
-
使用自動生成別名(Aliases)保存輸入
-
使用插件擴展kubectl
什么是kubectl
在學習如何更高效地使用kubectl之前,你應該對它是什么以及如何作業有個基本的了解,從用戶的角度來說,kubectl是你控制Kubernetes的“駕駛艙”,它可以讓你執行所有可能的Kubernetes操作,
從技術角度上看,kubectl是Kubernetes API的客戶端,Kubernetes API是一個 HTTP REST API,這個API是真正的Kubernetes用戶界面,Kubernetes完全受這個API控制,這意味著每個Kubernetes操作都作為API端點公開,并且可以由對此端點的HTTP請求執行,因此,kubectl的主要作業是執行對Kubernetes API的HTTP請求:

Kubernetes是一個完全以資源為中心的系統,這意味著,Kubernetes維護資源的內部狀態并且所有的Kubernetes操作都是針對這些資源的CRUD(增加、讀取、更新、洗掉)操作,你完全可以通過操控這些資源(Kubernetes會根據資源的當前狀態找出解決方案)來控制Kubernetes,因此,Kubernetes API reference主要是資源型別及其相關操作的串列,
來,我們來看一個例子,
假設你想要創建一個ReplicaSet資源,為了達成此目標,你在一個名為replicaset.yaml的檔案中定義ReplicaSet,然后運行以下命令:
kubectl create -f replicaset.yaml
顯然,在Kubernetes已經創建了你的ReplicaSet,但之后會發生什么呢?
Kubernetes有一個創建ReplicaSet的操作,并且它和其他所有Kubernetes操作一樣,都會作為API端點暴露,對于這個操作而言,該特定API端點如下:
POST /apis/apps/v1/namespaces/{namespace}/replicasets
你可以在API reference中找到所有Kubernetes操作對應的API端點,包括以上端點(https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.13 ),要向端點發出實際請求,你需要一開始就在API reference中列出的端點路徑中添加API server的URL,
因此,當你執行上述命令時,kubectl將向上述API端點發出HTTP POST請求,ReplicaSet定義(你在replicaset.yaml檔案中所提供的)在請求的正文中傳遞,
這就是kubectl對于與Kubernetes集群互動的所有命令的作業方式,在這些情況下,kubectl只需向適當的Kubernetes API端點發出HTTP請求即可,
請注意,通過手動向Kubernetes API發出HTTP請求,完全有可能使用curl之類的工具來控制Kubernetes,Kubectl只是讓你更輕松地使用Kubernetes API,
以上就是什么是kubectl及其作業原理的簡單介紹,但是,每個kubectl用戶都應該了解更多有關Kubernetes API的資訊,為此,我們先簡要地介紹一下Kubernetes的內部結構,
Kubernetes 內部
Kubernetes由一系列獨立組件構成,這些組件會在集群的節點上作為單獨的行程運行,一些組件運行在master節點,一些組件運行在worker節點,每個組件都有其特定功能,
在master節點上,有以下重要組件:
-
存盤后端:存盤資源定義(通常使用etcd)
-
API Server:提供Kubernetes API并管理存盤后端
-
Controller manager:確保資源狀態與規范相匹配
-
Scheduler:將Pod調度到worker節點
在worker節點上最重要的組件為:
- Kubelet:在worker節點上管理容器的執行
為了充分了解這些組件是如何一起作業的,讓我們來看一個例子,
假設你剛剛執行了kubectl create -f replicaset.yaml,此后,kubectl向_create ReplicaSet API端點_發出了HTTP POST請求(傳遞你的ReplicaSet資源定義),哪些因素會導致集群中出現這種情況?如下:

執行kubectl create -f replicaset.yaml之后,API server將會在存盤后端保存你的ReplicaSet資源定義,

這將觸發controller manager中的ReplicaSet controller,后者監視ReplicaSet資源的創建,更新和洗掉,

ReplicaSet controller為每個ReplicaSet副本創建了一個Pod定義(根據在ReplicaSet定義中的Pod模板創建)并將它們保存到存盤后端,

這觸發了scheduler,它監視尚未被分配給worker節點的Pod,

Scheduler為每個Pod選擇一個合適的worker節點,并在存盤后端中添加該資訊到Pod定義中,
請注意,到目前為止,集群中任何地方都沒有運行作業負載的代碼,至今,我們所完成的事就是在master節點上的存盤后端中創建和更新資源,

這觸發了在Pod所調度到的worker節點上的kubelet,它監視調度到其worker節點上的pod,

Kubelet從存盤后端讀取Pod定義并指示容器運行時(比如,Docker)來運行在worker節點上的容器,
此時,你的ReplicaSet應用程式已經在運行啦!
Kubernetes API的角色
從上述例子可知,Kubernetes組件(除了API server和存盤后端)通過在存盤后端監視資源更改和操控資源作業,然而,這些組件無法直接訪問存盤后端,僅能通過Kubernetes API進行訪問,
看一下以下示例:
-
ReplicaSet controller使用帶有watch引數_的list ReplicaSets API 端點_API操作來監視ReplicaSet資源的更改,
-
ReplicaSet controller使用_create Pod API 端點_來創建Pod
-
Scheduler使用_patch Pod API端點_以及有關選定的worker節點資訊來更新Pod,
正如你所見,這與kubectl所使用的API相同,
Kubernetes API對于內部組件和外部用戶的重復操作是Kubernetes的基本設計概念,現在,我們來總結一下Kubernetes如何作業的:
-
存盤后端存盤(如,資源)Kubernetes的狀態
-
API server以Kubernetes API的形式提供到存盤后端的介面
-
所有其他Kubernetes的組件和用戶通過Kubernetes API讀取、監視以及操控Kubernetes的狀態(如資源),
熟悉這些概念將在很大程度上幫助你更好地理解kubectl并利用它,
接下來,我們來看一下具體的技巧,來幫助你提升kubectl的生產力,
1、 使用命令補全功能保存輸入
命令補全是提高kubectl生產率的最有用但經常被忽略的技巧之一,
命令補全功能使你可以使用Tab鍵自動完成kubectl命令的各個部分,這適用于子命令、選項和引數,包括諸如資源名稱之類難以鍵入的內容,
在這里,你可以看到kubectl命令的完成情況:

命令補全可用于Bash和Zsh Shell,
官方檔案中包含有關設定命令完成的詳細說明(https://kubernetes.io/docs/tasks/tools/install-kubectl/#enabling-shell-autocompletion),但是以下部分會簡要向您介紹如何設定,
命令補全功能作業方式
總體而言,命令補全是通過補全腳本而起作用的Shell功能,補全腳本是一個shell腳本,它為特定命令定義了補全行為,通過輸入補全腳本可以補全相應的命令,Kubectl可以使用以下命令為Bash和Zsh自動生成并print out補全腳本:
kubectl completion bash
# or
kubectl completion zsh
理論上,在合適的shell(Bash或Zsh)中提供此命令的輸出將會啟用kubectl的命令補全功能,然而,實際上,在Bash和Zsh之間存在一些細微的差別(包括在Linux和macOS之間也存在差別),以下部分將對此進行詳細解釋,
Bash on Linux
Bash的補全腳本主要依賴bash-completion專案(https://github.com/scop/bash-completion),所以你需要先安裝它,
你可以使用不同的軟體包管理器安裝bash-completion,如:
sudo apt-get install bash-completion
# or
yum install bash-completion
你可以使用以下命令測驗bash-completion是否正確安裝:
type \_init\_completion
如果輸出的是shell功能的代碼,那么bash-completion就已經正確安裝了,如果命令輸出的是not found錯誤,你必須添加以下命令列到你的~/.bashrc檔案:
source /usr/share/bash-completion/bash_completion
你是否需要添加這一行到你的~/.bashrc檔案中,取決于你用于安裝bash-completion的軟體包管理器,對于APT來說,這是必要的,對于yum則不是,
bash-completion安裝完成之后,你需要進行一些設定,以便在所有的shell會話中獲得kubectl補全腳本,一種方法是將以下命令列添加到~/.bashrc檔案中:
source <(kubectl completion bash)
另一種可能性是將kubectl補充腳本添加到/etc/bash_completion.d目錄中(如果不存在,則需要先創建它):
kubectl completion bash >/etc/bash_completion.d/kubectl
/etc/bash_completion.d目錄中的所有補全腳本均由bash-completion自動提供,
以上兩種方法都是一樣的效果,重新加載shell后,kubectl命令補全就能正常作業啦!
Bash on macOS
使用macOS時,會有些復雜,原因是截至成文時macOS上Bash的默認版本是3.2,這已經過時了,不幸的是,kubectl補全腳本至少需要Bash 4.1,因此不適用于Bash 3.2,
蘋果依舊在macOS上默認使用過時的Bash版本是因為更新版本的Bash使用的是GPLv3 license,而蘋果不支持這一license,
這意味著,要在macOS上使用kubectl命令補全功能,你必須安裝較新版本的Bash,你甚至可以將其設定為新的默認shell,這將在將來為你省去很多此類麻煩,這實際上并不難,你可以在我之前寫的文章中找到說明:
https://itnext.io/upgrading-bash-on-macos-7138bd1066ba
在繼續剩下的步驟之前,確保你現在已經在使用Bash 4.1或更高的版本(使用bash --version查看版本),
同上一部分一樣,Bash的補全腳本主要依賴bash-completion專案(https://github.com/scop/bash-completion ),所以你需要先安裝它,
你可以使用Homebrew安裝bash-completion:
brew install bash-completion@2
@2代表bash-completion v2,Kubectl補全腳本要求bash-completion v2,而bash-completion v2要求至少是Bash 4.1,這就是你不能在低于4.1的Bash版本上使用kubectl補全腳本的原因,
brew intall命令的輸出包括一個“Caveats”部分,其中的說明將以下行添加~/.bash_profile檔案:
export BASH\_COMPLETION\_COMPAT_DIR=/usr/local/etc/bash_completion.d
[[ -r "/usr/local/etc/profile.d/bash_completion.sh" ]] && . "/usr/local/etc/profile.d/bash_completion.sh"
你必須執行此操作才能完成bash-completion的安裝,但是,我建議將這些行添加到~/.bashrc而不是~/.bash_profile檔案中,這可以確保bash-completion在子shell中也可用,
重新加載shell之后,你可以使用以下命令測驗bash-completion是否正確安裝:
type \_init\_completion
如果輸出為shell功能的代碼,意味著一切都設定完成,現在,你需要進行一些設定,以便在所有的shell會話中獲得kubectl補全腳本,一種方法是將以下命令列添加到~/.bashrc檔案中:
source <(kubectl completion bash)
另一種方法是將kubectl補全腳本添加到/usr/local/etc/bash_completion.d目錄中:
kubectl completion bash >/usr/local/etc/bash_completion.d/kubectl
僅當你使用Homebrew安裝了bash-completion時,此方法才有效,在這種情況下,bash-completion會在此目錄中提供所有補全腳本,
如果你還用Homebrew安裝了kubectl,則甚至不必執行上述步驟,因為補全腳本應該已經由kubectl Homebrew公式放置在/usr/local/etc/bash_completion.d目錄中,在這種情況下,kubectl補全應該在安裝bash-completion后自動開始作業,所有方法都是效果都是一致的,
重新加載shell后,kubectl完成就能正常作業!
Zsh
Zsh的補全腳本沒有任何依賴項,所以,你所需要做的是去進行一些設定,以便它能在所有的shell會話中被獲取到,
你可以通過添加以下命令列到你的~/.zshrc檔案中來實作這一效果:
source <(kubectl completion zsh)
如果在重新加載你的shell之后,你獲得了command not found: compdef錯誤,你需要啟動內置的compdef,你可以在將以下行添加到開始的~/.zshrc檔案中:
autoload -Uz compinit
compinit
2、迅速查看資源規范
當你創建YAML資源定義時,你需要知道欄位以及這些資源的意義,API reference中提供了一個查找此類資訊的位置,其中包含所有資源的完整規范:
https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.13/
然而,每次你需要查找某些內容時都要切換到Web瀏覽器,這十分繁瑣,因此,kubectl提供了kubectl explain命令,它能在你的terminal中正確地輸入所有資源規范,
kubectl explain的用法如下:
kubectl explain resource\[.field\]...
該命令輸出所請求資源或欄位的規范,kubectl explain所顯示的資訊與API reference中的資訊相同,默認情況下,kubectl explain僅顯示單個級別的欄位,你可以使用--recursive標志來顯示所有級別的欄位:
kubectl explain deployment.spec --recursive
如果你不確定哪個資源名稱可以用于kubectl explain,你可以使用以下命令查看:
kubectl api-resources
該命令以復數形式顯示資源名稱(如deployments),它同時顯示資源名稱的縮寫(如deploy),無需擔心這些差別,所有名稱變體對于kubectl都是等效的,也就是說,你可以使用它們中的任何一個,
例如,以下命令效果都是一樣的:
kubectl explain deployments.spec
# or
kubectl explain deployment.spec
# or
kubectl explain deploy.spec
3、 使用自定義列輸出格式
kubectl get命令默認的輸出方式如下(該命令用于讀取資源):
kubectl get pods
NAME READY STATUS RESTARTS AGE
engine-544b6b6467-22qr6 1/1 Running 0 78d
engine-544b6b6467-lw5t8 1/1 Running 0 78d
engine-544b6b6467-tvgmg 1/1 Running 0 78d
web-ui-6db964458-8pdw4 1/1 Running 0 78d
這是一種很好的可讀格式,但是它僅包含有限的資訊量,如你所見,每個資源僅顯示了一些欄位,而不是完整的資源定義,此時,自定義列輸出格式應運而生,它使你可以自由定義列和想在其中顯示的資料,你可以選擇資源的任何欄位,使其在輸出中顯示為單獨的列,
自定義列輸出選項的用法如下:
-o custom-columns=<header>:<jsonpath>\[,<header>:<jsonpath>\]...
你必須將每個輸出列定義為<header>:<jsonpath>對:
-
<header>是列的名稱,你可以選擇任何所需的內容, -
<jsonpath>是一個選擇資源欄位的運算式(下面將詳細說明),
讓我們看一個簡單的例子:
kubectl get pods -o custom-columns='NAME:metadata.name'
NAME
engine-544b6b6467-22qr6
engine-544b6b6467-lw5t8
engine-544b6b6467-tvgmg
web-ui-6db964458-8pdw4
在這里,輸出包括顯示所有Pod名稱的一列,
選擇Pod名稱的運算式是meta.name,原因是Pod的名稱是在Pod資源的元資料欄位的name欄位中定義的(你可以在API reference中或使用kubectl explain pod.metadata.name進行查找),
現在,假設你想在輸出中添加一個附加列,例如,顯示每個Pod在其上運行的節點,為此,你只需在自定義列選項中添加適當的列規范即可:
kubectl get pods \
-o custom-columns='NAME:metadata.name,NODE:spec.nodeName'
NAME NODE
engine-544b6b6467-22qr6 ip-10-0-80-67.ec2.internal
engine-544b6b6467-lw5t8 ip-10-0-36-80.ec2.internal
engine-544b6b6467-tvgmg ip-10-0-118-34.ec2.internal
web-ui-6db964458-8pdw4 ip-10-0-118-34.ec2.internal
選擇節點名稱的運算式是spec.nodeName,這是因為已將Pod調度的節點保存在Pod的spec.nodeName欄位中(請參閱kubectl explain pod.spec.nodeName),
請注意,Kubernetes資源欄位區分大小寫,
你可以通過這種方式將資源的任何欄位設定為輸出列,只需瀏覽資源規范并嘗試使用任何你喜歡的欄位即可!
但是首先,讓我們仔細看看這些欄位選擇運算式,
JSONPath 運算式
用于選擇資源欄位的運算式基于JSONPath:
https://goessner.net/articles/JsonPath/index.html
JSONPath是一種用于從JSON檔案提取資料的語言(類似于XPath for XML),選擇單個欄位只是JSONPath的最基本用法,它具有很多功能,例如list selector、filter等,
但是,kubectl explain,僅支持JSONPath功能的子集,以下通過示例用法總結了這些得到支持的功能:
# Select all elements of a list
kubectl get pods -o custom-columns='DATA:spec.containers[*].image'
# Select a specific element of a list
kubectl get pods -o custom-columns='DATA:spec.containers[0].image'
# Select those elements of a list that match a filter expression
kubectl get pods -o custom-columns='DATA:spec.containers[?(@.image!="nginx")].image'
# Select all fields under a specific location, regardless of their name
kubectl get pods -o custom-columns='DATA:metadata.*'
# Select all fields with a specific name, regardless of their location
kubectl get pods -o custom-columns='DATA:..image'
特別重要的是[ ]運算子,Kubernetes資源的許多欄位都是串列,使用此運算子可以選擇這些串列中的專案,它通常與通配符一起用作[*],以選擇串列中的所有專案,
在下面,你將找到一些使用此符號的示例,
示例應用程式
使用自定義列輸出格式有無限可能,因為你可以在輸出中顯示資源的任何欄位或欄位組合,以下是一些示例應用程式,但你可以自己探索并找到對你有用的應用程式,
Tip:如果你經常使用這些命令,則可以為其創建一個shell別名,
顯示Pod的容器鏡像
kubectl get pods \
-o custom-columns='NAME:metadata.name,IMAGES:spec.containers[*].image'
NAME IMAGES
engine-544b6b6467-22qr6 rabbitmq:3.7.8-management,nginx
engine-544b6b6467-lw5t8 rabbitmq:3.7.8-management,nginx
engine-544b6b6467-tvgmg rabbitmq:3.7.8-management,nginx
web-ui-6db964458-8pdw4 wordpress
此命令顯示每個Pod的所有容器鏡像的名稱,
請記住,一個Pod可能包含多個容器,在這種情況下,單個Pod的容器鏡像在同一列中顯示為由逗號分隔的串列,
顯示節點的可用區
kubectl get nodes \
-o custom-columns='NAME:metadata.name,ZONE:metadata.labels.failure-domain\.beta\.kubernetes\.io/zone'
NAME ZONE
ip-10-0-118-34.ec2.internal us-east-1b
ip-10-0-36-80.ec2.internal us-east-1a
ip-10-0-80-67.ec2.internal us-east-1b
如果您的Kubernetes集群部署在公有云基礎架構(例如AWS,Azure或GCP)上,則此命令很有用,它顯示每個節點所在的可用區,
可用區是一個公有云的概念,表示一個地理區域內的復制點,
每個節點的可用區均通過特殊的failure-domain.beta.kubernetes.io/zone 標簽獲得,如果集群在公有云基礎架構上運行,則將自動創建此標簽,并將其值設定為節點的可用性區域的名稱,
標簽不是Kubernetes資源規范的一部分,因此您無法在API reference中找到以上標簽,但是,如果將節點輸出為YAML或JSON,則可以看到它(以及所有其他標簽):
kubectl get nodes -o yaml
# or
kubectl get nodes -o json
除了探索資源規范外,這通常是發現更多有關資源的資訊的好方法,
4、輕松在集群和命名空間之間切換
當kubectl必須向Kubernetes API發出請求時,它將讀取系統上的所謂kubeconfig檔案,以獲取它需要訪問的所有連接引數并向API服務器發出請求,
默認的kubeconfig檔案是?/ .kube / config,該檔案通常是通過某些命令自動創建或更新的(例如,如果使用托管的Kubernetes服務,則為aws eks update-kubeconfig或gcloud container clusters get-credentials),
使用多個集群時,在kubeconfig檔案中配置了多個集群的連接引數,這意味著,你需要一種方法來告訴kubectl要將其連接到哪些集群中,
在集群中,您可以設定多個命名空間(命名空間是物理集群中的一種“虛擬”集群),Kubectl還可確定kubeconfig檔案中用于請求的命名空間,因此,你需要一種方法來告訴kubectl你要使用哪個命名空間,
請注意,您還可以通過在KUBECONFIG環境變數中列出它們,以擁有多個kubeconfig檔案,在這種情況下,所有這些檔案將在執行時合并為一個有效的配置,你還可以為每個kubectl命令使用--kubeconfig選項覆寫默認的kubeconfig檔案,具體請參閱官方檔案:
https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/
Kubeconfig檔案
讓我們看看kubeconfig檔案實際包含什么:

如你所見,kubeconfig檔案由一組背景關系組成,背景關系包含以下三個元素:
-
集群:集群的API server的URL
-
用戶:集群中特定用戶的身份驗證憑據
-
命名空間:連接到集群時要使用的命名空間
實際上,人們通常在其kubeconfig檔案中為每個集群使用單個背景關系,但是,每個集群也可以有多個背景關系,它們的用戶或命名空間不同,但這似乎不太常見,因此集群和背景關系之間通常存在一對一的映射,
在任何給定時間中,這些背景關系其中之一都可以被設定為當前背景關系(通過kubeconfig檔案中的專用欄位):

當kubectl讀取kubeconfig檔案時,它總是使用當前背景關系中的資訊,因此,在上面的示例中,kubectl將連接到Hare集群,
因此,要切換到另一個集群時,你只需在kubeconfig檔案中更改當前背景關系即可:

在上面的示例中,kubectl現在將連接到Fox集群,
并切換到同一集群中的另一個命名空間,可以更改當前背景關系的命名空間元素的值:

在上面的示例中,kubectl現在將在Fox集群中使用Prod命名空間(而不是之前設定的Test命名空間),
請注意,kubectl還提供了—cluster、-user、-namespace和--context選項,無論kubeconfig檔案中設定了什么,它們都可以覆寫單個元素和當前背景關系本身,請參閱kubectl options
從理論上講,你可以通過手動編輯kubeconfig檔案來進行這些更改,但是,這十分繁瑣,以下各節介紹了各種工具,可讓你自動進行這些更改,
Kubectx
Kubectx可以有效幫助集群和命名空間之間進行切換,該工具提供了kubectx和kubens命令,使你可以分別更改當前背景關系和命名空間,
如前所述,如果每個集群只有一個背景關系,則更改當前背景關系意味著更改集群,
在這里,你可以看到這兩個命令的作用:

如上一節所述,這些命令僅需在后臺編輯kubeconfig檔案即可,
要安裝kubectx,只需按照GitHub頁面上的說明進行操作即可:
https://github.com/ahmetb/kubectx/#installation
kubectx和kubens都通過補全腳本提供命令補全功能,這使你可以自動完成背景關系名稱和命名空間的輸入,你也可以在GitHub頁面上找到設定完成的說明:
https://github.com/ahmetb/kubectx/#installation
kubectx的另一個十分有用的功能是互動模式,這與fzf工具(它必須單獨安裝)一起作業(實際上,安裝fzf會自動啟用kubectx互動模式),互動式模式允許你通過互動式模糊搜索界面(由fzf提供)選擇目標背景關系或命名空間,
fzf Github主頁:https://github.com/junegunn/fzf
使用shell別名
實際上,你并不需要單獨的工具來更改當前背景關系和命名空間,因為kubectl也提供了執行此操作的命令,特別是,kubectl config命令提供了用于編輯kubeconfig檔案的子命令,這里是其中的一些:
-
kubectl config get-contexts:列出所有背景關系 -
kubectl config current-context:獲取當前背景關系 -
kubectl config use-context:更改當前背景關系 -
kubectl config set-context:更改背景關系的元素
但是,直接使用這些命令不是很方便,因為它們的鍵入時間很長,但是你可以做的是將它們包裝到可以更容易執行的shell別名中,
我根據這些命令創建了一組別名,這些別名提供了與kubectx類似的功能,在這里,你可以看到它們的作用:

請注意,別名使用fzf提供的互動式模糊搜索界面(例如kubectx的互動式模式),這意味著,你需要安裝fzf才能使用這些別名,
以下是別名的定義:
# Get current context
alias krc='kubectl config current-context'
# List all contexts
alias klc='kubectl config get-contexts -o name | sed "s/^/ /;\\|^ $(krc)$|s/ /*/"'
# Change current context
alias kcc='kubectl config use-context "$(klc | fzf -e | sed "s/^..//")"'
# Get current namespace
alias krn='kubectl config get-contexts --no-headers "$(krc)" | awk "{print \$5}" | sed "s/^$/default/"'
# List all namespaces
alias kln='kubectl get -o name ns | sed "s|^.*/| |;\\|^ $(krn)$|s/ /*/"'
# Change current namespace
alias kcn='kubectl config set-context --current --namespace "$(kln | fzf -e | sed "s/^..//")"'
要安裝這些別名,只需將以上定義添加到?/ .bashrc或?/ .zshrc檔案中,然后重新加載你的shell,
使用插件
Kubectl允許安裝可以像原生命令一樣呼叫的插件,例如,你可以安裝名為kubectl-foo的插件,然后將其作為kubectl foo呼叫,kubectl插件將在本文后面的部分中詳細介紹,
能夠像這樣更改當前背景關系和命名空間不是很好嗎?例如,運行kubectl ctx更改背景關系,運行kubectl ns更改命名空間?
我創建了兩個可以實作這一功能的插件:
-
kubectl-ctx:https://github.com/weibeld/kubectl-ctx
-
kubectl-ns:https://github.com/weibeld/kubectl-ns
在內部,插件建立在上一部分的別名基礎上,
在這里,你可以看到正在使用的插件:

請注意,插件使用fzf提供的互動式模糊搜索界面,這意味著,您需要安裝fzf才能使用這些插件,
要安裝插件,只需將名為kubectl-ctx和kubectl-ns的shell腳本下載到PATH中的任何目錄,并使它們可執行(例如,使用chmod + x),之后,你應該立即可以使用kubectl ctx和kubectl ns,
5、 使用自動生成的別名保存輸入
Shell別名通常是保存輸入內容的好方法,kubectl-aliases專案則是這一想法的具體體現,并為常見的kubectl命令提供了約800個別名:
https://github.com/ahmetb/kubectl-aliases
你可能想知道如何記住800個別名?實際上,你不需要記住它們,因為它們都是根據簡單的方案生成的,如下所示:




如你所見,別名由組件組成,每個組件代表kubectl命令的特定元素,每個別名可以具有一個用于基本命令、操作和資源的組件,以及一個用于選項的多個組件,你只需按照上述方案從左到右“填充”這些組件即可,
請注意,當前詳細的方案位于GitHub頁面上:
https://github.com/ahmetb/kubectl-aliases/blob/master/.kubectl_aliases
在這里您還可以找到別名的完整串列:
https://github.com/ahmetb/kubectl-aliases#syntax-explanation
例如,別名kgpooyamlall代表命令kubectl get pods -o yaml --all-namespaces:
-
k→ kubectl
-
g→ get
-
po→ pods
-
oyaml→ -o yaml
-
all→ --all-namespaces
請注意,大多數選項組件的相對順序無關緊要,因此,kgpooyamlall等同于kgpoalloyaml,
你不需要使用所有組件作為別名,例如,k、kg、klo、ksys或kgpo也是有效的別名,此外,你可以在命令列上將別名與其他單詞組合在一起,
例如,你可以使用k proxy來運行kubectl proxy,或使用kg roles來運行kubectl get roles(當前不存在Roles資源的別名組件),要獲得特定的Pod,你可以使用kgpo my-pod來運行kubectl get pod my-pod,
請注意,某些別名甚至需要在命令列上進一步輸入引數,例如,kgpol別名代表kubectl get pods -l,-l選項需要一個引數(標簽規范),因此,你必須使用此別名,例如:

因此,你只能在別名末尾使用a,f和l組件,
總而言之,一旦掌握了該方案,就可以從要執行的命令中直觀地推斷出別名,并節省大量輸入!
安裝
要安裝kubectl-aliases,只需從GitHub下載.kubectl-aliases檔案,然后將其從?/ .bashrc或?/ .zshrc檔案中獲取即可:
source ~/.kubectl_aliases
重新加載shell后,你應該可以使用所有800個kubectl別名!
補全功能
如你所見,你經常在命令列上將其他單詞附加到別名上,例如:
kgpooyaml test-pod-d4b77b989
如果使用kubectl命令補全功能,則可能習慣于自動完成資源名稱之類的事情,但是當你使用別名時仍然可以這樣做嗎?
這是一個重要的問題,因為如果補全功能無法正常作業,這些別名的某些好處將會被削弱,
那么,這一問題的答案取決于你所使用的shell,
對于Zsh,補全可以立即和別名一起使用,
對于Bash,默認情況下補全功能將不會正常作業,但是它可以通過一些額外的步驟來使其正常運行,
在Bash中同時啟用別名和補全功能
Bash的問題在于,它會在別名名稱上(而不是在別名命令上)嘗試補全(無論何時按Tab鍵),由于你沒有所有800個別名的補全腳本,因此無法使用,
complete-alias專案提供了解決此問題的通用方法(https://github.com/cykerway/complete-alias ),它利用別名的補全機制,在內部將別名擴展為別名命令,并回傳擴展命令的補全建議,這意味著,別名的補全行為與別名命令的行為完全相同,
在下面的內容中,我將首先說明如何安裝complete-alias,然后如何配置它以啟用所有kubectl別名的補全,
安裝complete-alias
首先,complete-alias依賴于bash-completion,因此,在安裝complete-alias之前,你需要確保已安裝bash-completion,前面已經針對Linux和macOS給出了相關說明,
對于macOS用戶的重要說明:與kubectl補全腳本一樣,complete-alias不適用于Bash 3.2,后者是macOS上Bash的默認版本,特別是,complete-alias依賴于bash-completion v2(brew install bash-completion@2),至少需要Bash 4.1,這意味著,要在macOS上使用complete-alias,您需要安裝較新版本的Bash,
要安裝complete-alias,你只需要從GitHub存盤庫(https://github.com/cykerway/complete-alias )下載bash_completion.sh腳本,并將其source到你的?/ .bashrc檔案中:
source ~/bash_completion.sh
重新加載你的shell之后,complete-alias將完成安裝,
為kubectl別名啟用補全功能
從技術上講,complete-alias提供了_complete_alias shell函式,此函式檢查別名,并回傳別名命令的補全建議,
要將其與特定別名聯系起來,你必須使用完整的Bash內置函式將_complete_alias設定為別名的補全功能,
例如,讓我們使用k別名代表kubectl命令,要將_complete_alias設定為該別名的補全功能,你必須執行以下命令:
complete -F _complete_alias k
這樣的效果是,每當你對k別名自動補全時,就會呼叫_complete_alias函式,該函式將檢查別名并回傳kubectl命令的補全建議,
再舉一個例子,讓我們使用代表kubectl get的kg別名:
complete -F _complete_alias kg
同樣,這樣做的效果是,當你對kg自動補全時,你將獲得與kubectl get相同的補全建議,
請注意,可以通過這種方式對系統上的任何別名使用complete-alias,
因此,要為所有kubectl別名啟用補全功能,只需為每個別名運行以上命令,如下所示(假設你將kubectl-aliases安裝到?/ .kubectl-aliases):
for _a in $(sed '/^alias /!d;s/^alias //;s/=.*$//' ~/.kubectl_aliases); do complete -F _complete_alias "$_a"
done
只需將此片段添加到你的?/ .bashrc檔案中,重新加載你的shell,現在你就可以對800個kubectl別名使用補全功能了!
6、使用插件擴展kubectl
從1.12版開始,kubectl包含插件機制,可讓你使用自定義命令擴展kubectl,
這是一個可以作為kubectl hello呼叫的kubectl插件的示例:

如果你對此十分熟悉,其實kubectl插件機制與Git插件機制的設計十分相近,
本節將向您展示如何安裝插件,你可以在其中找到現有插件以及如何創建自己的插件,
安裝插件
Kubectl插件作為簡單的可執行檔案分發,名稱形式為kubectl-x,前綴kubectl-是必填項,其后是允許呼叫插件的新的kubectl子命令,
例如,上面顯示的hello插件將作為名為kubectl-hello的檔案分發,
要安裝插件,你只需要將kubectl-x檔案復制到PATH中的任何目錄并使其可執行(例如,使用chmod + x),之后,你可以立即使用kubectl x呼叫插件,
你可以使用以下命令列出系統上當前安裝的所有插件:
kubectl plugin list
如果你有多個具有相同名稱的插件,或者存在無法執行的插件檔案,此命令還會顯示警告,
使用krew查找和安裝插件
Kubectl插件使自己像軟體包一樣可以共享和重用,但是在哪里可以找到其他人共享的插件?
krew專案旨在為共享、查找、安裝和管理kubectl插件提供統一的解決方案(https://github.com/GoogleContainerTools/krew ),該專案將自己稱為“ kubectl插件的軟體包管理器”(krew與brew十分相似),
Krew根據kubectl插件進行索引,你可以從中選擇和安裝,在這里,你可以看到實際操作:

如你所見,krew本身就是一個kubectl插件,這意味著,安裝krew本質上就像安裝其他任何kubectl插件一樣,你可以在GitHub頁面上找到krew的詳細安裝說明:
https://github.com/GoogleContainerTools/krew/#installation
最重要的krew命令如下:
# Search the krew index (with an optional search query)
kubectl krew search [<query>]
# Display information about a plugin
kubectl krew info <plugin>
# Install a plugin
kubectl krew install <plugin>
# Upgrade all plugins to the newest versions
kubectl krew upgrade
# List all plugins that have been installed with krew
kubectl krew list
# Uninstall a plugin
kubectl krew remove <plugin>
請注意,使用krew安裝插件不會阻止你繼續使用傳統方式安裝插件,即使你使用krew,你仍然可以通過其他方式安裝在其他地方找到的插件(或創建自己的插件),
此外,kubectl krew list命令僅列出已與krew一起安裝的插件,而kubectl plugin list命令列出了所有插件,即,與krew一起安裝的插件和以其他方式安裝的插件,
在其他地方尋找插件
Krew仍然是一個年輕的專案,目前krew索引中只有大約30個插件,如果找不到所需的內容,則可以在其他地方(例如,在GitHub上)查找插件,
我建議你查看kubectl-plugins GitHub主題,你會在這里找到幾十個可用的插件:
https://github.com/topics/kubectl-plugins
創建自己的插件
當然,你也可以創建自己的kubectl插件,這并不困難,
你只需要創建一個執行所需操作的可執行檔案,將其命名為kubectl-x,然后按照如上所述的方式安裝即可,
可執行檔案可以是任何型別,可以是Bash腳本、已編譯的Go程式、Python腳本,這些型別實際上并不重要,唯一的要求是它可以由作業系統直接執行,
讓我們現在創建一個示例插件,在上一節中,你使用了kubectl命令列出每個Pod的容器鏡像,你可以輕松地將此命令轉換為可以使用kubectl img呼叫的插件,
為此,只需創建一個名為kubectl-img的檔案,其內容如下:
#!/bin/bash kubectl get pods -o custom-columns='NAME:metadata.name,IMAGES:spec.containers\[*\].image'
現在,使用chmod + x kubectl-img使該檔案可執行,并將其移動到PATH中的任何目錄,之后,你可以立即將插件與kubectl img一起使用!
如前所述,kubectl插件可以用任何編程或腳本語言撰寫,如果使用Shell腳本,則具有可以輕松從插件呼叫kubectl的優勢,但是,你可以使用真實的編程語言撰寫更復雜的插件,例如,使用Kubernetes客戶端庫,如果使用Go,還可以使用cli-runtime庫,該庫專門用于撰寫kubectl插件,
共享你的插件
如果你認為其中一個插件可能對其他人有用,歡迎在GitHub上共享,只需將其添加到kubectl-plugins主題,其他人就可以方便地找到它,
你還可以將插件添加到krew索引,你可以在krew GitHub存盤庫中找到有關如何執行此操作的說明,
命令補全功能
遺憾的是,目前插件機制尚不支持命令補全,這意味著你需要完整鍵入插件名稱以及插件的所有引數,但是,kubectl GitHub存盤庫中對此有一個開放功能請求,因此,將來有可能實作此功能,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/38914.html
標籤:其他
上一篇:Internet協議
