程式解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
2. 查詢名稱空間下所有在執行的pod
kubectl get pods --field-selector=status.phase=Running
這個就不多解釋了,其實擅用 —field-selector
能根據資源的屬性查出各種在某個狀態、擁有某個屬性值的資源。
那怎麼知道某個型別的資源物件有哪些屬性值呢,畢竟K8s資源的型別十幾種,每種的屬性就更多了,這個時候就可以看下個命令。
3. 查詢資源當下在叢集中的屬性
kubectl get pod pod-name -o=yaml
上面這個命令就能把指定名稱的 pod 物件在叢集中當前擁有的屬性以 YAML
格式的形式全打印出來,也支援JSON格式。
這裡例子裡 TYPE 部分用的是 pod,可以替換成任何K8s支援的資源型別,檢視他們的屬性。
4. 提交資源給叢集應用,並記錄版本
提交資源定義,讓叢集進行應用排程,我們統一用的是
kubectl apply -f resources.yaml
不過,如果你想用K8s中-- Deployment資源的回滾能力的話,還得讓K8s記住每個版本都提交了什麼,這個功能可以通過 --record
選項開啟。
kubectl apply -f resources.yaml --record
5. 檢視資源物件的事件資訊
有的時候,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
同樣除了Pod外,用describe還能看其他資源的事件。
6. 檢視容器日誌
我們所有的應用在K8s執行前都是先封裝在容器裡,再以 Pod 為單位排程到叢集上的,那麼一旦不符合預期,有錯的時候,肯定第一時間想到的是看日誌,這時候就需要用到下面這個命令:
kubectl logs <podname> -n <namespace>
如果恰巧這個 Pod 被重啟了,查不出來任何東西,可以通過增加 — previous 引數選項,檢視之前容器的日誌。
kubectl logs <podname> --previous
總結
今天給大家總結了幾個使用頻率高的K8s命令操作,其實最主要的還是第一部分講的命令語法結構,掌握了這個結構,我們只需要把各個資源型別、操作型別、資源名稱這些變數填空到結構裡就能指示 K8s 完成我們想要的操作啦。
- END -
掃碼關注公眾號「網管叨bi叨」
給網管個星標,第一時間吸我的知識 :point_up_2:
網管整理了一本《Go 開發參考書》收集了70多條開發實踐。去公眾號回覆【gocookbook】領取!還有一本《k8s 入門實踐》講解了常用軟體在K8s上的部署過程,公眾號回覆【k8s 】即可領取!
覺得有用就點個在看 :point_down::point_down::point_down:
- 程式解Bug最常用的K8s命令,外加使用竅門
- 分享三個閱讀 Go 原始碼的竅門
- 掌握了這一招,Go的多版本管理不用愁
- 去新公司後 Go和Java怎麼選,是全都要,還是?
- 做一個不崩潰的核酸系統到底有多難?
- 假期告急,這幾個大後端寶藏號讓你脈動回來
- 搞清PIP協議,對程式設計師來說可能比搞清TCP更重要
- 不想Go 錯誤處理太臃腫,可以參考這個程式碼設計
- 這十二個 Go 語法糖,利好每日摸魚
- 從 paxos 到 raft,聊聊一致性協議的挑戰和解決方案
- 網際網路公司常用的DevOps 工具,你都認識嗎?
- 拒絕Go程式碼臃腫,其實在這幾塊可以用下觀察者模式
- 你們說,不知道Go函式的呼叫慣例,影響我調函式嗎
- 用 channel 把 Go 程式寫崩的三種姿勢,你集齊過嗎?
- 效能敏感場景下,Go 三方庫的選型思路和案例分析
- 遠離P0線上事故,一個可以事前檢測 Go 洩漏的工具
- DDD - 領域驅動設計,是銀彈還是炒作?
- 微服務想搞好,訊息中介軟體不能少,Kafka基礎入門介紹
- 我在公司裡用 Go 給 Dubbo 寫中介軟體
- 他一個 Golang,你讓他做電商業務,他行嗎?