自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

一篇帶給你 Kubectl 高效使用技巧

開源
在學(xué)習(xí)如何更高效地使用 kubectl 之前,你應(yīng)該對(duì)它是如何工作的有個(gè)基本的了解。kubectl 是 Kubernetes 集群的控制工具,它可以讓你執(zhí)行所有可能的 Kubernetes 操作。

[[423381]]

在學(xué)習(xí)如何更高效地使用 kubectl 之前,你應(yīng)該對(duì)它是如何工作的有個(gè)基本的了解。kubectl 是 Kubernetes 集群的控制工具,它可以讓你執(zhí)行所有可能的 Kubernetes 操作。

從技術(shù)角度上看,kubectl 是 Kubernetes API 的客戶端,Kubernetes API 是一個(gè) HTTP REST API,這個(gè) API 是真正的 Kubernetes 用戶界面,Kubernetes完全受這個(gè) API 控制,這意味著每個(gè) Kubernetes 操作都作為 API 端點(diǎn)暴露,并且可以由對(duì)此端點(diǎn)的 HTTP 請(qǐng)求執(zhí)行,因此,kubectl 的主要工作是執(zhí)行對(duì) Kubernetes API 的 HTTP 請(qǐng)求:

Kubernetes 是一個(gè)完全以資源為中心的系統(tǒng),Kubernetes 維護(hù)資源的內(nèi)部狀態(tài)并且所有的 Kubernetes 操作都是針對(duì)這些資源的 CRUD(增加、查詢、更新、刪除)操作,你完全可以通過操控這些資源來控制Kubernetes。

比如我們想要?jiǎng)?chuàng)建一個(gè) ReplicaSet 資源,在一個(gè)名為 replicaset.yaml 的文件中定義 ReplicaSet 資源對(duì)象,然后運(yùn)行以下命令:

  1. kubectl create -f replicaset.yaml 

Kubernetes 有一個(gè)創(chuàng)建 ReplicaSet 的操作,并且它和其他所有 Kubernetes 操作一樣,都會(huì)作為 API 端點(diǎn)暴露出去,對(duì)于我們這里的操作而言,該 API 端點(diǎn)如下:

  1. POST /apis/apps/v1/namespaces/{namespace}/replicasets 

當(dāng)我們執(zhí)行上述命令時(shí),kubectl 將向上述 API 端點(diǎn)發(fā)出一個(gè) HTTP POST 請(qǐng)求。ReplicaSet 的資源清單內(nèi)容在請(qǐng)求的 body 中傳遞。這就是 kubectl 與 Kubernetes 集群交互的所有命令的最基本的工作方式,kubectl 只需向?qū)?yīng)的Kubernetes API 端點(diǎn)發(fā)出 HTTP 請(qǐng)求即可。

所以我們完全完全也可以使用 curl、postman 之類的工具來控制 Kubernetes,Kubectl 只是讓我們可以更輕松地訪問 Kubernetes API。

執(zhí)行了上面的資源創(chuàng)建命令之后,API server 將會(huì)在 etcd 保存 ReplicaSet 資源定義。然后會(huì)觸發(fā) controller manager 中的 ReplicaSet controller,后者會(huì)一直watch ReplicaSet 資源的創(chuàng)建、更新和刪除。ReplicaSet controller 為每個(gè) ReplicaSet 副本創(chuàng)建了一個(gè) Pod 定義(根據(jù)在 ReplicaSet 定義中的Pod模板創(chuàng)建)并將它們保存到存儲(chǔ)后端。Pod 創(chuàng)建后會(huì)觸發(fā)了 scheduler,它一直 watch 尚未被分配給 worker 節(jié)點(diǎn)的 Pod。

Scheduler 為每個(gè) Pod 選擇一個(gè)合適的 worker 節(jié)點(diǎn),并在存儲(chǔ)后端中添加該信息到 Pod 定義中。這觸發(fā)了在 Pod 所調(diào)度到的 worker 節(jié)點(diǎn)上的kubelet,它會(huì)監(jiān)視調(diào)度到其 worker 節(jié)點(diǎn)上的 Pod。Kubelet 從存儲(chǔ)后端讀取 Pod 定義并指示容器運(yùn)行時(shí)來運(yùn)行在 worker 節(jié)點(diǎn)上的容器。這樣我們的 ReplicaSet 應(yīng)用程序就運(yùn)行起來了。

熟悉了這些流程概念后會(huì)在很大程度上幫助我們更好地理解 kubectl 并利用它。接下來,我們來看一下具體的技巧,來幫助你提升 kubectl 的生產(chǎn)力。

命令補(bǔ)全

命令補(bǔ)全是提高 kubectl 生產(chǎn)率的最有用但經(jīng)常被忽略的技巧之一。命令補(bǔ)全功能使你可以使用 Tab 鍵自動(dòng)完成 kubectl 命令的各個(gè)部分。這適用于子命令、選項(xiàng)和參數(shù),包括諸如資源名稱之類難以鍵入的內(nèi)容。命令補(bǔ)全可用于 Bash 和 Zsh Shell。

