天天看點

【K8s學習第三篇】K8s叢集管理工具kubectl

指令行工具kubectl

​kubelet​

​​ 會在叢集中每個​​節點(node)​​​上運作。 它保證​​容器(containers)​​​都運作在 ​​Pod​​ 中。

kubelet 接收一組通過各類機制提供給它的 PodSpecs, 確定這些 PodSpecs 中描述的容器處于運作狀态且健康。 kubelet 不會管理不是由 Kubernetes 建立的容器。

​​相關網站:https://kubernetes.io/zh-cn/docs/reference/kubectl/​​

Kubernetes 提供 kubectl 是使用 Kubernetes API 與 Kubernetes 叢集的​​控制面​​進行通信的指令行工具。

針對配置資訊,​

​kubectl​

​​ 在 ​

​$HOME/.kube​

​​ 目錄中查找一個名為 ​

​config​

​​ 的配置檔案。 你可以通過設定 ​

​KUBECONFIG​

​​ 環境變量或設定 ​​--kubeconfig​​​參數來指定其它 ​​kubeconfig​​ 檔案。

文法

使用以下文法從終端視窗運作 ​

​kubectl​

​ 指令:

kubectl [command] [TYPE] [NAME] [flags]      

其中 ​

​command​

​​、​

​TYPE​

​​、​

​NAME​

​​ 和 ​

​flags​

​ 分别是:

  • ​command​

    ​​:指定要對一個或多個資源執行的操作,例如​

    ​create​

    ​​、​

    ​get​

    ​​、​

    ​describe​

    ​​、​

    ​delete​

    ​。
  • ​TYPE​

    ​​:指定​​資源類型​​。資源類型不區分大小寫, 可以指定單數、複數或縮寫形式。例如,以下指令輸出相同的結果:
kubectl get pod pod1
kubectl get pods pod1
kubectl get po pod1      
  • ​NAME​

    ​​:指定資源的名稱。名稱區分大小寫。 如果省略名稱,則顯示所有資源的詳細資訊。例如:​

    ​kubectl get pods​

    ​​。

    在對多個資源執行操作時,你可以按類型和名稱指定每個資源,或指定一個或多個檔案:

  • 要按類型和名稱指定資源:
  • 要對所有類型相同的資源進行分組,請執行以下操作:​

    ​TYPE1 name1 name2 name<#>​

    ​​。

    例子:​​

    ​kubectl get pod example-pod1 example-pod2​

  • 分别指定多個資源類型:​

    ​TYPE1/name1 TYPE1/name2 TYPE2/name3 TYPE<#>/name<#>​

    ​​。

    例子:​​

    ​kubectl get pod/example-pod1 replicationcontroller/example-rc1​

  • 用一個或多個檔案指定資源:​

    ​-f file1 -f file2 -f file<#>​

  • ​​使用 YAML 而不是 JSON​​​, 因為 YAML 對使用者更友好, 特别是對于配置檔案。

    例子:​​

    ​kubectl get -f ./pod.yaml​

  • ​flags​

    ​​: 指定可選的參數。例如,可以使用​

    ​-s​

    ​​ 或​

    ​--server​

    ​ 參數指定 Kubernetes API 伺服器的位址和端口。

注意: 從指令行指定的參數會覆寫預設值和任何相應的環境變量。

如果你需要幫助,在終端視窗中運作 ​

​kubectl help​

​。

常見的基礎指令

create 通過檔案名或标準輸入建立資源

expose 将一個資源暴露為一個新的Service

run 在叢集中運作一個指定的鏡像

set 在對象上設定特定的功能

get 顯示一個或多個資源

explain 展示文檔參考資料

edit 使用預設的編輯器編輯一個資源

delete 通過檔案名,标準輸入,資源名稱或标簽來删除資源

apply 通過檔案名或标準輸入對資源應用配置

patch 更新檔修改、更新資源

replace 通過檔案名或标準輸入替換一個資源

convert 不同的API版本之間轉換配置檔案

label 更新資源上的标簽

annotate 更新資源上的注釋

completion 用于實作kubectl工具自動補全

api-versions 列印受支援的API版本

config 修改kubeconfig檔案(用于通路API,比如配置認證資訊)

help 所有指令幫助

plugin 運作一個指令行插件

version 列印用戶端和服務版本資訊

部署指令

rollout 管理資源的釋出
rolling-update 對給定的複制控制器滾動更新
scale 擴容或縮容Pod數量,Deployment、ReplicaSet、RC或Job
autoscale 建立一個自動選擇擴容或縮容并設定Pod數量

叢集管理指令

certificate 修改證書資源
cluster-info 顯示叢集資訊
top 顯示資源(CPU/M)
cordon 标記節點不可排程
uncordon 标記節點可被排程
drain 驅逐節點上的應用,準備下線維護
taint 修改節點taint标記

故障調試指令

describe 顯示特定資源或資源組的詳細資訊

logs 在一個Pod中列印一個容器日志,如果Pod隻有一個容器,容器名稱是可選的

attach 附加到一個運作的容器

exec 執行指令到容器

port-forward 轉發一個或多個

proxy 運作一個proxy到Kubernetes API Server

cp 拷貝檔案或目錄到容器中

auth 檢查授權

叢集内身份驗證和命名空間覆寫

預設情況下,​

​kubectl​

