Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不使用kubectl cp将文件复制到kubernetes吊舱中_Kubernetes - Fatal编程技术网

不使用kubectl cp将文件复制到kubernetes吊舱中

不使用kubectl cp将文件复制到kubernetes吊舱中,kubernetes,Kubernetes,我有一个用例,我的pod作为非root用户运行,它运行的是python应用程序。 现在我想将文件从主节点复制到运行的pod。但是当我试着跑的时候 kubectl cp app.py 103000-pras-dev/simplehttp-777fd86759-w79pn:/tmp 当我以root用户的身份运行pod,然后运行相同的命令时,这个命令会阻塞 它执行成功。我正在浏览kubectl cp的代码,它在内部使用tar命令 Tar命令有多个标志,比如--overwrite--no-same o

我有一个用例,我的pod作为非root用户运行,它运行的是python应用程序。 现在我想将文件从主节点复制到运行的pod。但是当我试着跑的时候

kubectl cp app.py 103000-pras-dev/simplehttp-777fd86759-w79pn:/tmp
当我以root用户的身份运行pod,然后运行相同的命令时,这个命令会阻塞 它执行成功。我正在浏览kubectl cp的代码,它在内部使用tar命令

Tar命令有多个标志,比如--overwrite--no-same owner,-no-preserve和其他一些标志。现在从库贝特cp我们不能把所有的旗帜传给柏油。是否有任何方法可以使用kubectl exec命令或任何其他方法复制文件

kubectl exec simplehttp-777fd86759-w79pn -- cp app.py /tmp/ **flags**

与此同时,我发现了一个黑客,免责声明这不是确切的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)
    }
}()
辅助函数定义

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
}

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

,如果它只是一个文本文件,也可以通过netcat“复制”

1)您必须同时登录两个节点

$ kubectl exec -ti <pod_name> bash
3)使用权限进入文件夹,即

/tmp
4)在有python文件写入的容器内

$ cat app.py | nc -l <random_port>
它将在提供的端口上开始侦听

5)在您想要保存文件的容器内

$ nc <PodIP_where_you_have_py_file> > app.py 
它必须是POD IP,它将无法识别POD名称。要获得ip,请使用kubectl get pods-o wide

它会将app.py文件的内容复制到另一个容器文件中。不幸的是,您需要添加权限手册,或者您可以使用脚本,如(由于“复制”的速度,需要睡眠):


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

#!/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

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

它是同一个物理节点吗?如果是,是否尝试使用hostPath卷?同一物理节点。。。嗯,这意味着什么?它们在不同的节点上,一个是master,另一个是pod。只要它是一个文本文件,
master节点$cat app.py | kubectl exec simplehttpetcetc--tee/tmp/app.py>/dev/null
将执行您想要的操作(可能有一些
-i
和/或
-t
标志散布到
exec
,因为我永远记不起哪种命令需要哪种
$ nc <PodIP_where_you_have_py_file> > app.py 
$ nc 10.36.18.9 1234 > app.py
#!/bin/sh
nc 10.36.18.9 1234 > app.py | sleep 2 |chmod 770 app.py;
#!/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