官方文檔 https://kubernetes.io/docs/tasks/tools/#enabling-shell-autocompletion 中其實(shí)就有關(guān)于命令補(bǔ)全的說明。

命令補(bǔ)全是通過補(bǔ)全腳本而起作用的 Shell 功能,補(bǔ)全腳本本質(zhì)上是一個(gè) shell 腳本,它為特定命令定義了補(bǔ)全行為。通過輸入補(bǔ)全腳本可以補(bǔ)全相應(yīng)的命令。Kubectl 可以使用以下命令為 Bash 和 Zsh 自動(dòng)生成并 print out 補(bǔ)全腳本:

  1. kubectl completion bash 
  2. or 
  3. kubectl completion zsh 

理論上,在合適的 shell(Bash或Zsh)中提供此命令的輸出將會(huì)啟用 kubectl 的命令補(bǔ)全功能。在 Bash 和 Zsh 之間存在一些細(xì)微的差別(包括在 Linux 和 macOS 之間也存在差別)。

Bash

Linux

Bash 的補(bǔ)全腳本主要依賴 bash-completion 項(xiàng)目,所以你需要先安裝它。我們可以使用不同的軟件包管理器安裝 bash-completion,如:

  1. # ubuntu 
  2. apt-get install bash-completion 
  3. or centos 
  4. yum install bash-completion 

你可以使用以下命令測(cè)試 bash-completion 是否正確安裝:

  1. type _init_completion 

如果輸出的是 shell 的代碼,那么 bash-completion 就已經(jīng)正確安裝了。如果命令輸出的是 not found 錯(cuò)誤,你必須添加以下命令行到你的 ~/.bashrc 文件:

  1. source /usr/share/bash-completion/bash_completion 

你是否需要添加這一行到你的 ~/.bashrc 文件中,取決于你用于安裝 bash-completion 的軟件包管理器,對(duì)于 APT 來說,這是必要的,對(duì)于 yum 則不是。

bash-completion 安裝完成之后,你需要進(jìn)行一些設(shè)置,以便在所有的 shell 會(huì)話中獲得 kubectl 補(bǔ)全腳本。一種方法是將以下命令行添加到 ~/.bashrc 文件中:

  1. source <(kubectl completion bash) 

另一種是將 kubectl 補(bǔ)充腳本添加到 /etc/bash_completion.d 目錄中(如果不存在,則需要先創(chuàng)建它):

  1. kubectl completion bash  > /etc/bash_completion.d/kubectl 

/etc/bash_completion.d 目錄中的所有補(bǔ)全腳本均由 bash-completion 自動(dòng)提供。

以上兩種方法都是一樣的效果。重新加載 shell 后,kubectl 命令補(bǔ)全就能正常工作了,這個(gè)時(shí)候我們可以使用 tab 來補(bǔ)全信息了。

Mac

使用 macOS 時(shí),會(huì)有些復(fù)雜,因?yàn)槟J(rèn)的 Bash 版本是3.2,而 kubectl 補(bǔ)全腳本至少需要 Bash 4.1,蘋果依舊在 macOS 上默認(rèn)使用過時(shí)的 Bash 版本是因?yàn)楦掳姹镜?Bash 使用的是 GPLv3 license,而蘋果不支持這一 license。

所以要在 macOS 上使用 kubectl 命令補(bǔ)全功能,你必須安裝較新版本的 Bash。我們可以用 Homebrew 安裝/升級(jí):

  1. brew install bash 

重新加載 shell,并驗(yàn)證所需的版本已經(jīng)生效:

  1. echo $BASH_VERSION $SHELL 

在繼續(xù)剩下的步驟之前,確保你現(xiàn)在已經(jīng)在使用 Bash 4.1 或更高的版本(可以使用 bash --version 查看版本)。

同上一部分一樣,Bash 的補(bǔ)全腳本主要依賴 bash-completion 項(xiàng)目,所以你需要先安裝它。我們可以使用 Homebrew 安裝 bash-completion:

  1. brew install bash-completion@2 

@2 代表 bash-completion v2 版本,Kubectl 補(bǔ)全腳本要求 bash-completion v2,而 bash-completion v2 要求至少是Bash 4.1,這就是你不能在低于 4.1 的 Bash 版本上使用 kubectl 補(bǔ)全腳本的原因。

brew intall 命令的輸出包括一個(gè) Caveats 部分,其中的說明將以下行添加 ~/.bash_profile 文件:

  1. export BASH_COMPLETION_COMPAT_DIR=/usr/local/etc/bash_completion.d 
  2. [[ -r "/usr/local/etc/profile.d/bash_completion.sh"  ]]  &&  .  "/usr/local/etc/profile.d/bash_completion.sh" 

