当前位置: 首页 > 科技观察

五个冷门但非常实用的Kubectl使用技巧,99%的人都不知道

时间:2023-03-16 21:32:56 科技观察

kubectl是K8s官方自带的命令行工具,可以轻松操作K8s集群。本文主要介绍kubectl的一些其他用法。我希望读者有一些基本的K8s经验。有篇文章也介绍了一些技巧。刚刚在写博客的时候发现的,正好想分享一下。kubectl打印当前使用的API的即用命令和提示#kubectl的主要功能是与ApiServer交互,交互过程,我们可以通过以下方式打印,#这个命令特别适合调试自己的api接口使用.$kubectlgetns-v=9按状态过滤pod并删除这是我在这里学到的命令:ForceDeleteEvicted/TerminatedPodsinKuberneteskubectlgetpods--all-namespaces--field-selectorstatus.phase=Pending-ojson|\jq'.items[]|"kubectldeletepods\(.metadata.name)-n\(.metadata.namespace)"'|\xargs-n1bash-c#这个命令需要反汇编才能看到#首先,获取所有的statesinnsForPendingpods,并以json形式输出#这个语句其实有很多变体,比如我想查找Failed的状态,或者一个deploymentkubectlgetpods--all-namespaces--field-selectorstatus.phase=Pending-ojson#处理json变量生成可用脚本#这里是我要介绍的重点,使用jq和kubectl的输出构建可用命令jq'.items[]|"kubectldeletepods\(.metadata.name)-n\(.metadata.namespace)"'#执行每条命令#注意,这种命令一定要调试好,不好删除意想不到的pod。xargs-n1bash-c#例如下面语句可以找到所有Pod并打印可执行语句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"#当然,如果你只是删除一些单个NS下的pod,我会选择下面的方法,但是操作多个NS很不方便,所有的podkubectl都可以使用两个selector,一个是label,一个是field,可以看上面的介绍官网:LabelsandSelectorsFieldSelectors#是一个选择器,可以和上面的awk或者xargs配合使用。#我个人不太喜欢用这个,直接获取所有pod比较快,然后grep到找到他们。读者看过我的文章:在基于kubernetes的PaaS平台中,对pod方案的细粒度控制实现均衡分布是基于知道pod在每台机器上的分布情况,最好的方式是执行一个简单的统计,这个工作可以用awk来实现。kubectl-ndefaultgetpods-owide-lapp="nginx"|awk'{print$7}'|\awk'{count[$0]++}END{printf("%-35s:%s\n","Word","Count");for(indincount){printf("%-35s:%d\n",ind,count[ind]);}}'#执行结果如下Word:CountNODE:1pve-node1:1pve-node2:1#对awk的语法理解不深。有兴趣的读者可以研究一下。我不会在这里询问更多细节。kubectlproxy的使用可以理解为这个命令为K8s的ApiServer创建了一层代理。使用此代理,您可以直接调用API而无需身份验证。启动后,你甚至可以实现kubectl嵌套娃娃。下面是一个例子:#当你直接调用kubectl而不设置kubeconfigkubectlgetns-v=9#你可以打印出类似下面的错误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.1:8080:connect:connectionrefused#也就是说当你没有指定kubeconfig文件的时候,kubectl会默认访问本机的8080端口#那么我们先启动一个kubectlproxy,然后指定监听8080,然后用kubectl直接访问,可行吗?#事实证明安全性符合预期。KUBECONFIG=~/.kube/config-symv3kubectlproxy-p8080kubectlgetnsNAMESTATUSAGEdefaultActive127d默认启动的proxy是屏蔽了一些API,还有一些限制,比如不能使用exec进入pod,可以使用kubectlproxy--help看,例如:#Onlyallowlocalaccess--accept-hosts='^localhost$,^127\.0\.0\.1$,^\[::1\]$':Regularexpressionforhoststhattheproxyshouldaccept.#Do不允许访问下面的api,也就是说默认不能exec到容器中--reject-paths='^/api/.*/pods/.*/exec,^/api/.*/pods/.*/attach':代理应拒绝的路径的正则表达式。此处指定的路径将lberejectevenacceptedby--accept-paths.#跳过exec限制也很简单,去掉reject-paths即可这个kubectlproxy可能用处不大,可能只是你没有实际的应用场景,比如我要的时候调试K8s仪表板代码。如果直接使用kubeconfig文件,我是看不到具体的请求流程的。如果加一层proxy转发,设置-v=9,会自动得到一个logging工具,在调试的时候还是蛮有用的。总结kubectl是一个强大的命令行工具。上面我只是介绍了它在工作中的一些用法,并不鼓励大家去记住这些命令。只是希望读者在需要的时候,能够记住kubectl可以具备类似的功能,没必要为了一些临时的需要去研究client-api。