​​ 指令首先确定它是否在 Pod 中運作,進而被視為在叢集中運作。 它首先檢查 ​

​KUBERNETES_SERVICE_HOST​

​​ 和 ​

​KUBERNETES_SERVICE_PORT​

​​ 環境變量以及 ​

​/var/run/secrets/kubernetes.io/serviceaccount/token​

​ 中是否存在服務帳戶令牌檔案。 如果三個條件都被滿足,則假定在叢集内進行身份驗證。

為保持向後相容性,如果在叢集内身份驗證期間設定了 ​

​POD_NAMESPACE​

​ 環境變量,它将覆寫服務帳戶令牌中的預設命名空間。 任何依賴預設命名空間的清單或工具都會受到影響。

​POD_NAMESPACE​

​ 環境變量

如果設定了 ​

​POD_NAMESPACE​

​​ 環境變量,對命名空間資源的 CLI 操作對象将使用該變量值作為預設值。 例如,如果該變量設定為 ​

​seattle​

​​,​

​kubectl get pods​

​​ 将傳回 ​

​seattle​

​ 命名空間中的 Pod。 這是因為 Pod 是一個命名空間資源,且指令中沒有提供命名空間。

直接使用 ​

​--namespace <value>​

​ 會覆寫此行為。

kubectl 如何處理 ServiceAccount 令牌

假設:

  • 有 Kubernetes 服務帳戶令牌檔案挂載在​

    ​/var/run/secrets/kubernetes.io/serviceaccount/token​

    ​ 上,并且
  • 設定了​

    ​KUBERNETES_SERVICE_HOST​

    ​ 環境變量,并且
  • 設定了​

    ​KUBERNETES_SERVICE_PORT​

    ​ 環境變量,并且
  • 你沒有在 kubectl 指令行上明确指定命名空間。

然後 kubectl 假定它正在你的叢集中運作。 kubectl 工具查找該 ServiceAccount 的命名空間 (該命名空間與 Pod 的命名空間相同)并針對該命名空間進行操作。 這與叢集外運作的情況不同; 當 kubectl 在叢集外運作并且你沒有指定命名空間時, kubectl 指令會針對 ​

​default​

​ 命名空間進行操作。

格式化輸出

所有 ​

​kubectl​

​​ 指令的預設輸出格式都是人類可讀的純文字格式。要以特定格式在終端視窗輸出詳細資訊, 可以将 ​

​-o​

​​ 或 ​

​--output​

​​ 參數添加到受支援的 ​

​kubectl​

​ 指令中。

文法

kubectl [command] [TYPE] [NAME] -o <output_format>      

取決于具體的 ​

​kubectl​

​ 操作,支援的輸出格式如下:

輸出格式 描述

​-o custom-columns=<spec>​

使用逗号分隔的​​自定義列​​清單列印表。

​-o custom-columns-file=<filename>​

使用 ​

​<filename>​

​​ 檔案中的​​自定義列​​模闆列印表。

​-o json​

輸出 JSON 格式的 API 對象

​-o jsonpath=<template>​

列印 ​​jsonpath​​ 表達式定義的字段

​-o jsonpath-file=<filename>​

列印 ​

​<filename>​

​​ 檔案中 ​​jsonpath​​ 表達式定義的字段。

​-o name​

僅列印資源名稱而不列印任何其他内容。

​-o wide​

以純文字格式輸出,包含所有附加資訊。對于 Pod 包含節點名。

​-o yaml​

輸出 YAML 格式的 API 對象。
示例

在此示例中,以下指令将單個 Pod 的詳細資訊輸出為 YAML 格式的對象:

kubectl get pod web-pod-13je7 -o yaml      

自定義列

要定義自定義列并僅将所需的詳細資訊輸出到表中,可以使用 ​

​custom-columns​

​​ 選項。 你可以選擇内聯定義自定義列或使用模闆檔案:​

​-o custom-columns=<spec>​

​​ 或 ​

​-o custom-columns-file=<filename>​

​。

示例

内聯:

kubectl get pods <pod-name> -o custom-columns=NAME:.metadata.name,RSRC:.metadata.resourceVersion      

模闆檔案:

kubectl get pods <pod-name> -o custom-columns-file=template.txt      

其中,​

​template.txt​

​ 檔案包含:

NAME          RSRC
metadata.name metadata.resourceVersion      

運作這兩個指令之一的結果類似于:

NAME           RSRC
submit-queue   610995      

Server-side 列

​kubectl​

​ 支援從伺服器接收關于對象的特定列資訊。 這意味着對于任何給定的資源,伺服器将傳回與該資源相關的列和行,以便用戶端列印。 通過讓伺服器封裝列印的細節,這允許在針對同一叢集使用的用戶端之間提供一緻的人類可讀輸出。

此功能預設啟用。要禁用它,請将該 ​

​--server-print=false​

​​ 參數添加到 ​

​kubectl get​

​ 指令中。

例子:

要列印有關 Pod 狀态的資訊,請使用如下指令:

kubectl get pods <pod-name> --server-print=false      

輸出類似于:

NAME       AGE
pod-name   1m      

 kubectl get pods nginx-86c57db685-6rbq8 --server-print=false

【K8s學習第三篇】K8s叢集管理工具kubectl

2d7h =2天7小時

排序清單對象

要将對象排序後輸出到終端視窗,可以将 ​

​--sort-by​

​​ 參數添加到支援的 ​

​kubectl​

