2-3 分钟后 Kubectl exec stops/closes

Kubectl exec stops/closes after 2-3 minutes

我正在尝试在 k8s 集群 (k3s) 中备份 MySQL 数据库 运行ning。该集群在 Raspberry Pi 上本地 运行ning。我已经构建了一个基于 Alpine Linux 的自定义映像,其中包含一个使用 mysqldump:

创建备份的脚本

kubectl exec <pod_name> -n <namespace_name> -- /usr/bin/mysqldump -u <db_user> --password=<db_password> --verbose <db_name> > <file_name>

当我从数据库 pod 中 运行 mysqldump 命令时,它会在 10-15 秒后成功完成。但是,当从 Alpine pod 内部执行此命令时,不知何故需要更长的时间(2 分 40 秒)。那时它 stops/aborts kubectl exec 命令(由于超时?)并且脚本上传了一个损坏的 sql 文件,因为 mysqldump 命令没有完成备份。

预期的详细输出:

-- Connecting to localhost...
-- Retrieving table structure for table _prisma_migrations...
-- Sending SELECT query...
-- Retrieving rows...
-- Retrieving table structure for table database...
-- Sending SELECT query...
-- Retrieving rows...
-- Retrieving table structure for table recycleBin...
-- Sending SELECT query...
-- Retrieving rows...
-- Retrieving table structure for table user...
-- Sending SELECT query...
-- Retrieving rows...
-- Disconnecting from localhost...

收到详细输出:

-- Connecting to localhost...
-- Retrieving table structure for table _prisma_migrations...
-- Sending SELECT query...
-- Retrieving rows...
-- Retrieving table structure for table database...
-- Sending SELECT query...
-- Retrieving rows...
-- Retrieving table structure for table recycleBin...
-- Sending SELECT query...
-- Retrieving rows...

我有 2 个问题:

  1. 为什么 mysqldump 命令在 Alpine pod 中比在数据库 pod 中花费的时间长得多?
  2. 为什么 kubectl exec 命令不等到 mysqldump 命令完成备份?为什么它突然决定断开连接并继续前进?

可能您正在断开连接,因为 kubectl 认为由于没有来自另一方的数据而导致连接中断。

而不是:

kubectl exec <pod_name> -n <namespace_name> -- /usr/bin/mysqldump -u <db_user> --password=<db_password> --verbose <db_name> > <file_name>

尝试:

kubectl exec <pod_name> -n <namespace_name> -- /usr/bin/mysqldump -u <db_user> --password=<db_password> --verbose <db_name> | tee <file_name>

这将改为输出到标准输出并发送到文件。这将保证 kubectl 将看到返回的数据,并且如果这是 no-data 问题,则不会断开您的连接。这样做的缺点是您将在 stdout

上将整个 SQL 数据泵回给您

另一种选择(也是我个人推荐的一种)是安装类似 screentmux 或其他终端多路复用器的东西,并在其中进行转储,这样您就可以断开与 pod 的连接并不用担心 kubectl 会断开你的连接。

编辑:澄清一下,我的意思是在 pod 内安装多路复用器(例如,在用于创建 pod 的 docker 映像内)