主頁 >  其他 > 萬字硬核干貨!6大技巧,極速提升kubectl的生產力!

萬字硬核干貨!6大技巧,極速提升kubectl的生產力!

2020-09-14 21:24:28 其他

明晚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如何作業的:

  1. 存盤后端存盤(如,資源)Kubernetes的狀態

  2. API server以Kubernetes API的形式提供到存盤后端的介面

  3. 所有其他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-kubeconfiggcloud 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-ctxkubectl-ns的shell腳本下載到PATH中的任何目錄,并使它們可執行(例如,使用chmod + x),之后,你應該立即可以使用kubectl ctxkubectl 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

你不需要使用所有組件作為別名,例如,kkgkloksyskgpo也是有效的別名,此外,你可以在命令列上將別名與其他單詞組合在一起,

例如,你可以使用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選項需要一個引數(標簽規范),因此,你必須使用此別名,例如:

因此,你只能在別名末尾使用afl組件,

總而言之,一旦掌握了該方案,就可以從要執行的命令中直觀地推斷出別名,并節省大量輸入!

安裝

要安裝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 getkg別名:

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插件的軟體包管理器”(krewbrew十分相似),

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協議

下一篇:k3s原理分析丨如何搞定k3s node注冊失敗問題

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more