如何在 Kubernetes Pod 和您的机器之间复制文件
在 Kubernetes Pod 中运行的容器是不需要手动交互的独立计算单元。有时您可能需要将文件复制到 Pod 的文件系统或从 Pod 的文件系统复制文件,这可能是因为您正在调试问题并希望存档存储在容器中的日志、配置文件或缓存。
以下是如何使用 Kubectl 的内置传输功能或手动替代方法在您的机器和 Pod 中的容器之间移动文件。
复印到您的机器或从您的机器复印
该kubectl cp
命令是复制到容器文件系统或从容器文件系统复制的最简单方法。它的工作原理与docker cp
您可能已经在本地容器开发中熟悉的类似。
kubectl cp
需要源和目标参数。源或目标之一必须是 Pod 引用。这被格式化为 Pod 名称,后跟一个冒号和容器内文件系统路径。
kubectl cp example-pod:/tmp/example-dir ./example-dir
此示例将/tmp/example-dir
from的内容复制example-pod
到example-dir
本地文件系统上。反转参数会将您的机器复制example-dir
回 Pod。
命令参数
由于单个 Pod 可以容纳多个容器,因此在使用cp
. Kubernetes 将默认复制到或从 Pod 中的第一个容器实例。您可以通过添加-c
标志来定位特定容器:
kubectl cp example-pod:/tmp/example-dir ./example-dir -c second-container
像所有其他的kubectl命令,cp有违通过定义群连接你的KUBECONFIG环境变量。这默认为~/.kube/conf.
引用命名空间 Pod 时有两个选项。您可以--namespace example-namespace
在文件系统参考中添加标准标志或使用完整的 Pod 路径:
kubectl cp example-namespace/example-pod:/tmp/example-dir ./example-dir
默认情况下保留文件属性。将--no-preserve
标志添加到您的cp
命令以从留在目的地的复制文件中去除所有权和权限数据。与常规 Unix 不同cp
,Kubectl 的实现始终是递归的,因此引用目录也将包含其内容。
当 Kubectl Cp 不起作用时
kubectl cp
有一个很大的警告:在内部,它是一个简单的tar
. 该命令将压缩源路径,将存档复制到目标,然后提取其内容。您的容器映像必须tar
在其路径中包含二进制文件才能使其正常工作。
这意味着kubectl cp
当您遵循 Docker 最佳实践来保持镜像较小时,这可能并不总是一种选择。尽管流行的最小基础(例如alpine
do include)tar
,它可能不会出现在每个图像中,并且如果您从头开始组装它们,则不会出现。
使用tar
也限制了kubectl cp
可以复制的内容。您无法解析符号链接或使用诸如/tmp/*.log
. 当需要此功能时,您将不得不使用不同的方法。
一种选择是将kubectl exec
、cat
命令和 shell 重定向结合起来,将文件的内容从集群中流式传输到本地文件中:
kubectl exec \
--namespace 示例-namespace \
example-pod -c 第二个容器 \
-- cat /tmp/example-file > 本地文件
该kubectl exec
命令在 Pod 中启动一个 shell 会话。之后的所有内容都在--
容器内运行。调用cat
文件的输出将发送到您的终端,在那里它可以重定向到本地文件。
当您复制少量相对较小的文件时,此技术适用。如果您需要检索一个大目录,它很快就会变得乏味。不幸的是,如果不向容器中添加额外的软件,就没有更好的选择。
如果你感觉大胆,你可以在你的容器安装SSH和使用scp
,以从您的主机访问它的文件系统。这将为您提供完整的复制体验,但代价是运行额外的守护程序并产生潜在的安全问题。它应该只在受到适当保护的集群上考虑。
添加tar
到您的容器映像是一个更安全的选择。这使您可以在需要额外功能时使用kubectl cp
和解锁更高级的手动复制kubectl exec
。如果遇到cp
语法限制,请tar
直接调用viakubectl exec
向命令添加额外的标志:
kubectl exec \
--namespace 示例-namespace \
example-pod -c 第二个容器 \
-- tar -cf /tmp/example-dir | tar xf - -C ./extracted-dir
这tar -cF
在您的容器内运行,并将结果通过管道传输到tar xf
本地机器上的提取命令。的-
指示tar
来提取通过标准输入流馈送到它的数据。-C
用于指定目标目录。
概括
该kubectl cp
命令允许您在 Kubernetes Pod 和您的机器之间复制文件。它适用于任一方向,但不能用于将文件从 Pod 移动到 Pod。如果您需要这样做,最好使用两阶段程序,首先从 Pod A 复制到您的机器,然后再复制到 Pod B。
由于cp
依赖于tar
后台,您需要确保您的容器映像包含它。你会看到一个No such file or directory tar
错误,如果你尝试运行cp
对抗吊舱没有tar
。在这种情况下,无论是添加tar
到容器或使用的组合kubectl exec
并cat
,如果你只需要找回一些文件。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
2020-06-23 Idea 避免import *
2015-06-23 Android中设置文本颜色的三种方法
2015-06-23 刘宝瑞相声《珍珠翡翠白玉汤》台词
2015-06-23 android工程gen目录中R.java包名是怎么确定
2015-06-23 [转]Android 使用Scroller实现绚丽的ListView左右滑动删除Item效果
2015-06-23 自定义listView添加滑动删除功能