​​ 指令。 通過使用 ​

​--sort-by​

​​ 參數指定任何數字或字元串字段來對對象進行排序。 要指定字段,請使用 ​​jsonpath​​ 表達式。

文法

kubectl [command] [TYPE] [NAME] --sort-by=<jsonpath_exp>      
示例

要列印按名稱排序的 Pod 清單,請運作:

kubectl get pods --sort-by=.metadata.name      

示例:常用操作

使用以下示例集來幫助你熟悉運作常用 kubectl 操作:

​kubectl apply​

​ - 以檔案或标準輸入為準應用或更新資源。

# 使用 example-service.yaml 中的定義建立服務。
kubectl apply -f example-service.yaml

# 使用 example-controller.yaml 中的定義建立 replication controller。
kubectl apply -f example-controller.yaml

# 使用 <directory> 路徑下的任意 .yaml、.yml 或 .json 檔案 建立對象。
kubectl apply -f <directory>      

​kubectl get​

​ - 列出一個或多個資源。

# 以純文字輸出格式列出所有 Pod。
kubectl get pods

# 以純文字輸出格式列出所有 Pod,并包含附加資訊(如節點名)。
kubectl get pods -o wide

# 以純文字輸出格式列出具有指定名稱的副本控制器。提示:你可以使用别名 'rc' 縮短和替換 'replicationcontroller' 資源類型。
kubectl get replicationcontroller <rc-name>

# 以純文字輸出格式列出所有副本控制器和服務。
kubectl get rc,services

# 以純文字輸出格式列出所有守護程式集,包括未初始化的守護程式集。
kubectl get ds --include-uninitialized

# 列出在節點 server01 上運作的所有 Pod
kubectl get pods --field-selector=spec.nodeName=server01      

kubectl get rc,service

【K8s學習第三篇】K8s叢集管理工具kubectl

kubectl get pods --field-selector=spec.nodeName=k8snode1

【K8s學習第三篇】K8s叢集管理工具kubectl

​kubectl describe​

​ - 顯示一個或多個資源的詳細狀态,預設情況下包括未初始化的資源。

# 顯示名為 <pod-name> 的 Pod 的詳細資訊。
kubectl describe nodes <node-name>

# 顯示名為 <pod-name> 的 Pod 的詳細資訊。
kubectl describe pods/<pod-name>

# 顯示由名為 <rc-name> 的副本控制器管理的所有 Pod 的詳細資訊。
# 記住:副本控制器建立的任何 Pod 都以副本控制器的名稱為字首。
kubectl describe pods <rc-name>

# 描述所有的 Pod
kubectl describe pods      

kubectl describe nodes k8snode1

【K8s學習第三篇】K8s叢集管理工具kubectl
【K8s學習第三篇】K8s叢集管理工具kubectl

[root@k8smaster ~]# kubectl get pods nginx-86c57db685-6rbq8

【K8s學習第三篇】K8s叢集管理工具kubectl

說明:

​kubectl get​

​​ 指令通常用于檢索同一資源類别的一個或多個資源。 它具有豐富的參數,允許你使用 ​

​-o​

​​ 或 ​

​--output​

​​ 參數自定義輸出格式。 你可以指定 ​

​-w​

​​ 或 ​

​--watch​

​​ 參數以開始監測特定對象的更新。 ​

​kubectl describe​

​​ 指令更側重于描述指定資源的許多相關方面。它可以調用對 ​

​API 伺服器​

​​ 的多個 API 調用來為使用者建構視圖。 例如,該 ​

​kubectl describe node​

​ 指令不僅檢索有關節點的資訊,還檢索在其上運作的 Pod 的摘要,為節點生成的事件等。

​kubectl delete​

​ - 基于檔案、标準輸入或通過指定标簽選擇器、名稱、資源選擇器或資源來删除資源。

# 使用 pod.yaml 檔案中指定的類型和名稱删除 Pod。
kubectl delete -f pod.yaml

# 删除所有帶有 '<label-key>=<label-value>' 标簽的 Pod 和服務。
kubectl delete pods,services -l <label-key>=<label-value>

# 删除所有 Pod,包括未初始化的 Pod。
kubectl delete pods --all      

​kubectl exec​

​ - 對 Pod 中的容器執行指令。

# 從 Pod <pod-name> 中擷取運作 'date' 的輸出。預設情況下,輸出來自第一個容器。
kubectl exec <pod-name> -- date

# 運作輸出 'date' 擷取在 Pod <pod-name> 中容器 <container-name> 的輸出。
kubectl exec <pod-name> -c <container-name> -- date

# 擷取一個互動 TTY 并在 Pod  <pod-name> 中運作 /bin/bash。預設情況下,輸出來自第一個容器。
kubectl exec -ti <pod-name> -- /bin/bash      

[root@k8smaster ~]# kubectl exec nginx-86c57db685-6rbq8 -- date

【K8s學習第三篇】K8s叢集管理工具kubectl

[root@k8smaster ~]# kubectl exec -it nginx-86c57db685-6rbq8 -- bin/bash

【K8s學習第三篇】K8s叢集管理工具kubectl

​kubectl logs​

​ - 列印 Pod 中容器的日志。

# 傳回 Pod <pod-name> 的日志快照。
kubectl logs <pod-name>

# 從 Pod <pod-name> 開始流式傳輸日志。這類似于 'tail -f' Linux 指令。
kubectl logs -f <pod-name>      

