常用的kubectl命令


本文主要介紹kubernetes排查問題時經常用到的命令。這里主要借助kubectl命令來實現。以下列出常用命令,后面會對每個命令進行詳細解釋,並舉例:

kubectl核心命令

get  獲取列出一個或多個資源的信息。(資源分為pod、instance、service等很多種)
describe  輸出指定的一個/多個資源的詳細信息。(一般describe狀態有問題節點,如Pending等)
logs  輸出pod中一個容器的日志。(如果pod只包含一個容器則可以省略容器名)
apply  指定Yaml或Json,創建資源。(通過文件或者控制台輸入)
edit
編輯服務器上定義的資源。(文件默認輸出格式為YAML。要以JSON格式編輯,請指定“-o json”選項。)

rolling-update  執行指定ReplicationController的滾動更新。(不中斷業務的更新方式)
delete  刪除一個資源(可以是pod、instance等)
exec  在容器內部執行命令
 

一、get

獲取所有namespace:

kubectl get ns

 

在指定的namespace下獲取資源:

kubectl -n {$nameSpace} get pods

 

以yaml格式輸出資源:

kubectl -n {$nameSpace} -o yaml

 

通用格式:

kubectl get {$sourceType} --all-namespaces

 

常用的資源類型({$resourceType})有:

  • po(pod)
  • ns(命名空間namespace)
  • instance(實例)
  • svc(service服務):定義了一個 Pod 的邏輯分組,一種可以訪問它們的策略(微服務)。
  • cm(configMap):存儲全局配置變量的,將分布式系統中不同模塊的環境變量統一到一個對象中管理。
  • ds(deamonSet):在每台計算節點上運行一個守護進程(如日志采集等),有時pod處於pending可能是因為某個deamonSet沒起來。
  • deploy(deployment):用於啟動(上線/部署)一個Pod或者ReplicaSet。這個如果有問題,那么其他依賴它來部署的資源就肯定不會正常了。

-o支持的格式有

  • custom-columns=<spec>             根據自定義列名進行輸出,逗號分隔
  • custom-columns-file=<filename>       從文件中獲取自定義列名進行輸出
  • json                         以JSON格式顯示結果
  • jsonpath=<template>               輸出jasonpath表達式定義的字段信息
  • jasonpath-file=<filename>           輸出jsonpath表達式定義的字段信息,來源於文件
  • name                         僅輸出資源對象的名稱
  • wide                         輸出更多信息,比如會輸出node名
  • yaml                         以yaml格式輸出

二、describe 

描述一個資源:

kubectl -n {$nameSpace} describe {$resourceType} {$resourceName}

 

三、logs

查看日志,--tail指定只看最后1000行:

kubectl -n {$nameSpace} logs --tail=1000 {$podName} | less

 

五、apply

通過配置文件名創建一個集群資源對象。

kubectl apply -f {$yamlorJsonFilePath}

 

六、edit

編輯一個資源文件,這里以編輯configMap資源對象為例(yaml格式):

kubectl -n {$nameSpace} edit {$resourceType} {$resourceName} -o yaml

 

七、rolling-update

執行指定ReplicationController的滾動更新。該命令會創建一個新的RC,等新pod完全起來后刪除一個舊的pod,之后重復操作,直到替換掉所有的pod。

kubectl rolling-update {$resourceName} -f {$yamlFile} 

 

八、delete

指定資源類型和名字刪除一個資源:

kubectl -n {$nameSpace} delete {$resourceType} {$resourceName}

 

批量刪除資源:

kubectl -n {$nameSpace} delete {$resourceType} -l {$label}={$labelValue}

 

九、exec

exec主要作用是在容器內部執行命令(一般為查看容器內部日志),這里以一個小例子說明kubectl exec命令的作用。

 

場景描述:當我們用命令行,以root用戶身份登錄機器,要修改HDFS某個目錄權限。

此情況一般是不允許的,因為在HDFS中,最高權限並不是root用戶,而是hdfs用戶,這個時候如果更改,會提示權限不足。如下我們以root用戶登錄機器,想修改HDFS的/tmp/jbw目錄權限為777,發現此目錄並不屬於root組,沒權限修改。

 

 

查看/tmp/jbw目錄,發現其屬於hdfs組的hadoop用戶。

 

 

嘗試着用hdfs用戶去執行命令,發現本機上並沒有hdfs用戶,因為真正的hdfs用戶只存在於真實部署HDFS的容器內部。

 

 

但我們如果非要想改其權限應該怎么辦呢?那就用kubectl的exec命令,進入HDFS的任意一個namenode容器內部去更改就好(前提是以容器化方式部署HDFS)。

 1、獲取namenode的pod

kubectl get pods | grep namenode

 

結果如圖所示:

 

 

2、任選一個pod進入(利用kubectl exec命令)

kubectl exec -it hadoop-hdfs-namenode-hdfs1-765788744-21mft bash

 

如下已經進入所選pod: 

 

 

若看到~,表示進入成功(因為當前目錄有所變化,若是在不放心df -h看一下文件系統是否有變化也可)。

如果進入部署HDFS的容器pod內部(這里是進入了部署namenode的一個pod,理論上datenode也可以),這些pod里當然就有hdfs用戶了,接下來以hdfs用戶執行相應修改目錄權限命令即可。

sudo -u hdfs hadoop fs -chmod 777 /tmp/jbw

 

下圖即執行修改目錄權限命令結果:

 

 

exit退出當前pod,再查看一下HDFS上的/tmp/jbw目錄,就會發現,權限已修改!如下圖所示:

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM