本文發表於一年多前。舊文章可能包含過時內容。請檢查頁面中的資訊自發布以來是否已變得不正確。
一些你不知道的關於 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 exec
與 kubectl 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 入門方式。