必須執(zhí)行此操作才能完成 bash-completion 的安裝,當(dāng)然最好將上面的內(nèi)容添加到 ~/.bashrc 文件中。重新加載 shell 之后,你可以使用以下命令測(cè)試 bash-completion 是否正確安裝:

  1. type _init_completion 

如果輸出為 shell 功能的代碼,意味著一切都設(shè)置完成?,F(xiàn)在,你需要進(jìn)行一些設(shè)置,以便在所有的 shell 會(huì)話中獲得 kubectl 補(bǔ)全腳本。一種方法是將以下命令行添加到 ~/.bashrc 文件中:

  1. source <(kubectl completion bash) 

另一種方法是將 kubectl 補(bǔ)全腳本添加到 /usr/local/etc/bash_completion.d 目錄中:

  1. kubectl completion bash  >/usr/local/etc/bash_completion.d/kubectl 

僅當(dāng)你使用 Homebrew 安裝了 bash-completion 時(shí),此方法才有效。在這種情況下,bash-completion 會(huì)在此目錄中提供所有補(bǔ)全腳本。如果你還用 Homebrew 安裝了kubectl,則甚至不必執(zhí)行上述步驟,因?yàn)檠a(bǔ)全腳本應(yīng)該已經(jīng)由 kubectl Homebrew 放置在 /usr/local/etc/bash_completion.d 目錄中。在這種情況下,kubectl 補(bǔ)全應(yīng)該在安裝 bash-completion 后就可以生效了。

重新加載 shell 后,kubectl 自動(dòng)補(bǔ)全也就生效了。

Zsh

Zsh 的補(bǔ)全腳本沒有任何依賴項(xiàng),所以配置要簡(jiǎn)單很多,我們可以通過添加以下命令到你的 ~/.zshrc 文件中來實(shí)現(xiàn)這一效果:

  1. source <(kubectl completion zsh) 

如果在重新加載你的 shell 之后,你獲得了 command not found: compdef 錯(cuò)誤,你需要啟動(dòng)內(nèi)置的 compdef,你可以在將以下行添加到開始的 ~/.zshrc 文件中:

  1. autoload -Uz compinit 
  2. compinit 

此外我們還可以為 kubectl 定義一個(gè)別名,比如定義成 k:

  1. echo 'alias k=kubectl' >> ~/.zshrc 

如果定義了別名也可以通過擴(kuò)展 shell 補(bǔ)全來兼容該別名:

  1. echo 'complete -F __start_kubectl k' >> ~/.zshrc 

另外還推薦配置 zsh 下面的 zsh-autosuggestions、zsh-syntax-highlighting、kubectl 這幾個(gè)插件,可以自動(dòng)提示之前我們使用過的一些歷史命令,在 ~/.zshrc 中添加插件配置:

  1. plugins=(git zsh-autosuggestions zsh-syntax-highlighting kubectl) 

查看資源規(guī)范

當(dāng)你創(chuàng)建 YAML 資源定義時(shí),你需要知道字段以及這些資源的意義,kubectl 提供了 kubectl explain 命令,它可以在終端中正確地輸入所有資源規(guī)范。

kubectl explain的用法如下:

  1. kubectl explain resource[.field]... 

該命令輸出所請(qǐng)求資源或字段的規(guī)范,默認(rèn)情況下,kubectl explain 僅顯示單個(gè)級(jí)別的字段,你可以使用 --recursive 標(biāo)志來顯示所有級(jí)別的字段:

  1. kubectl explain deployment.spec --recursive 

如果你不確定哪個(gè)資源名稱可以用于 kubectl explain,你可以使用以下命令查看:

  1. kubectl api-resources 

該命令以復(fù)數(shù)形式顯示資源名稱(如 deployments),它同時(shí)顯示資源名稱的縮寫(如 deploy),這些名稱對(duì)于 kubectl 都是等效的,我們可以使用它們中的任何一個(gè)。例如,以下命令效果都是一樣的:

  1. kubectl explain deployments.spec 
  2. or 
  3. kubectl explain deployment.spec 
  4. or 
  5. kubectl explain deploy.spec 

自定義列輸出格式

kubectl get 命令默認(rèn)的輸出方式如下(該命令用于讀取資源):

  1. ➜  ~ kubectl get pods 
  2. NAME                                      READY   STATUS    RESTARTS   AGE 
  3. nfs-client-provisioner-54f4485448-kwr45   1/1     Running   1          67d 
  4. nginx-674ff86d-t6gbd                      1/1     Running   0          67d 

默認(rèn)的輸出格式包含有限的信息,我們可以看到每個(gè)資源僅顯示了一些字段,而不是完整的資源定義。此時(shí),自定義列輸出格式就非常有用了,它使你可以自由定義列和想在其中顯示的數(shù)據(jù),你可以選擇資源的任何字段,使其在輸出中顯示為單獨(dú)的列。自定義列輸出選項(xiàng)的用法如下:

  1. -o custom-columns=<header>:<jsonpath>[,<header>:<jsonpath>]... 

