Kubernetes之kubectl常用命令
https://blog.csdn.net/xingwangc2014/article/details/51204224
刪除所有po恬总,svc:刪除所有SVC和po
kubectl delete po,svc,statefulset,pv,pvc --all
kubernetes通過(guò)kube-apiserver作為整個(gè)集群管理的入口。Apiserver是整個(gè)集群的主管理節(jié)點(diǎn)峡钓,用戶通過(guò)Apiserver配置和組織集群优炬,同時(shí)集群中各個(gè)節(jié)點(diǎn)同etcd存儲(chǔ)的交互也是通過(guò)Apiserver進(jìn)行交互涤浇。Apiserver實(shí)現(xiàn)了一套R(shí)ESTfull的接口,用戶可以直接使用API同Apiserver交互。另外官方還提供了一個(gè)客戶端kubectl隨工具集打包扭弧,用于可直接通過(guò)kubectl以命令行的方式同集群交互。
類似于所有的命令行工具工具记舆,kubectl也可以直接執(zhí)行或 | 可獲得命令的幫助信息鸽捻。如下圖所示,kubectl使用方式為:
Usage:
kubectl[flags]
kubectl[commond]
另外所有的命令選項(xiàng)都可以通過(guò)執(zhí)行 --help獲得特定命令的幫助信息泽腮。
get命令用于獲取集群的一個(gè)或一些resource信息御蒲。使用--help查看詳細(xì)信息。kubectl的幫助信息诊赊、示例相當(dāng)詳細(xì)厚满,而且簡(jiǎn)單易懂。建議大家習(xí)慣使用幫助信息碧磅。kubectl可以列出集群所有resource的詳細(xì)碘箍。resource包括集群節(jié)點(diǎn)、運(yùn)行的pod鲸郊,ReplicationController丰榴,service等。
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“獲取當(dāng)前運(yùn)行的所有pods的信息四濒,或使用”kubectl get po -o wide“獲取pod運(yùn)行在哪個(gè)節(jié)點(diǎn)上的信息。注:集群中可以創(chuàng)建多個(gè)namespace职辨,未顯示的指定namespace的情況下盗蟆,所有操作都是針對(duì)default namespace。如下圖所示列出了default 和kube-system的pods:
2)獲取namespace信息
# kubectl get namespace
3)類似可以使用"kubectl get rc”, “kubectl get svc”, “kubectl get nodes”等獲取其他resource信息舒裤。
4)獲取一些更具體的信息姆涩,可以通過(guò)使用選項(xiàng)“-o”。如:
(1)kubectl get po -o yaml 以yawl格式輸出pod的詳細(xì)信息惭每。
(2)kubectl get po -o json 以jison格式輸出pod的詳細(xì)信息骨饿。
(3)另外還可以使用”-o=custom-columns=“定義直接獲取指定內(nèi)容的值亏栈。如前面使用json和ymal格式的輸出中,metadata.labels.app的值可以使用如下命令獲取宏赘。
kubectlgetpo rc-nginx-2-btv4j -o=custom-columns=LABELS:.metadata.labels.app
其中LABELS為顯示的列標(biāo)題绒北,”.metadata.labels.app”為查詢的域名?
(4)其他資源也可以使用類似的方式。
describe類似于get察署,同樣用于獲取resource的相關(guān)信息闷游。不同的是,get獲得的是更詳細(xì)的resource個(gè)性的詳細(xì)信息贴汪,describe獲得的是resource集群相關(guān)的信息脐往。describe命令同get類似,但是describe不支持-o選項(xiàng)扳埂,對(duì)于同一類型resource业簿,describe輸出的信息格式,內(nèi)容域相同阳懂。
注:如果發(fā)現(xiàn)是查詢某個(gè)resource的信息梅尤,使用get命令能夠獲取更加詳盡的信息。但是如果想要查詢某個(gè)resource的狀態(tài)岩调,如某個(gè)pod并不是在running狀態(tài)巷燥,這時(shí)需要獲取更詳盡的狀態(tài)信息時(shí),就應(yīng)該使用describe命令号枕。
kubectldescribepo rc-nginx-2-btv4j
kubectl命令用于根據(jù)文件或輸入創(chuàng)建集群resource缰揪。如果已經(jīng)定義了相應(yīng)resource的yaml或son文件,直接kubectl create -f filename即可創(chuàng)建文件內(nèi)定義的resource葱淳。也可以直接只用子命令[namespace/secret/configmap/serviceaccount]等直接創(chuàng)建相應(yīng)的resource钝腺。從追蹤和維護(hù)的角度出發(fā),建議使用json或yaml的方式定義資源蛙紫。
如拍屑,前面get中獲取的兩個(gè)nginx pod的replication controller文件內(nèi)容如下。文件名為:rc-nginx.yaml
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文件創(chuàng)建出ReplicationController(rc)坑傅,rc會(huì)創(chuàng)建兩個(gè)副本:
kubectlcreate-frc-nginx.yaml
創(chuàng)建后僵驰,使用“kubectl get rc”可以看到一個(gè)名為rc-nginx-2的ReplicationController將被創(chuàng)建,同時(shí)“kubectl get po”的結(jié)果中會(huì)多出兩個(gè)前綴為“rc-nginx-2-”的pod唁毒。關(guān)于kubernetes集群中resource蒜茴,pod, ReplicationController…等后續(xù)會(huì)新開博文詳細(xì)介紹浆西。
replace命令用于對(duì)已有資源進(jìn)行更新粉私、替換。如前面create中創(chuàng)建的nginx近零,當(dāng)我們需要更新resource的一些屬性的時(shí)候诺核,如果修改副本數(shù)量抄肖,增加、修改label窖杀,更改image版本漓摩,修改端口等。都可以直接修改原yaml文件入客,然后執(zhí)行replace命令管毙。
注:名字不能被更更新。另外桌硫,如果是更新label夭咬,原有標(biāo)簽的pod將會(huì)與更新label后的rc斷開聯(lián)系,有新label的rc將會(huì)創(chuàng)建指定副本數(shù)的新的pod铆隘,但是默認(rèn)并不會(huì)刪除原來(lái)的pod卓舵。所以此時(shí)如果使用get po將會(huì)發(fā)現(xiàn)pod數(shù)翻倍,進(jìn)一步check會(huì)發(fā)現(xiàn)原來(lái)的pod已經(jīng)不會(huì)被新rc控制咖驮,此處只介紹命令不詳談此問題边器,好奇者可自行實(shí)驗(yàn)训枢。
kubectlreplace-frc-nginx.yaml
如果一個(gè)容器已經(jīng)在運(yùn)行托修,這時(shí)需要對(duì)一些容器屬性進(jìn)行修改,又不想刪除容器恒界,或不方便通過(guò)replace的方式進(jìn)行更新睦刃。kubernetes還提供了一種在容器運(yùn)行時(shí),直接對(duì)容器進(jìn)行修改的方式十酣,就是patch命令涩拙。
如前面創(chuàng)建pod的label是app=nginx-2,如果在運(yùn)行過(guò)程中耸采,需要把其label改為app=nginx-3兴泥,這patch命令如下:
kubectl patch pod rc-nginx-2-kpiqt -p '{"metadata":{"labels":{"app":"nginx-3"}}}'
edit提供了另一種更新resource源的操作,通過(guò)edit能夠靈活的在一個(gè)common的resource基礎(chǔ)上虾宇,發(fā)展出更過(guò)的significant resource搓彻。例如,使用edit直接更新前面創(chuàng)建的pod的命令為:
kubectl edit po rc-nginx-btv4j
上面命令的效果等效于:
kubectlgetpo rc-nginx-btv4j -o yaml >> /tmp/nginx-tmp.yaml
vim /tmp/nginx-tmp.yaml
/*dosome changes here */
kubectlreplace-f /tmp/nginx-tmp.yaml
根據(jù)resource名或label刪除resource嘱朽。
kubectldelete-f rc-nginx.yaml
kubectldeletepo rc-nginx-btv4j
kubectldeletepo -lapp=nginx-2
apply命令提供了比patch旭贬,edit等更嚴(yán)格的更新resource的方式。通過(guò)apply搪泳,用戶可以將resource的configuration使用source control的方式維護(hù)在版本庫(kù)中稀轨。每次有更新時(shí),將配置文件push到server岸军,然后使用kubectl apply將更新應(yīng)用到resource奋刽。kubernetes會(huì)在引用更新前將當(dāng)前配置文件中的配置同已經(jīng)應(yīng)用的配置做比較瓦侮,并只更新更改的部分,而不會(huì)主動(dòng)更改任何用戶未指定的部分佣谐。
apply命令的使用方式同replace相同脏榆,不同的是,apply不會(huì)刪除原有resource台谍,然后創(chuàng)建新的须喂。apply直接在原有resource的基礎(chǔ)上進(jìn)行更新。同時(shí)kubectl apply還會(huì)resource中添加一條注釋趁蕊,標(biāo)記當(dāng)前的apply坞生。類似于git操作。
logs命令用于顯示pod運(yùn)行中掷伙,容器內(nèi)程序輸出到標(biāo)準(zhǔn)輸出的內(nèi)容是己。跟docker的logs命令類似。如果要獲得tail -f 的方式任柜,也可以使用-f選項(xiàng)卒废。
kubectl logs rc-nginx-2-kpiqt
rolling-update是一個(gè)非常重要的命令,對(duì)于已經(jīng)部署并且正在運(yùn)行的業(yè)務(wù)宙地,rolling-update提供了不中斷業(yè)務(wù)的更新方式摔认。rolling-update每次起一個(gè)新的pod,等新pod完全起來(lái)后刪除一個(gè)舊的pod宅粥,然后再起一個(gè)新的pod替換舊的pod参袱,直到替換掉所有的pod。
rolling-update需要確保新的版本有不同的name秽梅,Version和label抹蚀,否則會(huì)報(bào)錯(cuò) 。
kubectlrolling-updaterc-nginx-2-frc-nginx.yaml
如果在升級(jí)過(guò)程中企垦,發(fā)現(xiàn)有問題還可以中途停止update环壤,并回滾到前面版本
kubectl rolling-updaterc-nginx-2—rollback
rolling-update還有很多其他選項(xiàng)提供豐富的功能,如—update-period指定間隔周期钞诡,使用時(shí)可以使用-h查看help信息
scale用于程序在負(fù)載加重或縮小時(shí)副本進(jìn)行擴(kuò)容或縮小郑现,如前面創(chuàng)建的nginx有兩個(gè)副本,可以輕松的使用scale命令對(duì)副本數(shù)進(jìn)行擴(kuò)展或縮小臭增。
擴(kuò)展副本數(shù)到4:
kubectl scale rc rc-nginx-3 —replicas=4
重新縮減副本數(shù)到2:
kubectl scale rc rc-nginx-3 —replicas=2
scale雖然能夠很方便的對(duì)副本數(shù)進(jìn)行擴(kuò)展或縮小懂酱,但是仍然需要人工介入,不能實(shí)時(shí)自動(dòng)的根據(jù)系統(tǒng)負(fù)載對(duì)副本數(shù)進(jìn)行擴(kuò)誊抛、縮列牺。autoscale命令提供了自動(dòng)根據(jù)pod負(fù)載對(duì)其副本進(jìn)行擴(kuò)縮的功能。
autoscale命令會(huì)給一個(gè)rc指定一個(gè)副本數(shù)的范圍拗窃,在實(shí)際運(yùn)行中根據(jù)pod中運(yùn)行的程序的負(fù)載自動(dòng)在指定的范圍內(nèi)對(duì)pod進(jìn)行擴(kuò)容或縮容瞎领。如前面創(chuàng)建的nginx泌辫,可以用如下命令指定副本范圍在1~4
kubectl autoscale rc rc-nginx-3—min=1—max=4
這三個(gè)命令是正式release的1.2新加入的命令,三個(gè)命令一起介紹九默,是因?yàn)槿齻€(gè)命令配合使用可以實(shí)現(xiàn)節(jié)點(diǎn)的維護(hù)震放。在1.2之前,因?yàn)闆]有相應(yīng)的命令支持驼修,如果要維護(hù)一個(gè)節(jié)點(diǎn)殿遂,只能stop該節(jié)點(diǎn)上的kubelet將該節(jié)點(diǎn)退出集群,是集群不在將新的pod調(diào)度到該節(jié)點(diǎn)上乙各。如果該節(jié)點(diǎn)上本生就沒有pod在運(yùn)行墨礁,則不會(huì)對(duì)業(yè)務(wù)有任何影響。如果該節(jié)點(diǎn)上有pod正在運(yùn)行耳峦,kubelet停止后恩静,master會(huì)發(fā)現(xiàn)該節(jié)點(diǎn)不可達(dá),而將該節(jié)點(diǎn)標(biāo)記為notReady狀態(tài)蹲坷,不會(huì)將新的節(jié)點(diǎn)調(diào)度到該節(jié)點(diǎn)上驶乾。同時(shí),會(huì)在其他節(jié)點(diǎn)上創(chuàng)建新的pod替換該節(jié)點(diǎn)上的pod循签。這種方式雖然能夠保證集群的健壯性级乐,但是任然有些暴力,如果業(yè)務(wù)只有一個(gè)副本懦底,而且該副本正好運(yùn)行在被維護(hù)節(jié)點(diǎn)上的話唇牧,可能仍然會(huì)造成業(yè)務(wù)的短暫中斷罕扎。
1.2中新加入的這3個(gè)命令可以保證維護(hù)節(jié)點(diǎn)時(shí)聚唐,平滑的將被維護(hù)節(jié)點(diǎn)上的業(yè)務(wù)遷移到其他節(jié)點(diǎn)上,保證業(yè)務(wù)不受影響腔召。如下圖所示是一個(gè)整個(gè)的節(jié)點(diǎn)維護(hù)的流程(為了方便demo增加了一些查看節(jié)點(diǎn)信息的操作):1)首先查看當(dāng)前集群所有節(jié)點(diǎn)狀態(tài)杆查,可以看到共四個(gè)節(jié)點(diǎn)都處于ready狀態(tài);2)查看當(dāng)前nginx兩個(gè)副本分別運(yùn)行在d-node1和k-node2兩個(gè)節(jié)點(diǎn)上臀蛛;3)使用cordon命令將d-node1標(biāo)記為不可調(diào)度亲桦;4)再使用kubectl get nodes查看節(jié)點(diǎn)狀態(tài),發(fā)現(xiàn)d-node1雖然還處于Ready狀態(tài)浊仆,但是同時(shí)還被禁能了調(diào)度客峭,這意味著新的pod將不會(huì)被調(diào)度到d-node1上。4)再查看nginx狀態(tài)抡柿,沒有任何變化舔琅,兩個(gè)副本仍運(yùn)行在d-node1和k-node2上;5)執(zhí)行drain命令洲劣,將運(yùn)行在d-node1上運(yùn)行的pod平滑的趕到其他節(jié)點(diǎn)上备蚓;6)再查看nginx的狀態(tài)發(fā)現(xiàn)课蔬,d-node1上的副本已經(jīng)被遷移到k-node1上;這時(shí)候就可以對(duì)d-node1進(jìn)行一些節(jié)點(diǎn)維護(hù)的操作郊尝,如升級(jí)內(nèi)核二跋,升級(jí)Docker等;7)節(jié)點(diǎn)維護(hù)完后流昏,使用uncordon命令解鎖d-node1扎即,使其重新變得可調(diào)度;8)檢查節(jié)點(diǎn)狀態(tài)况凉,發(fā)現(xiàn)d-node1重新變回Ready狀態(tài)铺遂。
attach命令類似于docker的attach命令,可以直接查看容器中以daemon形式運(yùn)行的進(jìn)程的輸出茎刚,效果類似于logs -f襟锐,退出查看使用ctrl-c。如果一個(gè)pod中有多個(gè)容器膛锭,要查看具體的某個(gè)容器的的輸出粮坞,需要在pod名后使用-c containers name指定運(yùn)行的容器。如下示例的命令為查看kube-system namespace中的kube-dns-v9-rcfuk pod中的skydns容器的輸出初狰。
kubectl attach kube-dns-v9-rcfuk -c skydns —namespace=kube-system
exec命令同樣類似于docker的exec命令莫杈,為在一個(gè)已經(jīng)運(yùn)行的容器中執(zhí)行一條shell命令,如果一個(gè)pod容器中奢入,有多個(gè)容器筝闹,需要使用-c選項(xiàng)指定容器。
轉(zhuǎn)發(fā)一個(gè)本地端口到容器端口腥光,博主一般都是使用yaml的方式編排容器关顷,所以基本不使用此命令。
博主只嘗試過(guò)使用nginx作為kubernetes多master HA方式的代理武福,沒有使用過(guò)此命令為kubernetes api server運(yùn)行過(guò)proxy
類似于docker的run命令议双,直接運(yùn)行一個(gè)image。
為kubernetes集群的resource打標(biāo)簽捉片,如前面實(shí)例中提到的為rc打標(biāo)簽對(duì)rc分組平痰。還可以對(duì)nodes打標(biāo)簽,這樣在編排容器時(shí)伍纫,可以為容器指定nodeSelector將容器調(diào)度到指定lable的機(jī)器上宗雇,如如果集群中有IO密集型,計(jì)算密集型的機(jī)器分組莹规,可以將不同的機(jī)器打上不同標(biāo)簽赔蒲,然后將不同特征的容器調(diào)度到不同分組上。
在1.2之前的版本中,使用kubectl get nodes則可以列出所有節(jié)點(diǎn)的信息嘹履,包括節(jié)點(diǎn)標(biāo)簽腻扇,1.2版本中不再列出節(jié)點(diǎn)的標(biāo)簽信息,如果需要查看節(jié)點(diǎn)被打了哪些標(biāo)簽砾嫉,需要使用describe查看節(jié)點(diǎn)的信息幼苛。
其他還有如cluster-info信息可以查看當(dāng)前集群的一些信息,Version查看集群版本信息等焕刮,還有一些集群配置相關(guān)的命令等