精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

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

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

[[423381]]

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

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

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

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

  1. kubectl create -f replicaset.yaml 

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

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

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

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

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

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

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

命令補(bǔ)全

命令補(bǔ)全是提高 kubectl 生產(chǎn)率的最有用但經(jīng)常被忽略的技巧之一。命令補(bǔ)全功能使你可以使用 Tab 鍵自動完成 kubectl 命令的各個部分。這適用于子命令、選項(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ì)上是一個 shell 腳本,它為特定命令定義了補(bǔ)全行為。通過輸入補(bǔ)全腳本可以補(bǔ)全相應(yīng)的命令。Kubectl 可以使用以下命令為 Bash 和 Zsh 自動生成并 print out 補(bǔ)全腳本:

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

理論上,在合適的 shell(Bash或Zsh)中提供此命令的輸出將會啟用 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 

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

  1. type _init_completion 

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

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

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

bash-completion 安裝完成之后,你需要進(jìn)行一些設(shè)置,以便在所有的 shell 會話中獲得 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 自動提供。

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

Mac

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

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

  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 命令的輸出包括一個 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 之后,你可以使用以下命令測試 bash-completion 是否正確安裝:

  1. type _init_completion 

如果輸出為 shell 功能的代碼,意味著一切都設(shè)置完成。現(xiàn)在,你需要進(jìn)行一些設(shè)置,以便在所有的 shell 會話中獲得 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 時,此方法才有效。在這種情況下,bash-completion 會在此目錄中提供所有補(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 自動補(bǔ)全也就生效了。

Zsh

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

  1. source <(kubectl completion zsh) 

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

  1. autoload -Uz compinit 
  2. compinit 

此外我們還可以為 kubectl 定義一個別名,比如定義成 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 這幾個插件,可以自動提示之前我們使用過的一些歷史命令,在 ~/.zshrc 中添加插件配置:

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

查看資源規(guī)范

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

kubectl explain的用法如下:

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

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

  1. kubectl explain deployment.spec --recursive 

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

  1. kubectl api-resources 

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

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

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

你必須將每個輸出列定義為 <header>:<jsonpath> 對:

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

 

 

讓我們看一個簡單的例子:

  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è)你想在輸出中添加一個附加列,比如顯示每個 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 字段中了。不過需要請注意的是 Kubernetes 資源字段是區(qū)分大小寫的。

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

JSONPath 表達(dá)式

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

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

選擇一個列表的所有元素

  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 

選擇一個列表的指定元素

  1. # 獲取Pod下面第一個容器的鏡像 
  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. ...... 

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

  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)用程序

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

提示:如果你經(jīng)常使用這些命令,則可以為其創(chuàng)建一個 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 

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

顯示節(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 集群部署在公有云上,則此命令很有用,它顯示每個節(jié)點(diǎn)所在的可用區(qū)。每個節(jié)點(diǎn)的可用區(qū)均通過特殊的 failure-domain.beta.kubernetes.io/zone 標(biāo)簽獲得,如果集群在公有云基礎(chǔ)架構(gòu)上運(yùn)行,則將自動創(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ā)出請求時,它將讀取 kubeconfig 文件,以獲取它需要訪問的所有連接參數(shù)并向 APIServer 發(fā)出請求。默認(rèn)的 kubeconfig 文件是 ~/.kube/config,在使用多個集群時,在 kubeconfig 文件中配置了多個集群的連接參數(shù),所以我們需要一種方法來告訴 kubectl 要將其連接到哪個集群中。在集群中,我們可以設(shè)置多個命名空間,Kubectl 還可確定 kubeconfig 文件中用于請求的命名空間,所以同樣我們需要一種方法來告訴 kubectl 要使用哪個命名空間。

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

kubeconfig

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

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

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

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

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

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

在上面的示例中,kubectl 現(xiàn)在將在 Fox 集群中使用 Prod 命名空間,而不是之前設(shè)置的 Test 命名空間了。理論上講,我們可以通過手動編輯 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)在我有兩個 kubeconfig 文件,分別連接兩個集群,現(xiàn)在我們可以使用下面的命令來合并兩個 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 

