使用 tmux 和 kubectl 排查 Kubernetes 问题

一个使用 tmux 的 kubectl 插件,使 Kubernetes 故障排除变得更加简单。
166 位读者喜欢这篇文章。
Woman sitting in front of her laptop

kris krüg

Kubernetes 是一个蓬勃发展的开源容器编排平台,为应用程序提供可扩展性、高可用性、稳健性和弹性。它的众多功能之一是通过其主要客户端二进制文件 kubectl 支持运行自定义脚本或二进制文件。Kubectl 非常强大,允许用户使用它做任何可以直接在 Kubernetes 集群上做的事情。

使用别名排查 Kubernetes 问题

任何使用 Kubernetes 进行容器编排的人都知道它的功能,以及它因其设计而带来的复杂性。例如,迫切需要简化 Kubernetes 中的故障排除,使其更快且几乎不需要手动干预(除非在关键情况下)。

在进行故障排除时,需要考虑许多场景。在一种场景中,您知道需要运行什么,但命令的语法(即使它可以作为单个命令运行)过于复杂,或者可能需要一两个输入才能工作。

例如,如果您经常需要跳转到 System 命名空间中运行的容器中,您可能会发现自己反复编写

kubectl --namespace=kube-system exec -i -t <your-pod-name>

为了简化故障排除,您可以使用这些命令的命令行别名。例如,您可以将以下内容添加到您的 dotfiles(.bashrc 或 .zshrc)

alias ksysex='kubectl --namespace=kube-system exec -i -t'

这是 一个常见 Kubernetes 别名存储库 中的众多示例之一,它展示了简化 kubectl 中功能的一种方法。对于像这种场景这样简单的事情,别名就足够了。

切换到 kubectl 插件

更复杂的故障排除场景涉及需要一个接一个地运行许多命令,以调查环境并得出结论。 仅别名不足以满足此用途

案例;您需要可重复的逻辑以及 Kubernetes 部署的许多部分之间的关联。 您真正需要的是自动化,以便在更短的时间内交付所需的输出。

考虑集群上拥有不同微服务的 10 到 20 个甚至 50 到 100 个命名空间。 对您来说,开始对此场景进行故障排除有什么帮助?

  • 您需要能够快速判断哪个命名空间中的哪个 pod 正在抛出错误的东西。
  • 您需要可以监视命名空间中所有 pod 日志的东西。
  • 您可能还需要监视特定命名空间中已显示错误的某些 pod 的日志。

任何涵盖这些点的解决方案对于调查生产问题以及在开发和测试周期中都非常有用。

要创建比简单别名更强大的东西,您可以使用 kubectl 插件。 插件就像用任何脚本语言编写的独立脚本,但旨在扩展您作为 Kubernetes 管理员时的主命令的功能。

要创建插件,您必须使用正确的语法 kubectl-<your-plugin-name> 将脚本复制到 $PATH 中导出的路径之一,并赋予它可执行权限 (chmod +x)。

创建插件并将其移动到您的路径后,您可以立即运行它。 例如,我的路径中有 kubectl-krawl 和 kubectl-kmux

$ kubectl plugin list
The following compatible plugins are available:

/usr/local/bin/kubectl-krawl
/usr/local/bin/kubectl-kmux

$ kubectl kmux

现在,让我们探讨一下当您使用 tmux 为 Kubernetes 提供支持时会是什么样子。

利用 tmux 的强大功能

Tmux 是一个非常强大的工具,许多系统管理员和运维团队依靠它来解决与易于操作相关的问题——从将窗口拆分为窗格以在多台机器上运行并行调试到监视日志。 它的主要优势之一是它可以在命令行或自动化脚本中使用。

我创建了一个 kubectl 插件,该插件使用 tmux 来使故障排除变得更加简单。 我将使用注释来逐步介绍插件背后的逻辑(并将其留给您去查看插件的完整代码)

#NAMESPACE is namespace to monitor.
#POD is pod name
#Containers is container names