你必須將每個(gè)輸出列定義為 <header>:<jsonpath> 對(duì):

  • <header> 是列的名稱,你可以選擇任何所需的內(nèi)容
  • <jsonpath> 是一個(gè)選擇資源字段的表達(dá)式

 

 

讓我們看一個(gè)簡(jiǎn)單的例子:

  1. ➜  ~ kubectl get pods -o custom-columns='NAME:metadata.name' 
  2. NAME 
  3. nfs-client-provisioner-54f4485448-kwr45 
  4. nginx-674ff86d-t6gbd 

在這里,輸出包括顯示所有 Pod 名稱的一列,選擇 Pod 名稱的表達(dá)式是 meta.name,因?yàn)?Pod 的名稱是在 Pod 資源的 metadata 屬性下面的 name 字段中定義的(我們可以使用 kubectl explain pod.metadata.name 進(jìn)行查找)。

現(xiàn)在,假設(shè)你想在輸出中添加一個(gè)附加列,比如顯示每個(gè) Pod 在其上運(yùn)行的節(jié)點(diǎn),那么我們只需在自定義列選項(xiàng)中添加適當(dāng)?shù)牧幸?guī)范即可:

  1. ➜  ~ kubectl get pods -o custom-columns='NAME:metadata.name,NODE:spec.nodeName' 
  2. NAME                                      NODE 
  3. nfs-client-provisioner-54f4485448-kwr45   172.27.0.2 
  4. nginx-674ff86d-t6gbd                      172.27.0.2 

選擇節(jié)點(diǎn)名稱的表達(dá)式是 spec.nodeName,這是因?yàn)橐褜?Pod 調(diào)度的節(jié)點(diǎn)保存在 Pod 的 spec.nodeName 字段中了。不過需要請(qǐng)注意的是 Kubernetes 資源字段是區(qū)分大小寫的。

我們可以通過這種方式將資源的任何字段設(shè)置為輸出列,只需瀏覽資源規(guī)范并嘗試使用任何你喜歡的字段即可。當(dāng)然我們需要對(duì)字段選擇的 JSONPath 表達(dá)式要有一定的了解。

JSONPath 表達(dá)式

用于選擇資源字段的表達(dá)式基于 JSONPath 的。JSONPath 是一種用于從 JSON 文檔提取數(shù)據(jù)的語(yǔ)言(類似于 XPath for XML),選擇單個(gè)字段只是 JSONPath 的最基本用法,它還有很多其他功能,例如 list selector、filter 等。

但是,kubectl explain 僅支持 JSONPath 功能的子集,下面我們通過一些示例用法來總結(jié)下這些使用規(guī)則:

選擇一個(gè)列表的所有元素

  1. # 獲取Pod下面的所有容器鏡像 
  2. ➜  ~ kubectl get pods -o custom-columns='IMAGES:spec.containers[*].image' 
  3. IMAGES 
  4. cnych/nfs-subdir-external-provisioner:v4.0.2 
  5. nginx:latest 

選擇一個(gè)列表的指定元素

  1. # 獲取Pod下面第一個(gè)容器的鏡像 
  2. ➜  ~ kubectl get pods -o custom-columns='IMAGE:spec.containers[0].image' 
  3. IMAGE 
  4. cnych/nfs-subdir-external-provisioner:v4.0.2 
  5. nginx:latest 

選擇匹配過濾表達(dá)式的列表元素

  1. ➜  ~ kubectl get pods -o custom-columns='DATA:spec.containers[?(@.image!="nginx:latest")].image' 
  2. DATA 
  3. cnych/nfs-subdir-external-provisioner:v4.0.2 
  4. <none> 

