本文發表於一年多前。舊文章可能包含過時內容。請檢查頁面中的資訊自發布以來是否已變得不正確。

一些你不知道的關於 kubectl 的事情

kubectl 是與 Kubernetes 叢集互動的命令列工具。許多人每天都用它將容器工作負載部署到生產叢集中。但 kubectl 的功能遠不止 kubectl create -f 或 kubectl rolling-update。kubectl 實際上是一個多功能容器編排和管理工具。下面我們將介紹一些您可能沒見過 kubectl 功能。

執行互動式命令

kubectl run 自 kubectl 1.0 版本釋出以來一直存在,但最近我們增加了在叢集中執行互動式容器的功能。這意味著在您的 Kubernetes 叢集中,只需一個命令即可獲得互動式 shell:

$> kubectl run -i --tty busybox --image=busybox --restart=Never -- sh
Waiting for pod default/busybox-tv9rm to be running, status is Pending, pod ready: false
Waiting for pod default/busybox-tv9rm to be running, status is Running, pod ready: false
$> # ls 
bin dev etc home proc root sys tmp usr var 
$> # exit

上面的 kubectl 命令等同於 docker run -i -t busybox sh。遺憾的是,我們在 kubectl 1.0 中錯誤地將 -t 用作模板,因此我們需要保留與現有 CLI 使用者的向後相容性。但 -t 的現有用法已被棄用,我們最終會將 --tty 縮短為 -t

在此示例中,-i 表示您希望為容器分配 stdin 並表示您希望進行互動式會話,--restart=Never 表示在您退出終端後容器不應重新啟動,--tty 請求為該會話分配一個 TTY。

檢視 Pod 日誌

有時您只是想檢視伺服器上正在發生什麼。為此,請使用 kubectl logs 子命令。新增 -f 標誌可以即時將新日誌流式傳輸到您的終端,就像 tail -f 一樣。

$> kubectl logs -f redis-izl09

連線到現有容器

除了互動式執行命令之外,您現在還可以連線到任何正在執行的程序。像 kubectl logs 一樣,您將獲得 stderr 和 stdout 資料,但使用 attach,您還可以將 stdin 從您的終端傳送到程式。這對於互動式除錯,甚至只是向行為不當的應用程式傳送 ctrl-c 都非常有用。

$> kubectl attach redis -i

1:C 12 Oct 23:05:11.848 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf

                _._                
           _.-``__''-._            
      _.-`` `. `_. ''-._ Redis 3.0.3 (00000000/0) 64 bit
  .-`` .-```. ```\/ _.,_ ''-._     
 ( ' , .-` | `, ) Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'| Port: 6379
 | `-._ `._ / _.-' | PID: 1
  `-._ `-._ `-./ _.-' _.-'         
 |`-._`-._ `-.__.-' _.-'_.-'|      
 | `-._`-._ _.-'_.-' | http://redis.io
`-._ `-._`-.__.-'_.-' _.-'         
 |`-._`-._ `-.__.-' _.-'_.-'|      
 | `-._`-._ _.-'_.-' |             
  `-._ `-._`-.__.-'_.-' _.-'       
      `-._ `-.__.-' _.-'           
          `-._ _.-'                
              `-.__.-'             

1:M 12 Oct 23:05:11.849 # Server started, Redis version 3.0.3

將埠從 Pod 轉發到本地計算機

出於安全原因,您通常希望能夠臨時與叢集中的應用程式進行通訊,而無需將它們暴露給公共網際網路。為此,port-forward 命令允許您透過 Kubernetes API 伺服器將本地計算機上的埠安全地轉發到叢集中執行的 Pod。例如:

$> kubectl port-forward redis-izl09 6379

在您的本地機器上開啟埠 6379,並將流向該埠的通訊轉發到叢集中的 Pod 或 Service。例如,您可以使用 telnet 命令探測叢集中的 Redis 服務

$> telnet localhost 6379 
INCR foo
:1
INCR foo 
:2

在現有容器中執行命令

除了能夠附加到容器內部的現有程序之外,exec 命令還允許您在現有容器內部生成新程序。這對於除錯或檢查您的 pod 以檢視內部情況而不會中斷正在執行的服務很有用。kubectl execkubectl run 不同,因為它在**現有**容器內部執行命令,而不是生成一個新容器來執行。

$> kubectl exec redis-izl09 -- ls /
bin
boot
data
dev
entrypoint.sh
etc
home

新增或刪除標籤

有時您需要動態地從 Pod、Service 或 Replication controller 新增或刪除標籤。也許您想將現有 Pod 新增到 Service 中,或者您想從 Service 中刪除 Pod。無論您想要什麼,您都可以使用 kubectl label 子命令輕鬆動態地新增或刪除標籤

`$> kubectl label pods redis-izl09 mylabel=awesome `
`pod "redis-izl09" labeled`

為您的物件添加註解

與標籤一樣,您可以使用 kubectl annotate 子命令從 API 物件新增或刪除註解。與標籤不同,註解用於描述您的物件,但不用於透過標籤查詢識別 pod(更多關於註解的詳細資訊)。例如,您可以新增一個圖標註解,供 GUI 用於顯示您的 pod。

$> kubectl annotate pods redis-izl09 icon-url=http://goo.gl/XXBTWq
pod "redis-izl09" annotated

輸出自定義格式

有時,您希望自定義 kubectl 彙總叢集中的物件時顯示的欄位。為此,您可以使用 custom-columns-file 格式。custom-columns-file 接受一個用於渲染輸出的模板檔案。同樣,模板中使用 JSONPath 表示式來指定 API 物件中的欄位。例如,以下模板首先顯示重啟次數,然後顯示物件的名稱

$> cat cols.tmpl
RESTARTS                                   NAME
.status.containerStatuses[0].restartCount .metadata.name

如果您將此模板傳遞給 kubectl get pods 命令,您將獲得一個包含指定欄位的 pod 列表。

$> kubectl get pods redis-izl09 -o=custom-columns-file --template=cols.tmpl                 RESTARTS           NAME   
 0                  redis-izl09   
 1                  redis-abl42  

輕鬆管理多個 Kubernetes 叢集

如果您執行多個 Kubernetes 叢集,您會知道管理不同叢集的所有憑證可能很棘手。使用 kubectl config 子命令,在不同叢集之間切換就像以下操作一樣簡單:

$> kubectl config use-context

不確定有哪些叢集可用?您可以透過以下方式檢視當前配置的叢集:

$> kubectl config view

呼,這輸出了一大堆文字。為了將其限制在我們感興趣的內容,我們可以使用 JSONPath 模板

$> kubectl config view -o jsonpath="{.context[*].name}"

啊,這樣好多了。

結論

就是這樣,您可以透過 Kubernetes 叢集和 kubectl 命令列完成九件激動人心的新事情。如果您剛剛開始使用 Kubernetes,請檢視 Google Container Engine 或其他 Kubernetes 入門方式