天天看點

程式解Bug最常用的K8s指令,外加使用竅門

K8s 是時下最流行的容器"作業系統",雖然已經流行了好幾年了,不過作為開發人員想要熟練的使用它,除了了解它的各個元件的職責、行為特性之外,還得熟記它的 CLI 指令工具 kubectl 。

想要讓 K8s 聽從我們的調遣,我們就得通過 kubectl 給它發送訓示才行,可是這麼多操作我們全看一遍真的是挺耗費腦力的,更别提記下來了。

是以今天給大家總結了幾個最常用也最實用的指令操作,以後實在忘了,翻開看看馬上就能撿起來。嗯,平時用的 go mod 和 maven 那些指令,我就能記住常用的那兩三個,解決依賴問題的時候每次都上搜尋引擎,時候長了就搞了個筆記,用到了翻一翻。

感覺沒了這些筆記和搜尋引擎我已經不會幹活了...

好了,閑話不多說,馬上開始。

Kubectl 的文法結構

首先我們來了解一下K8s 的 CLI 指令工具 kubectl 它的文法結構是什麼樣的,不然就真得每個操作都靠抄了。

所有的 K8s 指令操作在 CLI 中都使用以下結構:

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

這個指令文法中每個部分的順序不能調換,否則 K8s 就不了解我們要幹什麼了。

command

command 部分描述了要執行的操作類型,主要的操作類型有:

create 從檔案或指令行輸入提供的配置,生成資源對象。

describe 檢索資源對象的詳細資訊

get 擷取各種資源在叢集裡的資訊

delete 從叢集中删除需要擦除的資源對象

apply 搭配聲明檔案使用,把資源對象的定義送出給叢集,由叢集進行應用。

TYPE

指令操作中的 TYPE 部分用于制定 kubectl 發起的操作,所針對的資源類型。常用的資源類型有 pod , service , deployment , statefulset , node 這些。

NAME

NAME 部分區分大小寫,是K8s裡資源對象的唯一辨別,用于制定指定 TYPE 部分指明的相關資源的名稱。将名稱附加到指令操作上會将該指令操作隻對該資源對象遊泳。

flags

flags 部分表示對特定資源的特殊選項或請求。它們是用作覆寫預設值或環境變量。

比如任何 kubectl 發起的指令操作,都是在 default 這個命名空間下起作用的,想要作用到其他命名空間,可以通過在 flags 部分用 -n 選項指定命名空間,例如:

kubectl get pod -n web      

就是檢視 web 命名空間下有哪些 pod 資源。

好了下面列舉幾個非常實用的指令操作,建議收藏。

實用指令推薦

  1. 檢視所有命名空間下的資源

    命名空間在 K8s 中非常重要。它們是一種在叢集中隔離某些資源組,然後相應地管理它們的機制。命名空間提供的可見性隔離在 K8s 中也起着至關重要的作用。

預設我們所有指令生效的命名空間都是 default 。

kubectl get pods      

那麼有時候在查問題,看叢集大體布局的時候,往往需要看某類資源在叢集中整體的情況,這就需要能查出所有命名空間下的資訊,這個時候我們可以在 flags 部分使用 --all-namespaces 選項:

kubectl get pods --all-namespaces      
  1. 查詢命名空間下所有在運作的pod
kubectl get pods --field-selector=status.phase=Running      

這個就不多解釋了,其實擅用 —field-selector 能根據資源的屬性查出各種在某個狀态、擁有某個屬性值的資源。

那怎麼知道某個類型的資源對象有哪些屬性值呢,畢竟K8s資源的類型十幾種,每種的屬性就更多了,這個時候就可以看下個指令。

  1. 查詢資源當下在叢集中的屬性
kubectl get pod pod-name -o=yaml      

上面這個指令就能把指定名稱的 pod 對象在叢集中目前擁有的屬性以 YAML 格式的形式全列印出來,也支援JSON格式。

這裡例子裡 TYPE 部分用的是 pod,可以替換成任何K8s支援的資源類型,檢視他們的屬性。

  1. 送出資源給叢集應用,并記錄版本

    送出資源定義,讓叢集進行應用排程,我們統一用的是

kubectl apply -f resources.yaml      

不過,如果你想用K8s中-- Deployment資源的復原能力的話,還得讓K8s記住每個版本都送出了什麼,這個功能可以通過 --record 選項開啟。

kubectl apply -f resources.yaml --record      
  1. 檢視資源對象的事件資訊

    有的時候,Pod 挂了,一直停在挂起狀态,這個時候就需要看看它經理過哪些事件了,好做排查。

kubectl describe pod pod-name       

時候回列印出來這個 Pod 經曆過的所有事件資訊

Events:
  Type     Reason     Age                  From               Message
  ----     ------     ----                 ----               -------
  Warning  Failed     20s (x4 over 2m4s)   kubelet            Failed to pull image "xxx
 ": rpc error: code = Unknown desc = Error response from daemon: manifest for xxx not found: manifest unknown: manifest unknown
  Warning  Failed     20s (x4 over 2m4s)   kubelet            Error: ErrImagePull
  Normal   BackOff    4s (x5 over 2m4s)    kubelet            Back-off pulling image "xxx"
  Warning  Failed     4s (x5 over 2m4s)    kubelet            Error: ImagePullBackOff      
  1. 檢視容器日志

    我們所有的應用在K8s運作前都是先封裝在容器裡,再以 Pod 為機關排程到叢集上的,那麼一旦不符合預期,有錯的時候,肯定第一時間想到的是看日志,這時候就需要用到下面這個指令:

kubectl  logs <podname> -n <namespace>      
kubectl logs <podname> --previous