[root@k8smaster ~]# kubectl logs -f --tail 100 nginx-86c57db685-6rbq8

【K8s學習第三篇】K8s叢集管理工具kubectl

​kubectl diff​

​ - 檢視叢集建議更新的差異。

# “pod.json”中包含的差異資源。
kubectl diff -f pod.json

# 從标準輸入讀取的差異檔案。
cat service.yaml | kubectl diff -f -      

示例:建立和使用插件

使用以下示例來幫助你熟悉編寫和使用 ​

​kubectl​

​ 插件:

# 用任何語言建立一個簡單的插件,并為生成的可執行檔案命名
# 以字首 "kubectl-" 開始
 ./kubectl-hello      
#!/bin/sh

# 這個插件列印單詞 "hello world"
echo "hello world"      

這個插件寫好了,把它變成可執行的:

sudo chmod a+x ./kubectl-hello

# 并将其移動到路徑中的某個位置
sudo mv ./kubectl-hello /usr/local/bin
sudo chown root:root /usr/local/bin

# 你現在已經建立并"安裝了"一個 kubectl 插件。
# 你可以開始使用這個插件,從 kubectl 調用它,就像它是一個正常指令一樣
kubectl hello      
hello world      
# 你可以"解除安裝"一個插件,隻需從你的 $PATH 中删除它
sudo rm /usr/local/bin/kubectl-hello      

[root@k8smaster ~]# vi ./kubectl-hello

【K8s學習第三篇】K8s叢集管理工具kubectl

[root@k8smaster ~]# ll kubectl-hello  

-rw-r--r--. 1 root root 71 7月  25 17:37 kubectl-hello

[root@k8smaster ~]# chmod +x kubectl-hello 

-rwxr-xr-x. 1 root root   71 7月  25 17:37 kubectl-hello

[root@k8smaster ~]# mv ./kubectl-hello /usr/local/bin/

[root@k8smaster ~]# ll /usr/local/bin

總用量 4

-rwxr-xr-x. 1 root root 71 7月  25 17:37 kubectl-hello

[root@k8smaster ~]# kubectl hello

hello world

【K8s學習第三篇】K8s叢集管理工具kubectl

為了檢視可用的所有 ​

​kubectl​

​​ 插件,你可以使用 ​

​kubectl plugin list​

​ 子指令:

kubectl plugin list      

輸出類似于:

The following kubectl-compatible plugins are available:

/usr/local/bin/kubectl-hello
/usr/local/bin/kubectl-foo
/usr/local/bin/kubectl-bar      

[root@k8smaster ~]# kubectl plugin list

【K8s學習第三篇】K8s叢集管理工具kubectl

​kubectl plugin list​

​ 指令也可以向你告警哪些插件被運作,或是被其它插件覆寫了,例如:

sudo chmod -x /usr/local/bin/kubectl-foo # 删除執行權限
kubectl plugin list      
The following kubectl-compatible plugins are available:

/usr/local/bin/kubectl-hello
/usr/local/bin/kubectl-foo
  - warning: /usr/local/bin/kubectl-foo identified as a plugin, but it is not executable
/usr/local/bin/kubectl-bar

error: one plugin warning was found      

你可以将插件視為在現有 kubectl 指令之上建構更複雜功能的一種方法:

cat ./kubectl-whoami      

接下來的幾個示例假設你已經将 ​

​kubectl-whoami​

​ 設定為以下内容:

#!/bin/bash

#這個插件利用 `kubectl config` 指令基于目前所選上下文輸出目前使用者的資訊
kubectl config view --template='{{ range .contexts }}{{ if eq .name "'$(kubectl config current-context)'" }}Current user: {{ printf "%s\n" .context.user }}{{ end }}{{ end }}'      

運作以上指令将為你提供一個輸出,其中包含 KUBECONFIG 檔案中目前上下文的使用者:

#!/bin/bash
# 使檔案成為可執行的
sudo chmod +x ./kubectl-whoami

# 然後移動到你的路徑中
sudo mv ./kubectl-whoami /usr/local/bin

kubectl whoami
Current user: plugins-user      

建立一個namespace

[root@k8smaster ~]# kubectl create namespace test

namespace/test created

[root@k8smaster ~]# kubectl get ns | grep test

test                   Active   15s

在此namespace下建立并運作一個nginx的Pod

kubectl run pod --image=nginx:latest -n test

【K8s學習第三篇】K8s叢集管理工具kubectl

檢視新建立的pod

kubectl get pod -n test

【K8s學習第三篇】K8s叢集管理工具kubectl

删除指定的namespace

kubectl delete ns test

【K8s學習第三篇】K8s叢集管理工具kubectl

kubectl 備忘單

本頁列舉了常用的 ​

​kubectl​

​ 指令和标志。

Kubectl 自動補全

BASH

source <(kubectl completion bash) # 在 bash 中設定目前 shell 的自動補全,要先安裝 bash-completion 包。
echo "source <(kubectl completion bash)" >> ~/.bashrc # 在你的 bash shell 中永久地添加自動補全      

你還可以在補全時為 ​

​kubectl​

​ 使用一個速記别名:

alias k=kubectl
complete -o default -F __start_kubectl k      

ZSH