通過上面的命令可以將兩個 kubeconfig 合并到一起,我們可以看到現(xiàn)在有兩個集群和兩個上下文,在操作資源對象的時候可以通過使用參數(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 

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

Kubectx

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

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

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

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

  1. brew install kubectx 

此安裝命令將自動設(shè)置 bash/zsh/fish 自動補(bǔ)全腳本,由于經(jīng)常需要切換不同的集群,很可能會誤操作集群,這個時候有個提示就很棒了,我們可以使用 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)前操作的集群,防止操作集群錯誤。

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

kubectl 插件

從1.12版開始,kubectl 就提供了插件機(jī)制,可讓你使用自定義命令擴(kuò)展 kubectl,Kubectl 插件作為簡單的可執(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 本身就是一個 kubectl 插件,這意味著,安裝 krew 本質(zhì)上就像安裝其他任何 kubectl 插件一樣。你可以在GitHub頁面上找到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 插件,只需要創(chuàng)建一個執(zhí)行所需操作的可執(zhí)行文件,將其命名為 kubectl-x,然后按照如上所述的方式安裝即可。可執(zhí)行文件可以是任何類型,可以是 Bash 腳本、已編譯的 Go 程序、Python 腳本,這些類型實(shí)際上并不重要。唯一的要求是它可以由操作系統(tǒng)直接執(zhí)行。

讓我們現(xiàn)在創(chuàng)建一個示例插件。前面我們使用 kubectl 命令列出每個 Pod 的容器鏡像,我們可以輕松地將此命令轉(zhuǎn)換為可以使用 kubectl img 調(diào)用的插件。只需創(chuàng)建一個名為 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í)行,并將其移動到 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 插件可以用任何編程或腳本語言編寫,如果使用 Shell 腳本,則具有可以輕松從插件調(diào)用 kubectl 的優(yōu)勢。但是,你可以使用真實(shí)的編程語言編寫更復(fù)雜的插件,例如使用 Kubernetes 客戶端庫,如果使用 Go,還可以使用 cli-runtime 庫,該庫專門用于編寫 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ù)處理

2021-01-26 06:58:03

AnsibleCeph集群運(yùn)維

2022-03-02 08:52:49

PostmangRPCAPI調(diào)試

2022-08-04 08:17:27

React高階組件

2022-11-24 06:58:44

Ansible

2022-04-29 14:38:49

class文件結(jié)構(gòu)分析

2021-07-21 09:48:20

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

2021-03-12 09:21:31

MySQL數(shù)據(jù)庫邏輯架構(gòu)

2021-04-14 14:16:58

HttpHttp協(xié)議網(wǎng)絡(luò)協(xié)議

2024-06-13 08:34:48

2022-02-17 08:53:38

ElasticSea集群部署

2021-06-21 14:36:46

Vite 前端工程化工具

2022-03-22 09:09:17

HookReact前端

2021-04-01 10:51:55

MySQL鎖機(jī)制數(shù)據(jù)庫

2021-04-08 11:00:56

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

2021-01-28 08:55:48

Elasticsear數(shù)據(jù)庫數(shù)據(jù)存儲

2021-07-08 07:30:13

Webpack 前端Tree shakin
點(diǎn)贊
收藏

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

