使用kubectl cp命令在Kubernetes容器中使用通配符复制多个文件

75次阅读
没有评论

问题描述

在Kubernetes容器中,我有许多文件,它们被命名为out1、out2等。我想将它们复制到我的本地计算机上。我正在使用以下命令:

$ kubectl cp pod:/path/out* .

但是我得到了一个错误信息:

tar: Removing leading `/' from member names
tar: /path/out*: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors
error: path/out* no such file or directory

我应该如何在kubectl cp命令中使用通配符?

解决方案

请注意以下操作可能存在版本差异。确保你的Kubernetes版本支持所述功能。

最佳解决方案

通配符支持在Kubernetes v1.14.0版本中被引入到kubectl cp命令中[^1^]。然而,需要注意的是,该功能在这个版本中是存在问题的,且修复该问题的PR(Pull Request)尚未合并[^1^]。

为了在当前版本中实现类似的功能,你可以采取以下方法:

方案1:使用kubectl exec和tar命令

  1. 使用kubectl exec命令在容器内部创建一个临时目录,并将所需传输的文件通配符复制或移动到该目录中。
  2. 使用kubectl cp命令将该目录中的所有文件复制到本地。

以下是实现上述方法的步骤:

# 替换以下变量为你的实际值
TARGET_POD="your_pod_name"
NAMESPACE="your_namespace"

# 在容器内部创建临时目录并复制文件
kubectl exec "$TARGET_POD" -n "$NAMESPACE" -- sh -c "mkdir -p /tmp/outfiles && cp /path/out* /tmp/outfiles/"

# 将临时目录中的文件复制到本地
kubectl cp "sites/$TARGET_POD:/tmp/outfiles/." .

请确保替换上述命令中的your_pod_nameyour_namespace为你实际使用的值。

方案2:使用tar命令

  1. 使用kubectl exec命令在容器内部使用tar命令将所需文件打包。
  2. 使用管道将tar打包后的数据传输到本地计算机,并在本地计算机上解压缩。

以下是实现上述方法的步骤:

# 替换以下变量为你的实际值
TARGET_POD="your_pod_name"
NAMESPACE="your_namespace"

# 在容器内部使用tar命令将文件打包
kubectl exec "$TARGET_POD" -n "$NAMESPACE" -- tar -zcvf - -C /path out* | tar -zxvf - -C .

# 请确保替换上述命令中的your_pod_name和your_namespace为你实际使用的值。

这两种方法都可以帮助你在Kubernetes容器中实现类似于通配符复制的功能。根据你的实际情况和Kubernetes版本,选择适合的方法。

请注意,通配符*在tar命令中依赖于shell扩展,确保在容器中存在能够处理通配符的shell(如bash)。

[^1^]: Kubernetes Pull Request #72641

总结

使用kubectl cp命令在Kubernetes容器中复制多个文件时,可以通过通配符来实现。然而,在版本1.14.0之前,这个功能可能存在问题。在当前版本中,你可以使用kubectl exec和tar命令,或者将数据打包后使用管道传输到本地来实现类似的功能。根据你的需求和Kubernetes版本,选择合适的方法来解决问题。

正文完