# initialize a counter n to count the number of loop counts, later be used by tmux to split panes.
n=0;

# start a loop on a list of pod and containers
while IFS=' ' read -r POD CONTAINERS
do

           # tmux create the new window for each pod
            tmux neww $COMMAND -n $POD 2>/dev/null

           # start a loop for all containers inside a running pod
	for CONTAINER in ${CONTAINERS//,/ }
	do

  	if [ x$POD = x -o x$CONTAINER = x ]; then
    	# if any of the values is null, exit.
    	warn "Looks like there is a problem getting pods data."
    	break
  	fi
           
            # set the command to execute
  	COMMAND=”kubectl logs -f $POD -c $CONTAINER -n $NAMESPACE”
 	# check tmux session
  	if tmux has-session -t <session name> 2>/dev/null;
  	then
    	<set session exists>
  	else
    	<create session>
  	fi

           # split planes in the current window for each containers
  	tmux selectp -t $n \; \
    	splitw $COMMAND \; \
    	select-layout tiled \;

           # end loop for containers
	done

           # rename the window to identify by pod name
	tmux renamew $POD 2>/dev/null
       
            # increment the counter
	((n+=1))

# end loop for pods
done< <(<fetch list of pod and containers from kubernetes cluster>)

# finally select the window and attach session
 tmux selectw -t <session name>:1 \; \
  attach-session -t <session name>\;

插件脚本运行后,将产生类似于下图的输出。 每个 pod 都有自己的窗口,每个容器(如果有一个以上)都由其 pod 窗口中的窗格分隔,并流式传输日志。 下面可以看到 tmux 的美妙之处;通过正确的配置,您甚至可以看到哪个窗口正在进行活动(参见白色选项卡)。

Output of kmux plugin

结论

别名始终有助于 Kubernetes 环境中的简单故障排除。 当环境变得更加复杂时,kubectl 插件是使用更高级脚本的强大选择。 您可以使用哪种编程语言来编写 kubectl 插件没有限制。 唯一的要求是路径中的命名约定是可执行的,并且它与现有的 kubectl 命令名称不同。

要阅读完整的代码或尝试我创建的插件,请查看我的 kube-plugins-github 存储库。 欢迎提出问题和请求请求。

接下来阅读什么
标签
iamabhi
我是一名首席 DevOps 工程师,也是一名程序员。 我是一位开源爱好者、博主、作家。 您会发现我主要是在帮助人们学习。

5 条评论

我对 kmux 很感兴趣,但它似乎还没有为生产或开发做好准备。

安装 - 作为插件 - 的说明对我来说不清楚,“kubectl plugin list”列出了我已经通过 krew 安装的插件,但没有列出我安装在 /usr/local/bin 中的脚本。

所以我直接调用了 kmux,它抱怨权限错误。
毫无疑问,因为我已经在 tmux 会话中运行 - 如果这是一个问题,应该检测到这一点。

我在一个非 tmux 会话中运行了它,它所做的就是杀死了我现有的 tmux 会话 - 哎哟!

等我有时间调试时我会回来的......

我对 kmux 很感兴趣,但它似乎还没有为生产或开发做好准备。

安装 - 作为插件 - 的说明对我来说不清楚,“kubectl plugin list”列出了我已经通过 krew 安装的插件,但没有列出我安装在 /usr/local/bin 中的脚本。

所以我直接调用了 kmux,它抱怨权限错误。
毫无疑问,因为我已经在 tmux 会话中运行 - 如果这是一个问题,应该检测到这一点。

我在一个非 tmux 会话中运行了它,它所做的就是杀死了我现有的 tmux 会话 - 哎哟!

等我有时间调试时我会回来的......

嗯……如果您花一些时间在 github 存储库上提出一个问题,那将是很好的。 这将帮助我以及所有打算使用或已经在使用该实用程序的人。

回复 mjbright

嗨,感谢您的出色开源反应性。

如果我看到进一步的问题,我会提出问题。
谢谢。

回复 tamrakar

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.