从 K8s 的容器中拷贝文件可以使用kubectl cp命令,但是对于较大的文件(100M 以上)可能就不是很好使了,拷贝过程经常会出现EOF错误

对于较大的文件,我是这样操作的:

  1. 压缩

    通过压缩可以减小大文件的体积

    tar -czvf largefile.tar.gz largefile
    

    此操作也可以用于打包整个文件夹,以便达到拷贝文件夹的目的

  2. 分片

    对于体积较大的文件,即使压缩后仍然有好几百 M,这时使用kubectl cp也不一定能够拷贝下来,所以需要对其分割

    split -b 50M -d largefile.tar.gz largefile.tar.gz
    

    此操作会将largefile.tar.gz按照 50M/每个文件的大小分割为多个文件,-d选项则是使用数字来作为后缀(默认是英文字母)

    例如:largefile.tar.gz有 220M,则分割后会变为

    largefile.tar.gz00 # 50M
    largefile.tar.gz01 # 50M
    largefile.tar.gz02 # 50M
    largefile.tar.gz03 # 50M
    largefile.tar.gz04 # 20M
    
  3. 拷贝

    使用kubectl cp命令拷贝分割后的文件

    kubectl cp <pod-name>:largefile.tar.gz00 largefile.tar.gz00
    kubectl cp <pod-name>:largefile.tar.gz00 largefile.tar.gz01
    kubectl cp <pod-name>:largefile.tar.gz00 largefile.tar.gz02
    kubectl cp <pod-name>:largefile.tar.gz00 largefile.tar.gz03
    kubectl cp <pod-name>:largefile.tar.gz00 largefile.tar.gz04
    

    对于多个容器的 Pod,可以使用-c选项指定具体的容器

  4. 合并 使用cat命令合并多个文件

    cat largefile.tar.gz* > largefile.tar.gz
    

    可以使用md5sum命令计算合并后的文件 hash 值与容器内的文件 hash 值是否一致来判断文件是否有缺失

  5. 解压

    tar -xzvf largefile.tar.gz
    

    至此,我就将大文件从 Pod 中拷贝出来了