kubectx / kubens
kubectx用于快速切换Kubernetes context,而kubens则用于快速切换namespace,我认为二者强大之处在于可以结合fzf使用。任何工具只要和fzf结合,都会很强大。
如切换到kube-systemnamespace:
kubectl ns kube-system
如果不指定namespace,则调用fzf交互式选择:
如上黄色的namespace表示当前namespace,通过方向键移动箭头选择需要切换的目标namespace,切换context也一样,由于测试环境只有一个admin,因此只有一个选项。
debug
我们知道容器的最佳实践是只运行单个应用进程,因此为了精简镜像,我们通常在构建镜像时只包含进程运行所需要包和程序,但这样其实也给排查故障带来问题,尤其是网络问题,想抓个包实在太麻烦。
我们常规的做法是先手动进入Pod所在的Node节点,然后找到对应的网络namespace,参考我之前的文章,最后切换到容器的网络namespace中进行抓包,特别麻烦。
为了解决这个问题,社区中也提供了许多插件方案,
kubectl-debug通过EphemeralContainers的方式在运行的Pod中增加一个debugger的容器,然后通过kubectl exec进入该容器进行调试。
ksniff工具主要用于容器抓包,其实现方式是把本地静态的tcpdump工具拷贝到容器的/tmp目录,然后就可以通过kubectl exec进入容器运行tcpdump工具了。
但我觉得最好用的还是国内PingCAP公司开源的debug工具,其实现原理是在目标Node节点上创建一个DebugAgentPod,创建的Debug Pod会在目标Node上创建一个新的容器,这个容器会加入到目标Pod的各个Namespace中,于是就可以进入这个新的容器进行调试了,这个新的容器目前使用的默认镜像是nicolaka/netshoot,这个镜像里面包含netstat、ip、tcpdump等各种网络调试工具,真是太方便了。
更多关于debug设计和用法可参考作者的文章简化Pod故障诊断: kubectl-debug 介绍。
如下是我的一个演示动画:
grep
基于name搜索资源辅助卡盟,资源包括DaemonSets、Pods、Deployments、Nodes等,如搜索名字中带web的所有Pods:
# kubectl grep pod web
NAMESPACE NAME READY STATUS RESTART AGE
default web-0 1/1 Running 0 37h
default web-1 1/1 Running 0 37h
default web-2 1/1 Running 0 37h
在所有的namespaces搜索名字带virt的Deployments:
# kubectl grep deployment virt --all-namespaces
NAMESPACE NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
kubevirt virt-api 2 2 2 2 5h32m