基礎命令
get
get命令用于獲取集群的一個或一些resource信息。
該命令可以列出集群所有資源的詳細信息,resource包括集群節點、運行的pod、Replication Controller、service等。
須知: 集群中可以創建多個namespace,未指定namespace的情況下,所有操作都是針對--namespace=default。
例如:
獲取所有pod的詳細信息:
kubectl get po -o wide
獲取所有namespace下的運行的所有pod:
kubectl get po --all-namespaces
獲取所有namespace下的運行的所有pod的標簽:
kubectl get po --show-labels
獲取該節點的所有命名空間:
kubectl get namespace
說明
查詢其他節點需要加-s指定節點,類似可以使用“kubectl get rc”,“kubectl get svc”,“kubectl get nodes”,“kubectl get deploy”等獲取其他resource信息。
以yaml格式輸出pod的詳細信息:
kubectl get po
以json格式輸出pod的詳細信息:
kubectl get po
kubectl get po rc-nginx-2-btv4j -o=custom-columns=LABELS:.metadata.labels.app
說明
其中LABELS為顯示的列標題,可以自己設置,“.metadata.labels.app”為查詢的數據需要按照之前的yaml或json獲取。
create
kubectl命令用于根據文件或輸入創建集群resource。
如果已經定義了相應resource的yaml或json文件,直接kubectl create -f filename即可創建文件內定義的resource。
kubectl create -f filename
expose
expose將一個資源包括pod、Replication Controller、service、deployment等公開為一個新的service。
kubectl expose deployment deployname --port=81 --type=NodePort --target-port=80 --name=service-name
說明
給deployname發布一個服務,-port為暴露出去的端口,-type為服務類型,-target-port為容器端口,port通過clusterip加端口訪問,target-port通過節點ip加端口訪問。
run
例如:
在集群中運行一個特定的鏡像。
kubectl run deployname --image=nginx:latest
在創建時指定運行的命令:
kubectl run deployname -image=busybox --command -- ping baidu.com
set
在對象上設置特定功能。
例如:
將一個deployname的image改為鏡像為1.0的image:
kubectl set image deploy deployname containername=containername:1.0
edit
edit提供了另一種更新resource源的操作。
例如:
使用edit直接更新pod的命令為:
kubectl edit po po-nginx-btv4j
上面命令的效果等效于:
kubectl get po po-nginx-btv4j -o yaml >> /tmp/nginx-tmp.yaml
vim /tmp/nginx-tmp.yaml
/*do some changes here */
kubectl replace -f /tmp/nginx-tmp.yaml
explain
查看文檔或參考資料。
例如:
查看pods/service的相關文檔:
kubectl explain pods,svc
delete
根據resource名或label刪除resource。
例如:
立刻刪除該pod:
kubectl delete po podname --now
kubectl delete -f nginx.yaml
kubectl delete deployment deployname
部署命令
rolling-update*
rolling-update是一個非常重要的命令,對于已經部署并且正在運行的業務,rolling-update提供了不中斷業務的更新方式。rolling-update每次起一個新的pod,等新pod完全起來后刪除一個舊的pod,然后再起一個新的pod替換舊的pod,直到替換掉所有的pod。rolling-update需要確保新的版本有不同的name,Version和label,否則會報錯
。
kubectl rolling-update poname -f newfilename
kubectl rolling-update poname -image=image:v2
如果在升級過程中,發現有問題可以中途停止update,并回滾到前面版本。
kubectl rolling-update poname -rollback
rollout
管理資源的發布。
例如:
查看指定資源的部署狀態:
kubectl rollout status deployment/deployname
查看指定資源的發布歷史:
kubectl rollout history deployment/deployname
回滾指定資源,默認回滾至上一個版本:
kubectl rollout undo deployment/test-nginx
scale
scale用于程序在負載加重或縮小時將副本進行擴容或縮小。
kubectl scale deployment deployname --replicas=newnumber
autoscale
autoscale命令提供了自動根據pod負載對其副本進行擴縮的功能。autoscale命令會給一個rc指定一個副本數的范圍,在實際運行中根據pod中運行的程序的負載自動在指定的范圍內對pod進行擴容或縮容。
kubectl autoscale deployment deployname --min=minnumber --max=maxnumber
集群管理命令
cordon、drain、uncordon*
有時候會遇到這樣一個場景,一個node需要升級,但是在該node上又有許多運行的pod,或者該node已經癱瘓,需要保證功能的完善,則需要使用這組命令,使用步驟如下:
步驟 1 使用cordon命令將一個node標記為不可調度。這意味著新的pod將不會被調度到該node上。
kubectl cordon nodename
步驟 2 使用drain命令,將運行在該node上運行的pod平滑的搬遷到其他節點上。
kubectl drain newnodename
步驟 3 對該節點進行一些節點維護的操作,如升級內核、升級Docker等。
步驟 4 節點維護完后,使用uncordon命令解鎖該node,使其重新變得可調度。
kubectl uncordon nodename
cluster-info
查看在集群中運行的插件:
kubectl cluster-info
查看詳細信息:
kubectl cluster-info dump
top*
顯示資源(CPU/Memory/Storage)使用。需要Heapster運行。
taint*
修改一個或多個節點上的taint。
certificate*
修改證書資源。
故障診斷和調試命令
describe
describe類似于get,同樣用于獲取resource的相關信息。不同的是,get獲得的是更詳細的resource個性的詳細信息,describe獲得的是resource集群相關的信息。describe命令同get類似,但是describe不支持-o選項,對于同一類型resource,describe輸出的信息格式,內容域相同。
說明:如果發現是查詢某個resource的信息,使用get命令能夠獲取更加詳盡的信息。但是如果想要查詢某個resource的狀態,如某個pod并不是在running狀態,這時需要獲取更詳盡的狀態信息時,就應該使用describe命令。
kubectl describe po
logs
logs命令用于顯示pod運行中,容器內程序輸出到標準輸出的內容。如果要獲得tail -f的方式,需使用-f選項。
kubectl logs -f podname
exec
與docker的exec用法相似,如果一個pod中,有多個容器,需要使用-c選項指定容器。
kubectl exec -it podname bash
kubectl exec -it podname -c containername bash
port-forward*
轉發一個或多個本地端口至一個pod。
例如:
轉發pod中的6000端口到本地的5000端口:
kubectl port -forward podname 5000:6000
proxy*
運行一個proxy到kubernetes api server。
例如:
控制節點開啟HTTP Rest接口:
kubectl proxy -accept-hosts=’.*’ -port=8001 -address=’0.0.0.0’
cp
拷貝文件或目錄到容器:
cp filename newfilename
auth*
檢查授權。
attach*
attach命令效果類似于logs -f,退出查看使用ctrl-c。如果一個pod中有多個容器,要查看具體的某個容器的輸出,需要在pod名后使用-c containername指定運行的容器。
kubectl attach podname -c containername
高級命令
replace
replace命令用于對已有資源進行更新、替換。當我們需要更新resource的一些屬性的時候,如果修改副本數量,增加、修改label,更改image版本,修改端口等。都可以直接修改原yaml文件,然后執行replace命令。
kubectl replace -f filename
須知:名字不能被更新。另外,如果是更新label,原有標簽的pod將會與更新label后的rc斷開聯系,有新label的rc將會創建指定副本數的新的pod,但是默認并不會刪除原來的pod。所以此時如果使用get
po將會發現pod數翻倍,進一步check會發現原來的pod已經不會被新rc控制。
apply*
apply命令提供了比patch,edit等更嚴格的更新resource的方式。通過apply,用戶可以將resource的configuration使用source
control的方式維護在版本庫中。每次有更新時,將配置文件push到server,然后使用kubectl
apply將更新應用到resource。kubernetes會在引用更新前將當前配置文件中的配置同已經應用的配置做比較,并只更新更改的部分,而不會主動更改任何用戶未指定的部分。apply命令的使用方式同replace相同,不同的是,apply不會刪除原有resource,然后創建新的。apply直接在原有resource的基礎上進行更新。同時kubectl
apply還會在resource中添加一條注釋,標記當前的apply,類似于git操作。
kubectl apply -f
patch
如果一個容器已經在運行,這時需要對一些容器屬性進行修改,又不想刪除容器,或不方便通過replace的方式進行更新。kubernetes還提供了一種在容器運行時,直接對容器進行修改的方式,就是patch命令。
例如已存在一個pod的label為app=nginx1,如果需要在運行過程中,將其修改為app=nginx2。
kubectl patch pod podname -p '{"metadata":{"lables":{"app":"nginx1"}}}'
convent*
不同的api版本之間轉換配置文件。
設置命令
label
更新資源上的標簽:
kubectl label pods my-pod new-label=newlabel
annotate
更新資源上的注釋:
kubectl label pods my-pod icon-url=//……
completion
用于實現kubectl工具自動補全。
其他命令
api-versions
打印受支持的api版本:
kubectl api-versions
api-resources
打印支持的api資源:
kubectl api-resources
config*
修改kubeconfig文件:用于訪問api,比如配置認證信息。
help
所有命令幫助。
version
打印客戶端和服務版本信息。
kubectl version