source <(kubectl completion zsh)  # 在 zsh 中設定目前 shell 的自動補全
echo '[[ $commands[kubectl] ]] && source <(kubectl completion zsh)' >> ~/.zshrc # 在你的 zsh shell 中永久地添加自動補全      

關于 --all-namespaces 的一點說明

我們經常用到 ​

​--all-namespaces​

​ 參數,你應該要知道它的簡寫:

​kubectl -A​

【K8s學習第三篇】K8s叢集管理工具kubectl

Kubectl 上下文和配置

設定 ​

​kubectl​

​​ 與哪個 Kubernetes 叢集進行通信并修改配置資訊。 檢視​​使用 kubeconfig 跨叢集授權通路​​ 文檔擷取配置檔案詳細資訊。

kubectl config view # 顯示合并的 kubeconfig 配置。

# 同時使用多個 kubeconfig 檔案并檢視合并的配置
KUBECONFIG=~/.kube/config:~/.kube/kubconfig2

kubectl config view

# 擷取 e2e 使用者的密碼
kubectl config view -o jsonpath='{.users[?(@.name == "e2e")].user.password}'

kubectl config view -o jsonpath='{.users[].name}'    # 顯示第一個使用者
kubectl config view -o jsonpath='{.users[*].name}'   # 擷取使用者清單
kubectl config get-contexts                          # 顯示上下文清單
kubectl config current-context                       # 展示目前所處的上下文
kubectl config use-context my-cluster-name           # 設定預設的上下文為 my-cluster-name

kubectl config set-cluster my-cluster-name           # 在 kubeconfig 中設定叢集條目

# 在 kubeconfig 中配置代理伺服器的 URL,以用于該用戶端的請求
kubectl config set-cluster my-cluster-name --proxy-url=my-proxy-url

# 添加新的使用者配置到 kubeconf 中,使用 basic auth 進行身份認證
kubectl config set-credentials kubeuser/foo.kubernetes.com --username=kubeuser --password=kubepassword

# 在指定上下文中持久性地儲存名字空間,供所有後續 kubectl 指令使用
kubectl config set-context --current --namespace=ggckad-s2

# 使用特定的使用者名和名字空間設定上下文
kubectl config set-context gce --user=cluster-admin --namespace=foo \
  && kubectl config use-context gce

kubectl config unset users.foo                       # 删除使用者 foo

# 設定或顯示 context / namespace 的短别名
# (僅适用于 bash 和 bash 相容的 shell,在使用 kn 設定命名空間之前要先設定 current-context)
alias kx='f() { [ "$1" ] && kubectl config use-context $1 || kubectl config current-context ; } ; f'
alias kn='f() { [ "$1" ] && kubectl config set-context --current --namespace $1 || kubectl config view --minify | grep namespace | cut -d" " -f6 ; } ; f'      

Kubectl apply

​apply​

​​ 通過定義 Kubernetes 資源的檔案來管理應用。 它通過運作 ​

​kubectl apply​

​​ 在叢集中建立和更新資源。 這是在生産中管理 Kubernetes 應用的推薦方法。 參見 ​​Kubectl 文檔​​。

建立對象

Kubernetes 配置可以用 YAML 或 JSON 定義。可以使用的檔案擴充名有 ​

​.yaml​

​​、​

​.yml​

​​ 和 ​

​.json​

​。

kubectl apply -f ./my-manifest.yaml           # 建立資源
kubectl apply -f ./my1.yaml -f ./my2.yaml     # 使用多個檔案建立
kubectl apply -f ./dir                        # 基于目錄下的所有清單檔案建立資源
kubectl apply -f https://git.io/vPieo         # 從 URL 中建立資源
kubectl create deployment nginx --image=nginx # 啟動單執行個體 nginx

# 建立一個列印 “Hello World” 的 Job
kubectl create job hello --image=busybox:1.28 -- echo "Hello World" 

# 建立一個列印 “Hello World” 間隔1分鐘的 CronJob
kubectl create cronjob hello --image=busybox:1.28   --schedule="*/1 * * * *" -- echo "Hello World"    

kubectl explain pods                          # 擷取 pod 清單的文檔說明

# 從标準輸入建立多個 YAML 對象
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: busybox-sleep
spec:
  containers:
  - name: busybox
    image: busybox:1.28
    args:
    - sleep
    - "1000000"
---
apiVersion: v1
kind: Pod
metadata:
  name: busybox-sleep-less
spec:
  containers:
  - name: busybox
    image: busybox:1.28
    args:
    - sleep
    - "1000"
EOF

# 建立有多個 key 的 Secret
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  password: $(echo -n "s33msi4" | base64 -w0)
  username: $(echo -n "jane" | base64 -w0)
EOF      

檢視和查找資源

# get 指令的基本輸出
kubectl get services                          # 列出目前命名空間下的所有 services
kubectl get pods --all-namespaces             # 列出所有命名空間下的全部的 Pods
kubectl get pods -o wide                      # 列出目前命名空間下的全部 Pods,并顯示更詳細的資訊
kubectl get deployment my-dep                 # 列出某個特定的 Deployment
kubectl get pods                              # 列出目前命名空間下的全部 Pods
kubectl get pod my-pod -o yaml                # 擷取一個 pod 的 YAML

# describe 指令的詳細輸出
kubectl describe nodes my-node
kubectl describe pods my-pod

# 列出目前名字空間下所有 Services,按名稱排序
kubectl get services --sort-by=.metadata.name

