kubectl是K8s官方附帶的命令行工具, 可以方便的操作K8s集群. 這篇文章主要介紹一些kubectl的別樣用法, 希望讀者有基礎(chǔ)的K8s使用經(jīng)驗(yàn).
打印當(dāng)前使用的API
#kubectl的主要作用就是與ApiServer進(jìn)行交互,而交互的過(guò)程,我們可以通過(guò)下面的方式來(lái)打印, #這個(gè)命令尤其適合調(diào)試自己的api接口時(shí)使用. kubectlgetns-v=9
按狀態(tài)篩選容器以及刪除
kubectlgetpods--all-namespaces--field-selectorstatus.phase=Pending-ojson| jq'.items[]|"kubectldeletepods(.metadata.name)-n(.metadata.namespace)"'| xargs-n1bash-c #這個(gè)命令要拆開(kāi)來(lái)看 #首先,獲取所有ns中狀態(tài)為Pending的pods,并以json形式輸出 #這個(gè)語(yǔ)句其實(shí)由很多變體,比如,我想查找Failed的狀態(tài),或是某個(gè)deployment kubectlgetpods--all-namespaces--field-selectorstatus.phase=Pending-ojson #針對(duì)json變量進(jìn)行處理,生成可用的腳本 #這里是我想介紹的重點(diǎn),利用jq以及kubectl的輸出,構(gòu)建出可用的命令 jq'.items[]|"kubectldeletepods(.metadata.name)-n(.metadata.namespace)"' #執(zhí)行每一條命令 #注意,這種命令一定要好好調(diào)試,刪掉預(yù)期之外的pod就不好了. xargs-n1bash-c #例如,下面的語(yǔ)句可以找到所有的Pods并打印可以執(zhí)行的語(yǔ)句 kubectlgetpods--all-namespaces--field-selectorstatus.phase=Running-ojson| jq'.items[]|"kubectlgetpods(.metadata.name)-owide-n(.metadata.namespace)"' "kubectlgetpodsmetrics-server-6d684c7b5-gtd6q-owide-nkube-system" "kubectlgetpodslocal-path-provisioner-58fb86bdfd-98frc-owide-nkube-system" "kubectlgetpodsnginx-deployment-574b87c764-xppmx-owide-ndefault" #當(dāng)然,如果只是刪除單個(gè)NS下面的一些pods,我會(huì)選擇下面的方法,但是它操作多個(gè)NS就很不方便了. kubectl-ndefaultgetpods|grepCompleted|awk'{print$1}'|xargskubectl-ndefaultdeletepods
統(tǒng)計(jì)具體某臺(tái)機(jī)器上運(yùn)行的所有pod
kubectl可以使用兩種選擇器, 一種是label, 一種是field, 可以看官網(wǎng)的介紹: Labels and Selectors Field Selectors
#它是一種選擇器,可以與上面的awk或者xargs配合使用. #我個(gè)人平時(shí)都不喜歡用這個(gè),直接get全部pods,然后grep查找感覺(jué)更快 kubectlgetpods--all-namespaces-owide--field-selectorspec.nodeName=pve-node1
統(tǒng)計(jì)Pod在不同機(jī)器的具體數(shù)量分布
不知道有讀者看過(guò)我的這篇文章: 基于kubernetes的PaaS平臺(tái)中細(xì)力度控制pods方案的實(shí)現(xiàn). 均衡分布的工作前提是得知pod在各個(gè)機(jī)器的分布情況. 最好的辦法就是我們得到pod信息之后進(jìn)行簡(jiǎn)單的統(tǒng)計(jì), 這個(gè)工作可以使用awk實(shí)現(xiàn).
kubectl-ndefaultgetpods-owide-lapp="nginx"|awk'{print$7}'| awk'{count[$0]++} END{ printf("%-35s:%s ","Word","Count"); for(indincount){ printf("%-35s:%d ",ind,count[ind]); } }' #執(zhí)行結(jié)果如下 Word:Count NODE:1 pve-node1:1 pve-node2:1 #awk的語(yǔ)法我沒(méi)深入了解,有興趣的讀者可以研究看看,這里我就不求甚解了.
kubectl proxy的使用
你可以理解為這個(gè)命令為K8s的ApiServer做了一層代理, 使用該代理, 你可以直接調(diào)用API而不需要經(jīng)過(guò)鑒權(quán). 啟動(dòng)之后, 甚至可以實(shí)現(xiàn)kubectl套娃, 下面是一個(gè)例子:
#當(dāng)你沒(méi)有設(shè)置kubeconfig而直接調(diào)用kubectl時(shí) kubectlgetns-v=9 #可以打印出下面類(lèi)似的錯(cuò)誤 curl-k-v-XGET-H"Accept:application/json,*/*"-H"User-Agent:kubectl/v1.21.3(linux/amd64)kubernetes/ca643a4"'http://localhost:8080/api?timeout=32s' skippedcachingdiscoveryinfoduetoGet"http://localhost:8080/api?timeout=32s":dialtcp127.0.0.1connect:connectionrefused #也就是說(shuō)當(dāng)你不指定kubeconfig文件時(shí),kubectl會(huì)默認(rèn)訪問(wèn)本機(jī)的8080端口 #那么我們先啟動(dòng)一個(gè)kubectlproxy,然后指定監(jiān)聽(tīng)8080,再使用kubectl直接訪問(wèn),是不是就可行了呢, #事實(shí)證明,安全與預(yù)想一致. KUBECONFIG=~/.kube/config-symv3kubectlproxy-p8080 kubectlgetns NAMESTATUSAGE defaultActive127d
默認(rèn)啟動(dòng)的proxy是屏蔽了某些api的, 并且有一些限制, 例如無(wú)法使用exec進(jìn)入pod之中 可以使用kubectl proxy --help來(lái)看, 例如
#僅允許本機(jī)訪問(wèn) --accept-hosts='^localhost$,^127.0.0.1$,^[::1]$':Regularexpressionforhoststhattheproxyshouldaccept. #不允許訪問(wèn)下面的api,也就是說(shuō)默認(rèn)沒(méi)法exec進(jìn)入容器 --reject-paths='^/api/.*/pods/.*/exec,^/api/.*/pods/.*/attach':Regularexpressionforpathsthattheproxyshouldreject.Pathsspecifiedherewillberejectedevenacceptedby--accept-paths. #想跳過(guò)exec的限制也很簡(jiǎn)單,把reject-paths去掉就可以了 kubectlproxy-p8080--keepalive3600s--reject-paths=''-v=9
有人說(shuō)這個(gè)kubectl proxy可能沒(méi)什么作用, 那可能僅僅是你還沒(méi)有實(shí)際的應(yīng)用場(chǎng)景. 例如當(dāng)我想要調(diào)試K8s dashboard代碼的時(shí)候. 如果直接使用kubeconfig文件, 我沒(méi)法看到具體的請(qǐng)求過(guò)程, 如果你加上一層proxy轉(zhuǎn)發(fā), 并且設(shè)置-v=9的時(shí)候, 你就自動(dòng)獲得了一個(gè)日志記錄工具, 在調(diào)試時(shí)相當(dāng)有用.
總結(jié)
kubectl是一個(gè)強(qiáng)大的命令行工具, 上面我只是介紹了我工作中對(duì)其用法的一點(diǎn)探索, 也并不鼓勵(lì)大家非要記住這些命令, 只是希望當(dāng)讀者需要的時(shí)候, 能夠想起來(lái)kubectl可以有類(lèi)似的功能, 就不需要針對(duì)幾個(gè)臨時(shí)需求去研讀client-api了.
-
API
+關(guān)注
關(guān)注
2文章
1472瀏覽量
61749 -
工具
+關(guān)注
關(guān)注
4文章
307瀏覽量
27709
原文標(biāo)題:kubectl的多樣用法
文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論