精品欧美一区二区三区在线观看 _久久久久国色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ù)棧公眾號

日本欧美黄色片| 99国产在线视频| 日本综合在线观看| 精品视频一二| 欧美视频中文字幕在线| 伊人天天久久大香线蕉av色| www.xxxx国产| 久久久久久黄| 欧美日本中文字幕| 亚洲码无人客一区二区三区| 动漫一区二区三区| 色综合天天天天做夜夜夜夜做| 天天成人综合网| 亚州男人的天堂| 国产一区二区在线看| 日本成人在线视频网址| 久久久久99精品成人片试看| 精品国产一区二区三区久久久樱花| 欧美一区二区三级| 日本激情视频在线播放| 九色porny丨首页入口在线| 中文字幕在线观看一区二区| 欧美日韩一区二区三| 亚洲av无码国产综合专区 | 五月婷婷之婷婷| 亚洲国产一区二区视频| 国产精品成人观看视频免费| 中文亚洲av片在线观看| 一本色道久久精品| 久久影院模特热| www.av天天| 久久影视三级福利片| 91精品国产免费| 天天干天天干天天干天天干天天干| 182在线视频观看| 亚洲欧美一区二区三区久本道91| 日本一区不卡| 久蕉在线视频| 93久久精品日日躁夜夜躁欧美| 亚洲在线观看视频网站| 一级黄色片免费| 日韩成人精品在线观看| 日韩av黄色在线观看| 亚洲 欧美 视频| 日韩亚洲国产精品| 国产做受69高潮| 国产一级特黄a高潮片| 欧美日本一区二区高清播放视频| 久久艹在线视频| avtt天堂在线| 欧美三级视频| 欧美精品精品精品精品免费| 久草网在线观看| 亚洲一级一区| 国内外成人免费激情在线视频网站| 免费人成年激情视频在线观看| 欧美va天堂| 欧美激情视频一区二区| 日本免费在线播放| 亚洲精品人人| 日本道色综合久久影院| 波多野结衣视频网址| 日本aⅴ亚洲精品中文乱码| 国产精品入口日韩视频大尺度| 国产在线观看第一页| 日韩成人av影视| 国产在线a不卡| 99热这里只有精品99| 国产99久久久国产精品潘金网站| 国产精品乱码一区二区三区| 日韩三级电影网| 欧美激情一二三区| 400部精品国偷自产在线观看| 影音先锋男人资源在线| 婷婷夜色潮精品综合在线| 99精品在线免费视频| 黄色亚洲网站| 制服.丝袜.亚洲.中文.综合| 日韩大尺度视频| 亚洲人成精品久久久| 在线视频亚洲欧美| 青娱乐国产在线视频| av成人国产| 成人福利网站在线观看11| 亚洲成人精品女人久久久| 99re这里都是精品| 亚洲国产午夜伦理片大全在线观看网站 | 天天爽天天狠久久久| 国产一二三区在线观看| 亚洲国产欧美另类丝袜| 亚洲污视频在线观看| 午夜精品在线| 亚洲天堂av女优| 国产这里有精品| 日韩中文字幕区一区有砖一区| 成人av.网址在线网站| 四季av日韩精品一区| 日本一区二区综合亚洲| 久无码久无码av无码| 久久久加勒比| 国产婷婷97碰碰久久人人蜜臀| 一本色道久久88| 国产精品资源| 亚洲综合在线做性| 免费在线黄色网址| 亚洲一二三四久久| 97超碰成人在线| 九九免费精品视频在线观看| 欧美国产乱视频| 亚洲综合网av| 久久影院视频免费| 日本阿v视频在线观看| 福利一区视频| 亚洲人成在线播放| 91久久国产视频| 国产福利一区二区三区视频在线 | 国产一区不卡在线观看| 色开心亚洲综合| 精品久久久久久久中文字幕| 波多野结衣免费观看| 成人vr资源| 欧美一级免费看| 蜜臀久久久久久999| 最新欧美精品一区二区三区| 天堂中文视频在线| 久久99久久人婷婷精品综合| 韩日欧美一区二区| 亚洲男人天堂久久| 亚洲免费三区一区二区| 国产精品嫩草影院8vv8| 日韩专区精品| 国产视频999| 日本中文字幕在线2020| 欧美日韩久久不卡| 一级免费黄色录像| 久久精品国产免费| 一区二区三区我不卡| 九九久久国产| 色777狠狠综合秋免鲁丝| 最近中文字幕免费观看| 国产喷白浆一区二区三区| 农村妇女精品一二区| 亚洲国产精品嫩草影院久久av| 午夜精品久久久久久久男人的天堂 | 久久久久中文| 日韩久久不卡| 成人国产一区| 国产一区二区三区在线| 无码人妻精品一区二区| 国产日韩视频一区二区三区| 黑森林福利视频导航| 九九免费精品视频在线观看| 国产精品1区2区在线观看| 成人高清在线| 91精品综合久久久久久| 欧美 日韩 国产 一区二区三区| 国产麻豆视频精品| 国产又粗又猛又爽又黄的网站 | 亚洲国产成人精品久久| 天堂网一区二区三区| 91亚洲精品久久久蜜桃网站| 欧美一区第一页| 动漫av一区二区三区| 亚洲va韩国va欧美va精品| 亚洲久久久久久| 午夜在线播放视频欧美| 日韩精品不卡| 91视频亚洲| 欧美激情一区二区三区在线视频观看 | 亚洲欧美国产精品专区久久 | 国产成人自拍网站| 成人综合婷婷国产精品久久蜜臀| 欧美成人精品免费| 九九在线精品| 国产欧美婷婷中文| 日日夜夜天天综合入口| 亚洲精品一区中文字幕乱码| 中文字幕久久熟女蜜桃| 亚洲一区二区在线观看视频| 少妇精品一区二区三区| 激情成人综合网| 国产3p露脸普通话对白| 国产伦精品一区二区三区千人斩 | 综合欧美一区二区三区| 欧美久久久久久久久久久| 久久久久久久欧美精品| 超薄肉色丝袜足j调教99| 国内精品麻豆美女在线播放视频 | 自拍偷拍亚洲综合| 中文字幕第3页| 免费高清不卡av| 又大又硬又爽免费视频| 欧美色就是色| 国产成人精品日本亚洲11| 不卡一二三区| 欧美xxxx综合视频| 九色蝌蚪在线| 欧美成人video| 国产美女www| 亚洲国产精品久久一线不卡| 国产日韩精品中文字无码| 成人精品亚洲人成在线| 日日噜噜噜噜久久久精品毛片| 一区精品久久| 国产又粗又硬又长| 免费成人网www| 国产成人精品一区二区三区福利| 国产成人福利夜色影视| 欧美亚洲在线视频| 欧美videosex性欧美黑吊| 中文字幕日韩av| 色视频在线观看| 精品久久国产97色综合| 136福利视频导航| 色噜噜偷拍精品综合在线| 精品在线视频观看| 亚洲视频免费观看| 亚洲色图日韩精品| 国产午夜精品一区二区三区四区| 国产日韩视频一区| 国产精品一二三在| 亚洲图色中文字幕| 蜜臀av一区二区在线观看| 大肉大捧一进一出好爽视频| 欧美日韩1080p| 天堂av免费看| 欧美激情777| 日韩精品一区二区三区四区五区| 婷婷成人综合| 国产视频精品网| 超碰地址久久| 999日本视频| 欧美成年网站| 亚洲一区二区三区在线视频 | 久久草.com| 韩国女主播一区二区三区| 亚洲综合国产精品| 精品一区二区三区亚洲| 亚洲xxxxx电影| 亚洲影视资源| 91久久在线播放| 不卡的国产精品| 91在线中文字幕| 欧美国产中文高清| 国产chinese精品一区二区| 97青娱国产盛宴精品视频| 97视频中文字幕| 高清欧美性猛交xxxx黑人猛| 国产一级精品aaaaa看| 麻豆一区二区麻豆免费观看| 精品九九九九| 欧美男男gaytwinkfreevideos| 久久亚洲国产精品日日av夜夜| 无码少妇一区二区三区| 欧美一区1区三区3区公司| 成人国产精品一级毛片视频| 亚洲电影网站| 中文一区一区三区免费在线观看| 亚洲啊啊啊啊啊| 亚洲国产免费| 99免费视频观看| 美日韩一级片在线观看| www.51色.com| 国产成人精品免费看| 天天插天天射天天干| 久久久91精品国产一区二区精品| 亚洲一二三四视频| 亚洲欧美日韩一区| 日韩手机在线观看| 色妹子一区二区| 99riav国产| 亚洲福利在线看| 成人午夜影视| 久久国产精品影片| 午夜激情在线播放| 国产免费一区视频观看免费 | 久久久一本精品| 国产精品视频自拍| 伊人久久大香线蕉av超碰| 久草精品电影| 色综合咪咪久久网| av女优在线播放| 日韩激情av在线| 国模大尺度视频| 国产香蕉久久精品综合网| 亚洲波多野结衣| 欧美日韩一区二区免费视频| 国产精品成人久久久| 日韩欧美国产成人一区二区| 日韩av资源站| 欧美成人在线网站| 丝袜美腿诱惑一区二区三区| 91亚洲精品在线观看| 日韩高清成人在线| 中国老女人av| 久久精品亚洲| 亚洲国产精品狼友在线观看| 欧美激情中文字幕| 男人天堂中文字幕| 欧美年轻男男videosbes| 人妻一区二区三区免费| 在线观看成人黄色| 神马午夜在线视频| 97操在线视频| 日韩免费视频| 苍井空浴缸大战猛男120分钟| 国产精品99久久久久久有的能看| 午夜理伦三级做爰电影| 亚洲一级片在线观看| 91亚洲欧美激情| 国产午夜精品视频免费不卡69堂| 天堂av最新在线| 国产欧美精品一区二区三区-老狼 国产欧美精品一区二区三区介绍 国产欧美精品一区二区 | 亚洲第一免费视频| 中文字幕国产亚洲| 亚洲国产欧美日本视频| 国产成人精品免费视频大全最热 | av影片在线播放| 中文字幕一区二区三区四区| 老熟妇一区二区三区| 亚洲国产成人爱av在线播放| 18av在线播放| 成人网欧美在线视频| 日韩精品一区二区三区免费观影| 男人操女人免费软件| jizz一区二区| 日本特黄一级片| 精品国产污网站| 欧美黄色视屏| 亚洲自拍偷拍福利| 91精品国产91久久久久久密臀| 校园春色 亚洲色图| 国产女人18水真多18精品一级做| 超碰超碰超碰超碰| 日韩精品视频免费专区在线播放| sis001亚洲原创区| 国产精品久久久久久久久久久久冷| 久久久久久影院| theporn国产精品| 亚洲视频免费在线| 国产日韩欧美视频在线观看| zzjj国产精品一区二区| 日韩一区二区三免费高清在线观看| 亚洲精品欧美精品| 精品午夜久久福利影院| 老熟妇高潮一区二区三区| 制服.丝袜.亚洲.另类.中文| 黄色成人影院| 91久久精品一区二区别| 欧美网站在线| 一级黄色电影片| 香蕉久久一区二区不卡无毒影院| 图片区 小说区 区 亚洲五月| 97人洗澡人人免费公开视频碰碰碰| 国产香蕉精品| 91传媒久久久| 亚洲国产精品成人综合| 国产精品无码天天爽视频| 久久夜精品va视频免费观看| 精品一区二区三区四区五区| 精品一二三四五区| 北条麻妃国产九九精品视频| 国产微拍精品一区| 亚洲图片欧美午夜| 亚洲欧洲日韩精品在线| 一本大道东京热无码aⅴ| www.欧美精品一二区| 加勒比在线一区| 日韩综合中文字幕| 成人18夜夜网深夜福利网| 国产真实乱子伦| 国产精品色呦呦| 99热在线只有精品| 97在线免费观看| 久久久综合色| 亚洲少妇中文字幕| 日韩欧美黄色动漫| 黄色免费网站在线| 精品乱子伦一区二区三区| 日本欧美在线观看| 国产探花在线免费观看| 日韩精品亚洲视频| 亚洲美女色播| www.99热这里只有精品| 中文字幕av资源一区| 丰满人妻一区二区三区免费视频| 欧洲亚洲免费在线| 亚洲v在线看| 女同毛片一区二区三区| 欧美精品自拍偷拍动漫精品| 丁香影院在线| 亚洲高清乱码| 成人小视频在线| 中文字幕+乱码+中文乱码www| 九九热精品视频| 精品美女视频| 日韩女优在线视频| 制服.丝袜.亚洲.另类.中文| 中文在线аv在线| www.国产二区|