# 列出 Pods,按重新開機次數排序
kubectl get pods --sort-by='.status.containerStatuses[0].restartCount'

# 列舉所有 PV 持久卷,按容量排序
kubectl get pv --sort-by=.spec.capacity.storage

# 擷取包含 app=cassandra 标簽的所有 Pods 的 version 标簽
kubectl get pods --selector=app=cassandra -o \
  jsonpath='{.items[*].metadata.labels.version}'

# 檢索帶有 “.” 鍵值,例: 'ca.crt'
kubectl get configmap myconfig \
  -o jsonpath='{.data.ca\.crt}'

# 檢索一個 base64 編碼的值,其中的鍵名應該包含減号而不是下劃線。
kubectl get secret my-secret --template='{{index .data "key-name-with-dashes"}}'

# 擷取所有工作節點(使用選擇器以排除标簽名稱為 'node-role.kubernetes.io/control-plane' 的結果)
kubectl get node --selector='!node-role.kubernetes.io/control-plane'

# 擷取目前命名空間中正在運作的 Pods
kubectl get pods --field-selector=status.phase=Running

# 擷取全部節點的 ExternalIP 位址
kubectl get nodes -o jsonpath='{.items[*].status.addresses[?(@.type=="ExternalIP")].address}'

# 列出屬于某個特定 RC 的 Pods 的名稱
# 在轉換對于 jsonpath 過于複雜的場合,"jq" 指令很有用;可以在 https://stedolan.github.io/jq/ 找到它。
sel=${$(kubectl get rc my-rc --output=json | jq -j '.spec.selector | to_entries | .[] | "\(.key)=\(.value),"')%?}
echo $(kubectl get pods --selector=$sel --output=jsnotallow={.items..metadata.name})

# 顯示所有 Pods 的标簽(或任何其他支援标簽的 Kubernetes 對象)
kubectl get pods --show-labels

# 檢查哪些節點處于就緒狀态
JSONPATH='{range .items[*]}{@.metadata.name}:{range @.status.conditions[*]}{@.type}={@.status};{end}{end}' \
 && kubectl get nodes -o jsonpath="$JSONPATH" | grep "Ready=True"

# 不使用外部工具來輸出解碼後的 Secret
kubectl get secret my-secret -o go-template='{{range $k,$v := .data}}{{"### "}}{{$k}}{{"\n"}}{{$v|base64decode}}{{"\n\n"}}{{end}}'

# 列出被一個 Pod 使用的全部 Secret
kubectl get pods -o json | jq '.items[].spec.containers[].env[]?.valueFrom.secretKeyRef.name' | grep -v null | sort | uniq

# 列舉所有 Pods 中初始化容器的容器 ID(containerID)
# 可用于在清理已停止的容器時避免删除初始化容器
kubectl get pods --all-namespaces -o jsonpath='{range .items[*].status.initContainerStatuses[*]}{.containerID}{"\n"}{end}' | cut -d/ -f3

# 列出事件(Events),按時間戳排序
kubectl get events --sort-by=.metadata.creationTimestamp

# 比較目前的叢集狀态和假定某清單被應用之後的叢集狀态
kubectl diff -f ./my-manifest.yaml

# 生成一個句點分隔的樹,其中包含為節點傳回的所有鍵
# 在複雜的嵌套JSON結構中定位鍵時非常有用
kubectl get nodes -o json | jq -c 'paths|join(".")'

# 生成一個句點分隔的樹,其中包含為pod等傳回的所有鍵
kubectl get pods -o json | jq -c 'paths|join(".")'

# 假設你的 Pods 有預設的容器和預設的名字空間,并且支援 'env' 指令,可以使用以下腳本為所有 Pods 生成 ENV 變量。
# 該腳本也可用于在所有的 Pods 裡運作任何受支援的指令,而不僅僅是 'env'。 
for pod in $(kubectl get po --output=jsnotallow={.items..metadata.name}); do echo $pod && kubectl exec -it $pod -- env; done

# 擷取一個 Deployment 的 status 子資源
kubectl get deployment nginx-deployment --subresource=status      

更新資源

kubectl set image deployment/frontend www=image:v2               # 滾動更新 "frontend" Deployment 的 "www" 容器鏡像
kubectl rollout history deployment/frontend                      # 檢查 Deployment 的曆史記錄,包括版本
kubectl rollout undo deployment/frontend                         # 復原到上次部署版本
kubectl rollout undo deployment/frontend --to-revision=2         # 復原到特定部署版本
kubectl rollout status -w deployment/frontend                    # 監視 "frontend" Deployment 的滾動更新狀态直到完成
kubectl rollout restart deployment/frontend                      # 輪替重新開機 "frontend" Deployment

cat pod.json | kubectl replace -f -                              # 通過傳入到标準輸入的 JSON 來替換 Pod

# 強制替換,删除後重建資源。會導緻服務不可用。
kubectl replace --force -f ./pod.json

# 為多副本的 nginx 建立服務,使用 80 端口提供服務,連接配接到容器的 8000 端口。
kubectl expose rc nginx --port=80 --target-port=8000

# 将某單容器 Pod 的鏡像版本(标簽)更新到 v4
kubectl get pod mypod -o yaml | sed 's/\(image: myimage\):.*$/\1:v4/' | kubectl replace -f -

