不使用 kubectl cp 将文件复制到 kubernetes pod

pra*_*ant 5 kubernetes

我有一个用例,我的 pod 以非 rootuser 身份运行并且它运行一个 python 应用程序。现在我想将文件从主节点复制到正在运行的 pod。但是当我尝试跑步时

kubectl cp app.py 103000-pras-dev/simplehttp-777fd86759-w79pn:/tmp
Run Code Online (Sandbox Code Playgroud)

这个命令挂了,但是当我以 root 用户身份运行 pod 然后运行相同的命令时,它会成功执行。我正在浏览 kubectl cp 的代码,它在内部使用 tar 命令。

Tar 命令有多个标志,如 --overwrite --no-same-owner、--no-preserve 等。现在从 kubectl cp 我们不能将所有这些标志传递给 tar。有什么方法可以使用 kubectl exec 命令或任何其他方式复制文件。

kubectl exec simplehttp-777fd86759-w79pn -- cp app.py /tmp/ **flags**
Run Code Online (Sandbox Code Playgroud)

小智 5

如果源文件是一个简单的文本文件,这是我的技巧:

#!/usr/bin/env bash

function copy_text_to_pod() {
  namespace=$1
  pod_name=$2
  src_filename=$3
  dest_filename=$4

  base64_text=`cat $src_filename | base64`
  kubectl exec -n $namespace $pod_name -- bash -c "echo \"$base64_text\" | base64 -d > $dest_filename"
}

copy_text_to_pod my-namespace my-pod-name /path/of/source/file /path/of/target/file
Run Code Online (Sandbox Code Playgroud)

也许base64不是必需的。我把它放在这里是为了防止源文件中有一些特殊字符。


pra*_*ant 0

与此同时,我发现了一个 hack,免责声明,这不是确切的 kubectl cp 只是一种解决方法。

我编写了一个 go 程序,其中创建了一个 goroutine 来读取文件并将其附加到 stdin 并使用适当的标志运行 kubectl exec tar 命令。这是我所做的

reader, writer := io.Pipe()
copy := exec.CommandContext(ctx, "kubectl", "exec", pod.Name, "--namespace", pod.Namespace, "-c", container.Name, "-i",
    "--", "tar", "xmf", "-", "-C", "/", "--no-same-owner") // pass all the flags you want to
copy.Stdin = reader
go func() {
    defer writer.Close()

    if err := util.CreateMappedTar(writer, "/", files); err != nil {
        logrus.Errorln("Error creating tar archive:", err)
    }
}()
Run Code Online (Sandbox Code Playgroud)

辅助函数定义

func CreateMappedTar(w io.Writer, root string, pathMap map[string]string) error {
    tw := tar.NewWriter(w)
    defer tw.Close()

    for src, dst := range pathMap {
        if err := addFileToTar(root, src, dst, tw); err != nil {
            return err
        }

    }

    return nil
}
Run Code Online (Sandbox Code Playgroud)

显然,由于权限问题,这个东西不起作用,但*我能够传递 tar 标志