選擇指定位置下的所有字段

  1. ➜  ~ kubectl get pods -o custom-columns='DATA:metadata.*' 
  2. DATA 
  3. default,[map[apiVersion:apps/v1 blockOwnerDeletion:true controller:true kind:ReplicaSet name:nfs-client-provisioner-54f4485448 uid:39912344-d707-4029-8da8-5269cfcae9e9]],4926994155,map[app:nfs-client-provisioner pod-template-hash:54f4485448],2021-07-06T04:08:48Z,nfs-client-provisioner-54f4485448-,[map[apiVersion:v1 fieldsType:FieldsV1 fieldsV1:map[f:metadata:map[f:generateName:map[] f:labels:map[.:map[] f:app:map[] f:pod-template-hash:map[]] f:ownerReferences:map[.:map[] k:{"uid":"39912344-d707-4029-8da8-5269cfcae9e9"}:map[.:map[] f:apiVersion:map[] f:blockOwnerDeletion:map[] f:controller:map[] f:kind:map[] f:name:map[] f:uid:map[]]]] f:spec:map[f:containers:map[k:{"name":"nfs-client-provisioner"}:map[.:map[] f:env:map[.:map[] k:{"name":"NFS_PATH"}:map[.:map[] f:name:map[] f:value:map[]] k:{"name":"NFS_SERVER"}:map[.:map[] f:name:map[] f:value:map[]] k:{"name":"PROVISIONER_NAME"}:map[.:map[] f:name:map[] f:value:map[]]] f:image:map[] f:imagePullPolicy:map[] f:name:map[] f:resources:map[] f:terminationMessagePath:map[] f:terminationMessagePolicy:map[] f:volumeMounts:map[.:map[] k:{"mountPath":"/persistentvolumes"}:map[.:map[] f:mountPath:map[] f:name:map[]]]]] f:dnsPolicy:map[] f:enableServiceLinks:map[] f:restartPolicy:map[] f:schedulerName:map[] f:securityContext:map[] f:serviceAccount:map[] f:serviceAccountName:map[] f:terminationGracePeriodSeconds:map[] f:volumes:map[.:map[] k:{"name":"nfs-client-root"}:map[.:map[] f:name:map[] f:nfs:map[.:map[] f:path:map[] f:server:map[]]]]]] manager:kube-controller-manager operation:Update time:2021-07-06T04:08:48Z] map[apiVersion:v1 fieldsType:FieldsV1 fieldsV1:map[f:status:map[f:conditions:map[.:map[] k:{"type":"PodScheduled"}:map[.:map[] f:lastProbeTime:map[] f:lastTransitionTime:map[] f:message:map[] f:reason:map[] f:status:map[] f:type:map[]]]]] manager:kube-scheduler operation:Update time:2021-07-06T04:08:49Z] map[apiVersion:v1 fieldsType:FieldsV1 fieldsV1:map[f:metadata:map[f:annotations:map[.:map[] f:tke.cloud.tencent.com/networks-status:map[]]]] manager:multus operation:Update time:2021-07-06T04:09:24Z] map[apiVersion:v1 fieldsType:FieldsV1 fieldsV1:map[f:status:map[f:conditions:map[k:{"type":"ContainersReady"}:map[.:map[] f:lastProbeTime:map[] f:lastTransitionTime:map[] f:status:map[] f:type:map[]] k:{"type":"Initialized"}:map[.:map[] f:lastProbeTime:map[] f:lastTransitionTime:map[] f:status:map[] f:type:map[]] k:{"type":"Ready"}:map[.:map[] f:lastProbeTime:map[] f:lastTransitionTime:map[] f:status:map[] f:type:map[]]] f:containerStatuses:map[] f:hostIP:map[] f:phase:map[] f:podIP:map[] f:podIPs:map[.:map[] k:{"ip":"172.16.0.87"}:map[.:map[] f:ip:map[]]] f:startTime:map[]]] manager:kubelet operation:Update time:2021-08-02T23:00:33Z]],nfs-client-provisioner-54f4485448-kwr45,/api/v1/namespaces/default/pods/nfs-client-provisioner-54f4485448-kwr45,9c445349-42ce-4e38-b20a-41bb47587d7e,map[tke.cloud.tencent.com/networks-status:[{ 
  4.     "name""tke-bridge"
  5.     "ips": [ 
  6.         "172.16.0.87" 
  7.     ], 
  8.     "default"true
  9.     "dns": {} 
  10. }]] 
  11. ...... 

選擇所有具有指定名稱的字段,無(wú)論其位置如何

  1. ➜  ~ kubectl get pods -o custom-columns='IMAGE:..image' 
  2. IMAGE 
  3. cnych/nfs-subdir-external-provisioner:v4.0.2,cnych/nfs-subdir-external-provisioner:v4.0.2 
  4. nginx:latest,nginx:latest 

其中的 [ ] 運(yùn)算符特別重要,Kubernetes 資源的許多字段都是列表,使用此運(yùn)算符可以選擇這些列表中的某一些元素,它通常與通配符一起使用 [*],以選擇列表中的所有項(xiàng)目。

示例應(yīng)用程序

使用自定義列輸出格式有無(wú)限可能,因?yàn)槟憧梢栽谳敵鲋酗@示資源的任何字段或字段組合。以下是一些示例應(yīng)用程序,但你可以自己探索并找到對(duì)你有用的應(yīng)用程序。

提示:如果你經(jīng)常使用這些命令,則可以為其創(chuàng)建一個(gè) shell 別名。

顯示 Pod 的容器鏡像

  1. ➜  ~ kubectl get pods -o custom-columns='NAME:metadata.name,IMAGES:spec.containers[*].image' 
  2. NAME                                      IMAGES 
  3. nfs-client-provisioner-54f4485448-kwr45   cnych/nfs-subdir-external-provisioner:v4.0.2 
  4. nginx                                     nginx 
  5. nginx-674ff86d-t6gbd                      nginx:latest 