kubectl label pods my-pod new-label=awesome                      # 添加标簽
kubectl annotate pods my-pod icon-url=http://goo.gl/XXBTWq       # 添加注解
kubectl autoscale deployment foo --min=2 --max=10                # 對 "foo" Deployment 自動伸縮容      

部分更新資源

# 部分更新某節點
kubectl patch node k8s-node-1 -p '{"spec":{"unschedulable":true}}'

# 更新容器的鏡像;spec.containers[*].name 是必須的。因為它是一個合并性質的主鍵。
kubectl patch pod valid-pod -p '{"spec":{"containers":[{"name":"kubernetes-serve-hostname","image":"new image"}]}}'

# 使用帶位置數組的 JSON patch 更新容器的鏡像
kubectl patch pod valid-pod --type='json' -p='[{"op": "replace", "path": "/spec/containers/0/image", "value":"new image"}]'

# 使用帶位置數組的 JSON patch 禁用某 Deployment 的 livenessProbe
kubectl patch deployment valid-deployment  --type json   -p='[{"op": "remove", "path": "/spec/template/spec/containers/0/livenessProbe"}]'

# 在帶位置數組中添加元素
kubectl patch sa default --type='json' -p='[{"op": "add", "path": "/secrets/1", "value": {"name": "whatever" } }]'

# 通過修正 scale 子資源來更新 Deployment 的副本數
kubectl patch deployment nginx-deployment --subresource='scale' --type='merge' -p '{"spec":{"replicas":2}}'      

編輯資源

使用你偏愛的編輯器編輯 API 資源。

kubectl edit svc/docker-registry                      # 編輯名為 docker-registry 的服務
KUBE_EDITOR="nano" kubectl edit svc/docker-registry   # 使用其他編輯器      

對資源進行伸縮

kubectl scale --replicas=3 rs/foo                                 # 将名為 'foo' 的副本集伸縮到 3 副本
kubectl scale --replicas=3 -f foo.yaml                            # 将在 "foo.yaml" 中的特定資源伸縮到 3 個副本
kubectl scale --current-replicas=2 --replicas=3 deployment/mysql  # 如果名為 mysql 的 Deployment 的副本目前是 2,那麼将它伸縮到 3
kubectl scale --replicas=5 rc/foo rc/bar rc/baz                   # 伸縮多個副本控制器      

删除資源

kubectl delete -f ./pod.json                                              # 删除在 pod.json 中指定的類型和名稱的 Pod
kubectl delete pod,service baz foo                                        # 删除名稱為 "baz" 和 "foo" 的 Pod 和服務
kubectl delete pods,services -l name=myLabel                              # 删除包含 name=myLabel 标簽的 pods 和服務
kubectl -n my-ns delete pod,svc --all                                     # 删除在 my-ns 名字空間中全部的 Pods 和服務
# 删除所有與 pattern1 或 pattern2 awk 模式比對的 Pods
kubectl get pods  -n mynamespace --no-headers=true | awk '/pattern1|pattern2/{print $1}' | xargs  kubectl delete -n mynamespace pod      

與運作中的 Pod 進行互動

kubectl logs my-pod                                 # 擷取 pod 日志(标準輸出)
kubectl logs -l name=myLabel                        # 擷取含 name=myLabel 标簽的 Pods 的日志(标準輸出)
kubectl logs my-pod --previous                      # 擷取上個容器執行個體的 pod 日志(标準輸出)
kubectl logs my-pod -c my-container                 # 擷取 Pod 容器的日志(标準輸出, 多容器場景)
kubectl logs -l name=myLabel -c my-container        # 擷取含 name=myLabel 标簽的 Pod 容器日志(标準輸出, 多容器場景)
kubectl logs my-pod -c my-container --previous      # 擷取 Pod 中某容器的上個執行個體的日志(标準輸出, 多容器場景)
kubectl logs -f my-pod                              # 流式輸出 Pod 的日志(标準輸出)
kubectl logs -f my-pod -c my-container              # 流式輸出 Pod 容器的日志(标準輸出, 多容器場景)
kubectl logs -f -l name=myLabel --all-containers    # 流式輸出含 name=myLabel 标簽的 Pod 的所有日志(标準輸出)
kubectl run -i --tty busybox --image=busybox:1.28 -- sh  # 以互動式 Shell 運作 Pod
kubectl run nginx --image=nginx -n mynamespace      # 在 “mynamespace” 命名空間中運作單個 nginx Pod
kubectl run nginx --image=nginx                     # 運作 ngins Pod 并将其規約寫入到名為 pod.yaml 的檔案
  --dry-run=client -o yaml > pod.yaml

kubectl attach my-pod -i                            # 挂接到一個運作的容器中
kubectl port-forward my-pod 5000:6000               # 在本地計算機上偵聽端口 5000 并轉發到 my-pod 上的端口 6000
kubectl exec my-pod -- ls /                         # 在已有的 Pod 中運作指令(單容器場景)
kubectl exec --stdin --tty my-pod -- /bin/sh        # 使用互動 shell 通路正在運作的 Pod (一個容器場景)
kubectl exec my-pod -c my-container -- ls /         # 在已有的 Pod 中運作指令(多容器場景)
kubectl top pod POD_NAME --containers               # 顯示給定 Pod 和其中容器的監控資料
kubectl top pod POD_NAME --sort-by=cpu              # 顯示給定 Pod 的名額并且按照 'cpu' 或者 'memory' 排序      