人人视频精品| 国产精品第一页在线观看| 中文字幕资源网在线观看| 欧美黄色aaaa| 欧美日韩精品电影| 麻豆av一区二区| 精品无码免费视频| 国产日韩电影| 国产一区二区伦理| 神马久久久久久| 国产成人久久777777| 天天舔天天干天天操| 亚洲色图插插| 欧美日韩国产影片| 日韩精品久久一区| 福利网址在线观看| 蜜臀91精品国产高清在线观看| 亚洲va欧美va国产va天堂影院| 99久热re在线精品996热视频| 一区二区三区免费在线观看视频| 毛片激情在线观看| 亚洲三级视频| 亚洲激情 国产| 伊人久久大香线蕉午夜av| 日韩欧美国产另类| eeuss国产一区二区三区四区| 一区二区免费看| 91嫩草在线| 青青草原国产视频| 久久电影天堂| 亚洲少妇30p| 亚洲aⅴ男人的天堂在线观看| 偷拍夫妻性生活| 羞羞影院欧美| 国产精品美女久久久久久久久| 97视频com| 国产精品无码自拍| xxx.xxx欧美| 91色视频在线| 欧美激情女人20p| 日韩成人av免费| 伊人影院在线视频| 久久精品久久综合| 九九热精品视频| 亚洲欧美日韩色| 色图在线观看| 91在线精品一区二区| 91成品人片a无限观看| 国产调教打屁股xxxx网站| 在线播放毛片| 国产在线观看免费一区| 久久久久久网址| 国产成人av一区二区三区不卡| 不卡视频观看| 国产精品视频yy9299一区| 成人午夜两性视频| 日韩高清精品免费观看| 国产又黄又猛又粗又爽的视频| jizz国产免费| 国产成人短视频在线观看| 欧美午夜女人视频在线| 一本一道久久a久久综合精品| 精品人妻午夜一区二区三区四区 | 国产精品一区二区三区在线| 日韩欧美三级视频| 99视频精品全国免费| 欧美色视频一区| 性欧美大战久久久久久久免费观看| 精品国产xxx| 中文视频一区| 亚洲欧美中文字幕| 麻豆精品国产传媒| 国产美女福利在线观看| 懂色av一区二区三区免费观看| 国产成人极品视频| 久久久久久久伊人| 国产精品成人a在线观看| 亚洲国产精品久久91精品| 色婷婷综合网站| 蜜桃视频网站在线观看| 国产一区 二区 三区一级| 欧洲成人免费aa| 亚洲一级片在线播放| 精品综合久久88少妇激情| 欧美日韩性生活视频| 色乱码一区二区三区熟女| 国产超碰人人模人人爽人人添| 久久精品五月| 午夜精品久久久久久久99热浪潮| 黑人巨大精品欧美| 99精品中文字幕在线不卡| 欧美人狂配大交3d怪物一区| 少妇久久久久久被弄到高潮| 五月婷婷在线观看| 99久久精品免费看国产| 国产精品美女免费看| 午夜毛片在线观看| 欧美色女视频| 亚洲香蕉av在线一区二区三区| 无码国产69精品久久久久网站| 免费观看一级欧美片| 亚洲午夜久久久久中文字幕久| 欧美日韩精品久久| 日本韩国精品一区二区| jizz一区二区| 国产日韩在线精品av| 精品无码m3u8在线观看| 国产一区二区三区不卡视频网站| 日韩欧美中文一区| 久久精品国产99久久99久久久| 色资源二区在线视频| 亚洲h在线观看| 欧美精品久久久久久久久久久| 特级毛片在线| 中文字幕亚洲一区二区va在线| 污视频在线免费观看一区二区三区| 日韩a在线观看| 久久网这里都是精品| 噜噜噜噜噜久久久久久91| 国产男女猛烈无遮挡| 狠狠色丁香久久婷婷综合_中| 成人免费视频网址| 国产女人高潮毛片| 日韩二区在线观看| 国产精品丝袜视频| 97人妻精品一区二区三区视频 | mm131国产精品| 久久青草伊人| 欧美色播在线播放| 久草在在线视频| 999av小视频在线| 亚洲三级在线免费| www.xxx麻豆| 亚洲天堂资源| 欧美午夜精品一区| 在线视频一二区| 中文字幕一区二区三区中文字幕| 欧美日韩国产经典色站一区二区三区 | 日韩一区自拍| 九九热最新视频//这里只有精品| 久久综合加勒比| 国产亚洲毛片| 26uuu亚洲伊人春色| 麻豆一区二区三区精品视频| 一本色道久久精品| 国产精品极品尤物在线观看| 99er热精品视频| 99久久伊人久久99| 国产一区高清视频| yw在线观看| 一区二区三区在线免费播放| 欧美精品99久久| av资源新版天堂在线| 亚洲国产毛片aaaaa无费看| 国产精品无码一本二本三本色| gogo大尺度成人免费视频| 亚洲大胆人体av| 日韩不卡av在线| 激情久久综合| 2021久久精品国产99国产精品| 欧美精品亚洲精品日韩精品| 黑人巨大精品欧美一区| 久久综合伊人77777麻豆| 日本不卡视频一区二区| 亚洲免费av高清| 国产精品一色哟哟| 久久精品资源| 欧美一级久久久| 中文字幕免费高清| 亚洲视频碰碰| 国产日韩欧美日韩| 能在线看的av| 久久精品欧美日韩精品| 精品久久久无码人妻字幂| 国产一线二线在线观看| 欧美日韩精品欧美日韩精品一 | 久久久久国产成人精品亚洲午夜| av激情综合网| 性色av一区二区三区| 一卡二卡三卡在线观看| 国产精品影视在线观看| 色播亚洲婷婷| 色戒汤唯在线观看| 欧美大片日本大片免费观看| 99久久久无码国产精品不卡| 欧美激情综合色综合啪啪| 国产精品视频网站| 日本aaa在线观看| 国产精品女主播av| 国产av无码专区亚洲精品| 91九色鹿精品国产综合久久香蕉| 日韩视频永久免费观看| 久久精品偷拍视频| 久久久久久久久99精品| 熟女少妇在线视频播放| 国产suv精品一区二区四区视频| 少妇av一区二区三区| 中文字幕69页| 91美女片黄在线观看91美女| 18禁网站免费无遮挡无码中文| 国产成人a视频高清在线观看| 亚洲女在线观看| 免费在线黄色网| 久久精品二区三区| 免费一区二区三区| 欧美日韩国产观看视频| 亚洲国产精品成人av| 欧美日韩精品亚洲精品| 老司机午夜免费精品视频| 91嫩草视频在线观看| 91女主播在线观看| 欧美午夜精品理论片a级按摩| 亚洲无人区码一码二码三码| 日韩精品一区二区久久| 国产精品免费网站| 午夜一区在线观看| 一区二区三区在线视频免费| 中文字幕永久免费| 激情欧美日韩一区| 精品91免费| 中文字幕在线三区| 精品福利视频一区二区三区| 久久国产波多野结衣| 国产一区二区在线影院| 日韩精品不卡| 欧美精品高清| 亚洲精品影视在线观看| 精品久久久久久久久久久国产字幕| 豆国产96在线|亚洲| 中文字幕免费高| 懂色aⅴ精品一区二区三区| 色噜噜亚洲精品中文字幕| 中文字幕日韩免费| 91蜜桃网址入口| 老太脱裤子让老头玩xxxxx| 日韩欧美激情电影| 久久精品美女视频网站| 午夜精品无码一区二区三区| 天天操天天综合网| 挪威xxxx性hd极品| 国产精品啊v在线| 官网99热精品| 男人最爱成人网| 久久伊人色综合| 三级小视频在线观看| 大伊人狠狠躁夜夜躁av一区| v天堂中文在线| 青草av.久久免费一区| 三级在线免费观看| 网友自拍一区| 成人看片人aa| 天天综合av| 亚洲欧美日韩国产成人| 亚洲午夜18毛片在线看| 国产精品久久久爽爽爽麻豆色哟哟 | 欧美性受xxxx黑人xyx| 在线观看美女av| 久久亚洲私人国产精品va媚药| 不卡的在线视频| 亚洲三级电影在线观看| 在线视频欧美一区| 精品视频一二| 国产精品99免视看9| 日本成人不卡| 视频一区视频二区国产精品| 国产一区二区在线视频观看| 亚洲六月丁香色婷婷综合久久 | 国产日韩三级在线| 免费看污污网站| 天天做天天爱天天爽综合网| 亚洲自拍偷拍网址| 中文在线а√天堂| 中文字幕日本精品| 色在线免费视频| 日韩一区二区免费在线电影| 国产无遮挡又黄又爽在线观看| 99久久99久久免费精品蜜臀| 天堂网成人在线| 奇米色一区二区三区四区| 缅甸午夜性猛交xxxx| 成人精品视频| 欧日韩一区二区三区| 91久久精品无嫩草影院| 国产日韩av在线| 欧美日韩国产网站| 国产成人精品在线视频| sm性调教片在线观看| 在线看日韩欧美| 香蕉视频黄在线观看| 欧美日韩在线免费视频| 欧美超碰在线观看| 亚洲欧美日韩综合aⅴ视频| 国产a级黄色片| 久久99九九99精品| 午夜免费福利在线| 日韩精品成人一区二区在线| 91精品国产吴梦梦| 国产精品久久久久久| 五月天婷亚洲天综合网鲁鲁鲁| 亚洲福利天堂| 欧美日韩亚洲一区二区三区在线观看| 久久人体av| 国产美女被下药99| 国产高清中文字幕在线| 国a精品视频大全| av美女在线观看| 97国产精品免费视频| 韩国日本一区| 久久久日本电影| 激情黄产视频在线免费观看| 高清欧美性猛交xxxx| 高清视频在线观看三级| 久久天堂电影网| 制服丝袜在线播放| 在线色欧美三级视频| 日韩专区第一页| 欧美大片在线观看一区| 六月丁香综合网| 亚洲精品理论电影| 九色在线播放| 精品国内二区三区| 天天干天天草天天射| 亚洲美女福利视频网站| 国产小视频免费在线观看| 亚洲成人精品视频| 日韩精品福利| 亚洲国产精品久久久久秋霞不卡| 天天干免费视频| 永久免费精品影视网站| 国产视频一区二区| 综合激情国产一区| a在线免费观看| 97精品在线观看| 日本在线视频中文有码| 久久久精品美女| 老司机午夜在线| 韩国v欧美v日本v亚洲| 亚洲伦乱视频| 日韩免费观看在线观看| 中文字幕在线直播| 国产啪精品视频网站| 国产精品久久久久77777丨| 亚洲在线第一页| 日本在线视频一区二区三区| 久久99精品久久久久久久青青日本| 狼人天天伊人久久| 超碰97在线人人| 天天躁日日躁成人字幕aⅴ| 精品毛片久久久久久| 日韩极品少妇| 日本三级福利片| 国产美女一区| 国产亚洲精品网站| 久久国产精品久久w女人spa| 国产亚洲天堂网| 国产乱子伦一区二区三区国色天香| 精品一区二区视频在线观看| 国产精品五月天| 日本一级一片免费视频| 丰满岳妇乱一区二区三区| 国产精品熟女久久久久久| 亚洲激情自拍图| 激情视频在线观看| 国产99久久精品一区二区 夜夜躁日日躁 | 日韩久久综合| 青青草国产精品视频| 久色婷婷小香蕉久久| 国产传媒第一页| 亚洲一卡二卡三卡四卡| 国产精品视频123| 欧美体内she精视频| 日本韩国免费观看| 久久精品色欧美aⅴ一区二区| 性国裸体高清亚洲| 91中文字幕一区| 国产精品网在线观看| 久久久精彩视频| 日韩精品欧美| 欧美伦理视频在线观看| 狠狠色丁香婷综合久久| 亚洲a v网站| 亚洲欧洲精品天堂一级| 中文人妻av久久人妻18| 亚洲精品动漫久久久久| 少妇视频在线| 国产97在线视频| 亚洲性视频在线| 最新视频 - x88av| 奇米精品一区二区三区在线观看| 亚洲午夜福利在线观看| 亚洲电影在线播放| 在线观看免费观看在线| 亚洲日韩中文字幕在线播放| 色是在线视频| 亚洲资源在线看| 国产亚洲第一伦理第一区| 99999精品视频| 国产高清精品在线| 免费无码毛片一区二区app| 91精品国产麻豆|