首页 > 其他分享 >[Troubleshooting] kubectl cp exit code 255 - exec: \"tar\": executable file not found in

[Troubleshooting] kubectl cp exit code 255 - exec: \"tar\": executable file not found in

时间:2023-12-20 14:33:56浏览次数:22  
标签:kubectl executable code container tar 容器 host test 拷贝


0. 背景

kubectl cp container 文件到本地 host 报错:

$ kubectl cp test/po-test-pod-0:/tmp ./ -c ctr-test-container
time="2023-12-20T02:17:29Z" level=error msg="exec failed: unable to start container process: exec: \"tar\": executable file not found in $PATH"
command terminated with exit code 255

1. 分析

报错的原因是 kubectl 在拷贝容器文件到本地时,使用 tar 打包 container 的文件,如果容器文件系统没有装 tar 或者 $PATH 系统目录没有指定 tar 包,就会报这样的错。

2. 解决

解决方案有两点:

  • 容器内装 tar
  • host 上拷贝文件

2.1 容器内装 tar

2.1.1 拷贝 tar 到容器

如分析所示,在容器内装 tar 可以解决拷贝报错的问题。容器内装 tar 可以通过 kubectl cp 拷贝本地 tar 工具到容器系统环境目录,从本地拷贝到容器是不需要 tar 工具的。

当然,这种拷贝可能会有问题,有问题的地方是涉及到 OS 系统库的调用就比较复杂。比如执行 tar 包依赖 Linux 系统库 lib.so(示例),而容器内没有 lib.so 这个库,就会在容器内执行 tar 时报错。

2.1.2 image 安装 tar

编容器 image 的时候安装 tar 包,这是比较保险的方式。当然,需要重新编,重新安装容器,比较麻烦。

2.2 host 上拷贝文件

这种做法比较省事,不需要装 tar,不需要编 image ,有点黑科技的意味。在解释这种方式之前先说明下,image 是静态的容器,容器是动态的 image 。理解这句话就知道下面为什么要这么干了。

这里并不打算介绍其中的原理,侧重于解决,直接给出操作步骤:

1) 查看容器所在 host

$ kubectl get pods po-test-pod-0 -o wide
NAME                READY   STATUS    RESTARTS   AGE   IP              NODE                                                   NOMINATED NODE   READINESS GATES
po-test-pod-0       16/16   Running   0          17m   172.21.24.249   worker13.hztt-pz2-10-100-xxx-xx.ocp.hz.nsn-rdnet.net   <none>           <none>

Note: 注意我们想看的是容器所在的 host ,pod 是 kubernetes 的概念,在 Kubernetes/OpenShift 上看容器所在的 host,首先要知道容器在哪个 pod 下。

2)login 到 work13 并切换为 root  用户

$ ssh worker13.hztt-pz2-10-100-xxx-xx.ocp.hz.nsn-rdnet.net
$ sudo su
#

3)获取容器 id

# crictl ps | grep ctr-test-container
cd9b94522939a       image-registry.openshift-image-registry.svc:5000/test/container@sha256:9516f2783c28faa796f44d670ea46d551384bacb16bef102d66d084efcc43094                                   20 minutes ago      Running             ctr-test-container                   0                   7168da119742f       po-test-pod-0

Note: 要查看容器 id,需要看平台用的 cri-o 是什么,有些用 docker,有些用 crio。这里环境用的是 crio,我们可以用 crictl 去看容器的 id。

4)inspect 容器

inspect  容器是为了看容器的文件系统在 host  上的目录,知道了 host  上的目录就能找到要拷贝的容器的文件了:

# crictl inspect 32bfea1ad0f77 | grep io.kubernetes.cri-o.MountPoint
        "io.kubernetes.cri-o.MountPoint": "/var/lib/containers/storage/overlay/37eb5dc59ec82566122bc0a61504afb3b6d092fcd74953362d84d8f8b3ef1262/merged",
# cd /var/lib/containers/storage/overlay/37eb5dc59ec82566122bc0a61504afb3b6d092fcd74953362d84d8f8b3ef1262/merged
# ls
afs  bin  boot  dev  etc  ffs  home  lib  lib64  logs  lost+found  media  mnt  opt  proc  ram  rom  root  rpram  run  sbin  srv  sys  tmp  tmp_repo  usr  var