從容器中複制檔案和目錄

kubectl cp /tmp/foo_dir my-pod:/tmp/bar_dir            # 将 /tmp/foo_dir 本地目錄複制到遠端目前命名空間中 Pod 中的 /tmp/bar_dir
kubectl cp /tmp/foo my-pod:/tmp/bar -c my-container    # 将 /tmp/foo 本地檔案複制到遠端 Pod 中特定容器的 /tmp/bar 下
kubectl cp /tmp/foo my-namespace/my-pod:/tmp/bar       # 将 /tmp/foo 本地檔案複制到遠端 “my-namespace” 命名空間内指定 Pod 中的 /tmp/bar
kubectl cp my-namespace/my-pod:/tmp/foo /tmp/bar       # 将 /tmp/foo 從遠端 Pod 複制到本地 /tmp/bar      

說明: ​

​kubectl cp​

​​ 要求容器鏡像中存在 “tar” 二進制檔案。如果 “tar” 不存在,​

​kubectl cp​

​​ 将失敗。 對于進階用例,例如符号連結、通配符擴充或保留檔案權限,請考慮使用 ​

​kubectl exec​

​。

tar cf - /tmp/foo | kubectl exec -i -n my-namespace my-pod -- tar xf - -C /tmp/bar  # 将 /tmp/foo 本地檔案複制到遠端 “my-namespace” 命名空間中 pod 中的 /tmp/bar
kubectl exec -n my-namespace my-pod -- tar cf - /tmp/foo | tar xf - -C /tmp/bar    # 将 /tmp/foo 從遠端 pod 複制到本地 /tmp/bar      

與 Deployments 和 Services 進行互動

kubectl logs deploy/my-deployment                         # 擷取一個 Deployment 的 Pod 的日志(單容器例子)
kubectl logs deploy/my-deployment -c my-container         # 擷取一個 Deployment 的 Pod 的日志(多容器例子)

kubectl port-forward svc/my-service 5000                  # 偵聽本地端口 5000 并轉發到 Service 後端端口 5000
kubectl port-forward svc/my-service 5000:my-service-port  # 偵聽本地端口 5000 并轉發到名字為 <my-service-port> 的 Service 目标端口

kubectl port-forward deploy/my-deployment 5000:6000       # 偵聽本地端口 5000 并轉發到 <my-deployment> 建立的 Pod 裡的端口 6000
kubectl exec deploy/my-deployment -- ls                   # 在 Deployment 裡的第一個 Pod 的第一個容器裡運作指令(單容器和多容器例子)      

與節點和叢集進行互動

kubectl cordon my-node                                                # 标記 my-node 節點為不可排程
kubectl drain my-node                                                 # 對 my-node 節點進行清空操作,為節點維護做準備
kubectl uncordon my-node                                              # 标記 my-node 節點為可以排程
kubectl top node my-node                                              # 顯示給定節點的路徑成本
kubectl cluster-info                                                  # 顯示主要節點和服務的位址
kubectl cluster-info dump                                             # 将目前叢集狀态轉儲到标準輸出
kubectl cluster-info dump --output-directory=/path/to/cluster-state   # 将目前叢集狀态輸出到 /path/to/cluster-state

# 檢視目前節點上存在的現有污點。
kubectl get nodes -o=custom-columns=NodeName:.metadata.name,TaintKey:.spec.taints[*].key,TaintValue:.spec.taints[*].value,TaintEffect:.spec.taints[*].effect

# 如果已存在具有指定鍵和效果的污點,則替換其值為指定值。
kubectl taint nodes foo dedicated=special-user:NoSchedule      

資源類型

列出所支援的全部資源類型和它們的簡稱、​​API 組​​​, 是否是​​名字空間作用域​​​ 和 ​​Kind​​。

kubectl api-resources      

用于探索 API 資源的其他操作:

kubectl api-resources --namespaced=true      # 所有命名空間作用域的資源
kubectl api-resources --namespaced=false     # 所有非命名空間作用域的資源
kubectl api-resources -o name                # 用簡單格式列舉所有資源(僅顯示資源名稱)
kubectl api-resources -o wide                # 用擴充格式列舉所有資源(又稱 "wide" 格式)
kubectl api-resources --verbs=list,get       # 支援 "list" 和 "get" 請求動詞的所有資源
kubectl api-resources --api-group=extensions # "extensions" API 組中的所有資源      

格式化輸出

要以特定格式将詳細資訊輸出到終端視窗,将 ​

​-o​

​​(或者 ​

​--output​

​​)參數添加到支援的 ​

​kubectl​

​ 指令中。

使用 ​

​-o=custom-columns​

​ 的示例:

# 叢集中運作着的所有鏡像
kubectl get pods -A -o=custom-columns='DATA:spec.containers[*].image'

# 列舉 default 名字空間中運作的所有鏡像,按 Pod 分組
kubectl get pods --namespace default --output=custom-columns="NAME:.metadata.name,IMAGE:.spec.containers[*].image"

# 除 "k8s.gcr.io/coredns:1.6.2" 之外的所有鏡像
kubectl get pods -A -o=custom-columns='DATA:spec.containers[?(@.image!="k8s.gcr.io/coredns:1.6.2")].image'

# 輸出 metadata 下面的所有字段,無論 Pod 名字為何
kubectl get pods -A -o=custom-columns='DATA:metadata.*'      

繼續閱讀