此命令顯示每個(gè) Pod 的所有容器鏡像的名稱。因?yàn)橐粋€(gè) Pod 可能包含多個(gè)容器。在這種情況下,單個(gè) Pod 的容器鏡像在同一列中顯示為由逗號(hào)分隔的列表。

顯示節(jié)點(diǎn)的可用區(qū)

  1. ➜  ~ kubectl get nodes \ 
  2.   -o custom-columns='NAME:metadata.name,ZONE:metadata.labels.failure-domain\.beta\.kubernetes\.io/zone' 
  3. NAME         ZONE 
  4. 172.27.0.2   160001 

如果你的 Kubernetes 集群部署在公有云上,則此命令很有用,它顯示每個(gè)節(jié)點(diǎn)所在的可用區(qū)。每個(gè)節(jié)點(diǎn)的可用區(qū)均通過特殊的 failure-domain.beta.kubernetes.io/zone 標(biāo)簽獲得,如果集群在公有云基礎(chǔ)架構(gòu)上運(yùn)行,則將自動(dòng)創(chuàng)建此標(biāo)簽,并將其值設(shè)置為節(jié)點(diǎn)的可用性區(qū)域的名稱。

標(biāo)簽不是 Kubernetes 資源規(guī)范的一部分,但是,如果將節(jié)點(diǎn)輸出為 YAML 或 JSON,則可以看到它的相關(guān)信息:

  1. kubectl get nodes -o yaml 
  2. or 
  3. kubectl get nodes -o json 

多集群和命名空間切換

當(dāng) kubectl 向 Kubernetes API 發(fā)出請(qǐng)求時(shí),它將讀取 kubeconfig 文件,以獲取它需要訪問的所有連接參數(shù)并向 APIServer 發(fā)出請(qǐng)求。默認(rèn)的 kubeconfig 文件是 ~/.kube/config,在使用多個(gè)集群時(shí),在 kubeconfig 文件中配置了多個(gè)集群的連接參數(shù),所以我們需要一種方法來告訴 kubectl 要將其連接到哪個(gè)集群中。在集群中,我們可以設(shè)置多個(gè)命名空間,Kubectl 還可確定 kubeconfig 文件中用于請(qǐng)求的命名空間,所以同樣我們需要一種方法來告訴 kubectl 要使用哪個(gè)命名空間。

此外我們還可以通過在 KUBECONFIG 環(huán)境變量來設(shè)置它們,還可以為每個(gè) kubectl 命令使用 --kubeconfig 選項(xiàng)覆蓋默認(rèn)的 kubeconfig 文件。

kubeconfig

kubeconfig 文件由一組上下文組成,上下文包含以下三個(gè)元素:

  • Cluster:集群的 API server 地址
  • User:集群中特定用戶的身份驗(yàn)證憑據(jù)
  • Namespace:連接到集群時(shí)要使用的命名空間

通常大部分用戶在其 kubeconfig 文件中為每個(gè)集群使用單個(gè)上下文,但是,每個(gè)集群也可以有多個(gè)上下文,它們的用戶或命名空間不同,但并不太常見,因此集群和上下文之間通常存在一對(duì)一的映射。

在任何指定時(shí)間,這些上下文其中之一都可以被設(shè)置為當(dāng)前上下文:

當(dāng) kubectl 讀取 kubeconfig 文件時(shí),它總是使用當(dāng)前上下文中的信息,所以在上面的示例中,kubectl 將連接到 Hare 集群。因此,要切換到另一個(gè)集群時(shí),你只需在 kubeconfig 文件中更改當(dāng)前上下文即可:

這樣 kubectl 現(xiàn)在將連接到 Fox 集群,并切換到同一集群中的另一個(gè)命名空間,可以更改當(dāng)前上下文的命名空間元素的值:

在上面的示例中,kubectl 現(xiàn)在將在 Fox 集群中使用 Prod 命名空間,而不是之前設(shè)置的 Test 命名空間了。理論上講,我們可以通過手動(dòng)編輯 kubeconfig 文件來進(jìn)行這些更改,kubectl config 也命令提供了用于編輯 kubeconfig 文件的子命令:

  • kubectl config get-contexts:列出所有上下文
  • kubectl config current-context:獲取當(dāng)前上下文
  • kubectl config use-context:更改當(dāng)前上下文
  • kubectl config set-context:更改上下文的元素