可以看到,mountPoint 即为本地 host 上 mount 到容器内的文件系统,我们在本地进入容器文件系统可以实现文件的拷贝。


标签:kubectl,executable,code,container,tar,容器,host,test,拷贝
From: https://www.cnblogs.com/xingzheanan/p/17916454.html

相关文章

  • [LeetCode22-中等-DFS] 括号生成
    这道题考使用回溯(递归的一种)进行深度优先算法,题目是这样的数字n代表生产括号的对数,写一个算法,返回所有有效的括号组合比如 n=1代表生成1对括号,显然答案就是“()"n=2,代表生成2对括号, 答案就是"()()","(())"n=3代表生成3对括号,答案就是"((()))","()()()","(()())......
  • Derivative norm vector repect to time 《PBM by Pixar》 Appendix D.2 code
    目录1Derivativenormalvectorrepecttotime1.1DerivativevectornormrepecttotimeXRefVectorCalculus1DerivativenormalvectorrepecttotimeLet'sdenotetheunitnormalvectoras:\[\mathbf{n}=\frac{\mathbf{e}_a\times\mathbf{e}_b}{......
  • [LeetCode] LeetCode81. 搜索旋转排序数组II
    题目描述思路:是lc33.搜索旋转排序数组的延伸,允许包含重复元素起初:当nums[left]<=nums[mid]时,区间[left,mid]有序当nums[left]>nums[mid]时,区间[mid,right]有序但是这个题目当nums[left]==nums[mid]时,无法判断哪个区间是有序的,无法判断target位于左侧还是右侧,此时无......
  • [LeetCode Hot 100] LeetCode153. 寻找旋转排序数组中的最小值
    题目描述思路如果数组翻转后又回到升序的情况,即nums[left]<=nums[right],则nums[left]就是最小值,直接返回。如果数组翻转,需要找到数组中第二部分的第一个元素:若nums[left]<=nums[mid],说明区间[left,mid]连续递增,则最小元素一定不在这个区间里,可以直接排除,最小值在[......
  • Odoo_vscode调试
    1.正常开发调试{"name":"Odoo开发调试","type":"python","python":"/home/wdc/work/venv/bin/python3","request":"launch",......
  • Leetcode 044. 通配符匹配
    https://leetcode.cn/problems/wildcard-matching/description/给你一个输入字符串(s)和一个字符模式(p),请你实现一个支持'?'和'*'匹配规则的通配符匹配:'?'可以匹配任何单个字符。'*'可以匹配任意字符序列(包括空字符序列)。判定匹配成功的充要条件是:字符模式必须能够......
  • [Codeforces] CF1795C Tea Tasting
    CF1795CTeaTasting题意有\(n\)个人和\(n\)杯茶,第\(i\)个人每次会喝\(b_i\)毫升的茶。第\(i\)杯茶有\(a_i\)毫升。总共会喝\(n\)轮茶,第\(j\)轮第\(i\)个人会尝试喝第\(i+1-j\)杯茶。喝的量为\(\min(a_{i+1-j},b_i)\)毫升,并且使\(a_{i+1-j}\)减少\(\mi......
  • AtCoder 333 A-D
    AThreeThrees(打表importjava.util.*;classMain{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);intn=sc.nextInt();if(n==1)System.out.println(1);if(n==2)System.out.println......
  • vscode调试apollo
    一、插件要求二、通过插件进入容器三、配置默认进入的目录和用户如果不配置默认用户是root,运行不了apollo程序。 修改红框中的默认工作目录和用户名{ "workspaceFolder":"/apollo", "remoteUser":"chenjian", "extensions":[ "BazelBuild.vscode-bazel", &q......
  • vscode中Todo Tree插件的使用
    vscode中TodoTree插件的使用配置JSON将下方的JSON代码放入用户配置中复制JSON配置后,点击这里,然后粘贴。"todo-tree.tree.showScanModeButton":false,"todo-tree.filtering.excludeGlobs":["**/node_modules","*.xml","*.XML"],"todo......