欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

tmux 嵌套 tmux_使用tmux和kubectl的功能对Kubernetes进行故障排除

程序员文章站 2022-07-16 21:26:32
...

tmux 嵌套 tmux

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

使用别名对Kubernetes进行故障排除

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

有关故障排除功能,有许多情况需要考虑。 在一种情况下,您知道需要运行什么,但是该命令的语法(即使可以作为单个命令运行)也过于复杂,或者可能需要一两个输入才能起作用。

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

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

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

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

这是来自常见Kubernetes别名存储库的许多示例之一,该示例显示了一种简化kubectl中功能的方法。 对于像这样的简单情况,别名就足够了。

切换到Kubectl插件

一个更复杂的故障排除方案涉及需要一个接一个地运行许多命令来调查环境并得出结论。 单独使用别名不足以实现此用途

考虑群集上拥有不同微服务的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是一个非常强大的工具,许多系统管理员和操作团队都依赖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的美丽可以在下面看到; 使用正确的配置,您甚至可以看到正在进行活动的窗口(请参见白色选项卡)。

tmux 嵌套 tmux_使用tmux和kubectl的功能对Kubernetes进行故障排除

结论

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

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

翻译自: https://opensource.com/article/20/2/kubernetes-tmux-kubectl

tmux 嵌套 tmux