比如現(xiàn)在我有兩個(gè) kubeconfig 文件,分別連接兩個(gè)集群,現(xiàn)在我們可以使用下面的命令來合并兩個(gè) kubeconfig 文件:

  1. ➜  ~ cp $HOME/.kube/config $HOME/.kube/config.backup.$(date +%Y-%m-%d.%H:%M:%S) 
  2. KUBECONFIG=$HOME/.kube/config:$HOME/.kube/ydzs-config kubectl config view --merge --flatten > $HOME/.kube/merged_kubeconfig && mv $HOME/.kube/merged_kubeconfig $HOME/.kube/config 
  3. ➜  ~ kubectl config get-contexts 
  4. CURRENT   NAME                           CLUSTER   AUTHINFO           NAMESPACE 
  5.           cls-9kl736yn-context-default   tke       admin 
  6. *         kubernetes-admin@kubernetes    local     kubernetes-admin   default 

通過上面的命令可以將兩個(gè) kubeconfig 合并到一起,我們可以看到現(xiàn)在有兩個(gè)集群和兩個(gè)上下文,在操作資源對(duì)象的時(shí)候可以通過使用參數(shù) --context 來指定操作的集群:

  1. ➜  ~ kubectl get pods --context=cls-9kl736yn-context-default 
  2. NAME                                      READY   STATUS    RESTARTS   AGE 
  3. nfs-client-provisioner-54f4485448-kwr45   1/1     Running   1          67d 
  4. nginx-674ff86d-t6gbd                      1/1     Running   0          67d 
  5. ➜  ~ kubectl get pods --context=kubernetes-admin@kubernetes 
  6. NAME                                      READY   STATUS    RESTARTS   AGE 
  7. nginx                                     1/1     Running   0          26d 

我們可以看到操作的時(shí)候是非常繁瑣的,下面我們使用其他的工具來幫助我們自動(dòng)進(jìn)行這些更改。

Kubectx

Kubectx 可以有效幫助我們?cè)诩汉兔臻g之間進(jìn)行切換,該工具提供了 kubectx 和 kubens 命令,使我們可以分別更改當(dāng)前上下文和命名空間。如果每個(gè)集群只有一個(gè)上下文,則更改當(dāng)前上下文意味著更改集群。

如果我們已經(jīng)安裝過 kubectl 插件管理工具 Krew,則直接使用下面的命令來安裝 Kubectx 插件即可:

  1. kubectl krew install ctx 
  2. kubectl krew install ns 

安裝完成后,可以使用 kubectl ctx 和 kubectl ns 命令進(jìn)行操作。但是需要注意這種方式不會(huì)安裝 shell 自動(dòng)補(bǔ)全腳本,如果需要,可以使用另外的方式進(jìn)行安裝,比如 macOS 下面使用 Homebrew 進(jìn)行安裝:

  1. brew install kubectx 

此安裝命令將自動(dòng)設(shè)置 bash/zsh/fish 自動(dòng)補(bǔ)全腳本,由于經(jīng)常需要切換不同的集群,很可能會(huì)誤操作集群,這個(gè)時(shí)候有個(gè)提示就很棒了,我們可以使用 kube-ps1 工具來修改 PS1。

不過由于我這里本地使用的是 oh-my-zsh,所以可以不用安裝,直接在 ~/.zshrc 開啟 plugin 加上 kube-ps1 就可以了,然后自定義一下,重新 source 下即可:

  1. PROMPT='$(kube_ps1)'$PROMPT 
  2. KUBE_PS1_PREFIX="" 
  3. KUBE_PS1_SYMBOL_DEFAULT="" 
  4. KUBE_PS1_DIVIDER="-" 
  5. KUBE_PS1_SUFFIX=" " 

現(xiàn)在我們只需要輸入 kubectx 命令就可以切換集群了:

由于我們配置了 kube-ps1,所以在操作的終端前面也直接顯示了當(dāng)前操作的集群,防止操作集群錯(cuò)誤。

kubectx 的另一個(gè)十分有用的功能是交互模式,這需要與 fzf 工具一起工作(安裝 fzf 會(huì)自動(dòng)啟用kubectx交互模式)。交互式模式允許你通過交互式模糊搜索界面選擇目標(biāo)上下文或命名空間。

kubectl 插件

從1.12版開始,kubectl 就提供了插件機(jī)制,可讓你使用自定義命令擴(kuò)展 kubectl,Kubectl 插件作為簡(jiǎn)單的可執(zhí)行文件分發(fā),名稱形式為 kubectl-x,前綴 kubectl- 是必填項(xiàng),其后是允許調(diào)用插件的新的 kubectl 子命令。

要安裝插件,你只需要將 kubectl-x 文件復(fù)制到 PATH 中的任何目錄并使其可執(zhí)行,之后,你可以立即使用 kubectl x 調(diào)用插件。你可以使用以下命令列出系統(tǒng)上當(dāng)前安裝的所有插件:

  1. kubectl plugin list 

