這篇文章已超過一年。較舊的文章可能包含過時的內容。請檢查頁面中的資訊自發布以來是否已變得不正確。
您可能不知道的 kubectl 功能
kubectl 是用於與 Kubernetes 叢集互動的命令列工具。許多人每天使用它將他們的容器工作負載部署到生產叢集中。但是 kubectl 的功能不僅僅是 kubectl create -f 或 kubectl rolling-update
。kubectl 是一個名副其實的容器編排和管理多功能工具。以下我們將介紹一些您可能沒有見過的 kubectl 功能。
執行互動式命令
kubectl run
自 1.0 版本以來就已存在於 kubectl 中,但最近我們新增了在您的叢集中執行互動式容器的功能。這表示在您的 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
用於 template,因此我們需要保留與現有 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 Service
$> telnet localhost 6379
INCR foo
:1
INCR foo
:2
在現有的容器內執行命令
除了能夠附加到容器內現有的程序之外,exec
命令還允許您在現有的容器內產生新的程序。這對於偵錯或檢查您的 Pod 以了解內部發生的情況非常有用,而不會中斷正在執行的 Service。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 的方法。