本文轉自:http://blog.csdn.net/xingwangc2014/article/details/51204224html
kubernetes經過kube-apiserver做爲整個集羣管理的入口。Apiserver是整個集羣的主管理節點,用戶經過Apiserver配置和組織集羣,同時集羣中各個節點同etcd存儲的交互也是經過Apiserver進行交互。Apiserver實現了一套RESTfull的接口,用戶能夠直接使用API同Apiserver交互。另外官方還提供了一個客戶端kubectl隨工具集打包,用於可直接經過kubectl以命令行的方式同集羣交互。node
因爲博主水平有限,本文主要介紹一些博主在平常中常用到的命令,另外最近正式release的kubernetes 1.2中新加入的的一些feature,因爲博主也尚未深刻研究,因此不會太多涉及。nginx
Usage: kubectl [flags] kubectl [commond]
另外全部的命令選項均可以經過執行 --help得到特定命令的幫助信息。git
Usage: kubectl get [(-o|--output=)json|yaml|wide|go-template=...|go-template-file=...|jsonpath=...|jsonpath-file=...] (TYPE [NAME | -l label] | TYPE/NAME ...) [flags] [flags]
1)例如獲取pod信息,能夠直接使用"kubectl get po「獲取當前運行的全部pods的信息,或使用」kubectl get po -o wide「獲取pod運行在哪一個節點上的信息。注:集羣中能夠建立多個namespace,未顯示的指定namespace的狀況下,全部操做都是針對default namespace。以下圖所示列出了default 和kube-system的pods:docker
2)獲取namespace信息shell
# kubectl get namespace
(2)kubectl get po <podname> -o json 以jison格式輸出pod的詳細信息。json
(3)另外還可使用」-o=custom-columns=「定義直接獲取指定內容的值。如前面使用json和ymal格式的輸出中,metadata.labels.app的值可使用以下命令獲取。 vim
kubectl get po rc-nginx-2-btv4j -o=custom-columns=LABELS:.metadata.labels.app
其中LABELS爲顯示的列標題,」.metadata.labels.app」爲查詢的域名api
(4)其餘資源也可使用相似的方式。app
kubectl describe po rc-nginx-2-btv4j
apiVersion: v1 kind: ReplicationController metadata: name: rc-nginx-2 spec: replicas: 2 template: metadata: labels: app: nginx-2 spec: containers: - name: nginx-2 image: xingwangc.docker.rg/nginx ports: - containerPort: 80
直接使用create則能夠基於rc-nginx.yaml文件建立出ReplicationController(rc),rc會建立兩個副本:
kubectl create -f rc-nginx.yaml
建立後,使用「kubectl get rc」能夠看到一個名爲rc-nginx-2的ReplicationController將被建立,同時「kubectl get po」的結果中會多出兩個前綴爲「rc-nginx-2-」的pod。關於kubernetes集羣中resource,pod, ReplicationController…等後續會新開博文詳細介紹。
kubectl replace -f rc-nginx.yaml
若是一個容器已經在運行,這時須要對一些容器屬性進行修改,又不想刪除容器,或不方便經過replace的方式進行更新。kubernetes還提供了一種在容器運行時,直接對容器進行修改的方式,就是patch命令。
如前面建立pod的label是app=nginx-2,若是在運行過程當中,須要把其label改成app=nginx-3,這patch命令以下:
kubectl patch pod rc-nginx-2-kpiqt -p '{"metadata":{"labels":{"app":"nginx-3"}}}'
edit提供了另外一種更新resource源的操做,經過edit可以靈活的在一個common的resource基礎上,發展出更過的significant resource。例如,使用edit直接更新前面建立的pod的命令爲:
kubectl edit po rc-nginx-btv4j
上面命令的效果等效於:
kubectl get po rc-nginx-btv4j -o yaml >> /tmp/nginx-tmp.yaml vim /tmp/nginx-tmp.yaml /*do some changes here */ kubectl replace -f /tmp/nginx-tmp.yaml
根據resource名或label刪除resource。
kubectl delete -f rc-nginx.yaml kubectl delete po rc-nginx-btv4j kubectl delete po -lapp=nginx-2
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操做。
logs命令用於顯示pod運行中,容器內程序輸出到標準輸出的內容。跟docker的logs命令相似。若是要得到tail -f 的方式,也可使用-f選項。
kubectl logs rc-nginx-2-kpiqt
rolling-update是一個很是重要的命令,對於已經部署而且正在運行的業務,rolling-update提供了不中斷業務的更新方式。rolling-update每次起一個新的pod,等新pod徹底起來後刪除一箇舊的pod,而後再起一個新的pod替換舊的pod,直到替換掉全部的pod。
rolling-update須要確保新的版本有不一樣的name,Version和label,不然會報錯 。
kubectl rolling-update rc-nginx-2 -f rc-nginx.yaml
若是在升級過程當中,發現有問題還能夠中途中止update,並回滾到前面版本
kubectl rolling-update rc-nginx-2 —rollback
rolling-update還有不少其餘選項提供豐富的功能,如—update-period指定間隔週期,使用時可使用-h查看help信息
scale用於程序在負載加劇或縮小時副本進行擴容或縮小,如前面建立的nginx有兩個副本,能夠輕鬆的使用scale命令對副本數進行擴展或縮小。
擴展副本數到4:
kubectl scale rc rc-nginx-3 —replicas=4
從新縮減副本數到2:
kubectl scale rc rc-nginx-3 —replicas=2
scale雖然可以很方便的對副本數進行擴展或縮小,可是仍然須要人工介入,不能實時自動的根據系統負載對副本數進行擴、縮。autoscale命令提供了自動根據pod負載對其副本進行擴縮的功能。
autoscale命令會給一個rc指定一個副本數的範圍,在實際運行中根據pod中運行的程序的負載自動在指定的範圍內對pod進行擴容或縮容。如前面建立的nginx,能夠用以下命令指定副本範圍在1~4
kubectl autoscale rc rc-nginx-3 —min=1 —max=4
這三個命令是正式release的1.2新加入的命令,三個命令一塊兒介紹,是由於三個命令配合使用能夠實現節點的維護。在1.2以前,由於沒有相應的命令支持,若是要維護一個節點,只能stop該節點上的kubelet將該節點退出集羣,是集羣不在將新的pod調度到該節點上。若是該節點上本生就沒有pod在運行,則不會對業務有任何影響。若是該節點上有pod正在運行,kubelet中止後,master會發現該節點不可達,而將該節點標記爲notReady狀態,不會將新的節點調度到該節點上。同時,會在其餘節點上建立新的pod替換該節點上的pod。這種方式雖然可以保證集羣的健壯性,可是任然有些暴力,若是業務只有一個副本,並且該副本正好運行在被維護節點上的話,可能仍然會形成業務的短暫中斷。
1.2中新加入的這3個命令能夠保證維護節點時,平滑的將被維護節點上的業務遷移到其餘節點上,保證業務不受影響。以下圖所示是一個整個的節點維護的流程(爲了方便demo增長了一些查看節點信息的操做):1)首先查看當前集羣全部節點狀態,能夠看到共四個節點都處於ready狀態;2)查看當前nginx兩個副本分別運行在d-node1和k-node2兩個節點上;3)使用cordon命令將d-node1標記爲不可調度;4)再使用kubectl get nodes查看節點狀態,發現d-node1雖然還處於Ready狀態,可是同時還被禁能了調度,這意味着新的pod將不會被調度到d-node1上。4)再查看nginx狀態,沒有任何變化,兩個副本仍運行在d-node1和k-node2上;5)執行drain命令,將運行在d-node1上運行的pod平滑的趕到其餘節點上;6)再查看nginx的狀態發現,d-node1上的副本已經被遷移到k-node1上;這時候就能夠對d-node1進行一些節點維護的操做,如升級內核,升級Docker等;7)節點維護完後,使用uncordon命令解鎖d-node1,使其從新變得可調度;8)檢查節點狀態,發現d-node1從新變回Ready狀態。
attach命令相似於docker的attach命令,能夠直接查看容器中以daemon形式運行的進程的輸出,效果相似於logs -f,退出查看使用ctrl-c。若是一個pod中有多個容器,要查看具體的某個容器的的輸出,須要在pod名後使用-c containers name指定運行的容器。以下示例的命令爲查看kube-system namespace中的kube-dns-v9-rcfuk pod中的skydns容器的輸出。
kubectl attach kube-dns-v9-rcfuk -c skydns —namespace=kube-system
exec命令一樣相似於docker的exec命令,爲在一個已經運行的容器中執行一條shell命令,若是一個pod容器中,有多個容器,須要使用-c選項指定容器。
轉發一個本地端口到容器端口,博主通常都是使用yaml的方式編排容器,因此基本不使用此命令。
博主只嘗試過使用nginx做爲kubernetes多master HA方式的代理,沒有使用過此命令爲kubernetes api server運行過proxy