Kubectl 插件可以像軟件包一樣共享和重用,但是在哪里可以找到其他人共享的插件?Krew 項(xiàng)目旨在為共享、查找、安裝和管理 kubectl 插件提供統(tǒng)一的解決方案。Krew 根據(jù) kubectl 插件進(jìn)行索引,你可以從中選擇和安裝。當(dāng)然 krew 本身就是一個(gè) kubectl 插件,這意味著,安裝 krew 本質(zhì)上就像安裝其他任何 kubectl 插件一樣。你可以在GitHub頁(yè)面上找到krew的詳細(xì)安裝說明:https://github.com/kubernetes-sigs/krew。

下面是一些重要的 krew 命令:

  1. # Search the krew index (with an optional search query) 
  2. kubectl krew search [<query>] 
  3.  
  4. # Display information about a plugin 
  5. kubectl krew info <plugin> 
  6.  
  7. # Install a plugin 
  8. kubectl krew install <plugin> 
  9.  
  10. # Upgrade all plugins to the newest versions 
  11. kubectl krew upgrade 
  12.  
  13. # List all plugins that have been installed with krew 
  14. kubectl krew list 
  15.  
  16. # Uninstall a plugin 
  17. kubectl krew remove <plugin> 

需要注意 kubectl krew list 命令僅列出已與 krew 一起安裝的插件,而 kubectl plugin list 命令列出了所有插件,即與 krew 一起安裝的插件和以其他方式安裝的插件。

創(chuàng)建插件

我們也可以很方便創(chuàng)建自己的 kubectl 插件,只需要?jiǎng)?chuàng)建一個(gè)執(zhí)行所需操作的可執(zhí)行文件,將其命名為 kubectl-x,然后按照如上所述的方式安裝即可??蓤?zhí)行文件可以是任何類型,可以是 Bash 腳本、已編譯的 Go 程序、Python 腳本,這些類型實(shí)際上并不重要。唯一的要求是它可以由操作系統(tǒng)直接執(zhí)行。

讓我們現(xiàn)在創(chuàng)建一個(gè)示例插件。前面我們使用 kubectl 命令列出每個(gè) Pod 的容器鏡像,我們可以輕松地將此命令轉(zhuǎn)換為可以使用 kubectl img 調(diào)用的插件。只需創(chuàng)建一個(gè)名為 kubectl-img 的文件,其內(nèi)容如下:

  1. #!/bin/bash 
  2. kubectl get pods -o custom-columns='NAME:metadata.name,IMAGES:spec.containers[*].image' 

現(xiàn)在,使用 chmod + x kubectl-img 使該文件可執(zhí)行,并將其移動(dòng)到 PATH 中的任何目錄,之后,你可以立即將插件與 kubectl img 一起使用了:

  1. ➜  ~ kubectl img 
  2. NAME                                      IMAGES 
  3. nfs-client-provisioner-54f4485448-kwr45   cnych/nfs-subdir-external-provisioner:v4.0.2 
  4. nginx-674ff86d-t6gbd                      nginx:latest 

kubectl 插件可以用任何編程或腳本語(yǔ)言編寫,如果使用 Shell 腳本,則具有可以輕松從插件調(diào)用 kubectl 的優(yōu)勢(shì)。但是,你可以使用真實(shí)的編程語(yǔ)言編寫更復(fù)雜的插件,例如使用 Kubernetes 客戶端庫(kù),如果使用 Go,還可以使用 cli-runtime 庫(kù),該庫(kù)專門用于編寫 kubectl 插件。 

 

責(zé)任編輯:姜華 來源: k8s技術(shù)圈
相關(guān)推薦

2023-03-29 07:45:58

VS編輯區(qū)編程工具

2020-12-21 08:10:01

Kubernetes實(shí)用技巧kubectl

2021-07-12 06:11:14

SkyWalking 儀表板UI篇

2024-04-19 08:30:27

BitmapRedis數(shù)據(jù)處理

2022-11-24 06:58:44

Ansible

2022-03-02 08:52:49

PostmangRPCAPI調(diào)試

2022-08-04 08:17:27

React高階組件

2021-01-26 06:58:03

AnsibleCeph集群運(yùn)維

2022-02-25 15:50:05

OpenHarmonToggle組件鴻蒙

2021-04-14 07:55:45

Swift 協(xié)議Protocol

2021-04-23 08:59:35

ClickHouse集群搭建數(shù)據(jù)庫(kù)

2021-07-08 07:30:13

Webpack 前端Tree shakin

2023-03-13 09:31:04

2021-10-28 08:51:53

GPIO軟件框架 Linux

2021-05-08 08:36:40

ObjectString前端

2021-07-21 09:48:20

etcd-wal模塊解析數(shù)據(jù)庫(kù)

2021-04-08 11:00:56

CountDownLaJava進(jìn)階開發(fā)

2021-06-21 14:36:46

Vite 前端工程化工具

2021-01-28 08:55:48

Elasticsear數(shù)據(jù)庫(kù)數(shù)據(jù)存儲(chǔ)

2021-04-01 10:51:55

MySQL鎖機(jī)制數(shù)據(jù)庫(kù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)