K8s环境下在Pod中运行Pod中没有的命令-----nsenter

1. 问题

平时排错时经常碰到容器中没有某些调试命令,有时候网络环境也不允许我们在这些容器中安装调试命令。或者就是这些容器是生产环境我们的任何改动可能都会引起不必要的麻烦。那么应该怎么做呢?

1.1 现象再现

我们拿这个容器做测试

bash 复制代码
root@k8s-133-master01:~# kubectl get pods -o wide -n default
NAME                                 READY   STATUS    RESTARTS      AGE    IP              NODE             NOMINATED NODE   READINESS GATES
synergy-leverager-6dbb59cd5d-5psfj   2/2     Running   2 (81m ago)   183d   10.244.82.218   k8s-133-node02   <none>           <none>

尝试在synergy-leverager-6dbb59cd5d-5psfj上执行curl 命令

bash 复制代码
root@k8s-133-master01:~# kubectl exec -it synergy-leverager-6dbb59cd5d-5psfj -- curl www.baidu.com
Defaulted container "synergy-leverager" out of: synergy-leverager, sidecar
error: Internal error occurred: Internal error occurred: error executing command in container: failed to exec in container: failed to start exec "83441eb783e9d65ff5ada6fa87d37320d611b5c6697d343cb4a780e7ac7581d0": OCI runtime exec failed: exec failed: unable to start container process: exec: "curl": executable file not found in $PATH: unknown

2. 解决方法

2.1 获取容器所在的服务器

  1. 先在master上先获取这个容器是在哪个机器上运行的。

这里我们看到是在node02上

bash 复制代码
root@k8s-133-master01:~# kubectl get pods -o wide -n default
NAME                                 READY   STATUS    RESTARTS      AGE    IP              NODE             NOMINATED NODE   READINESS GATES
synergy-leverager-6dbb59cd5d-5psfj   2/2     Running   2 (81m ago)   183d   10.244.82.218   k8s-133-node02   <none>           <none>
  1. 在node02上找到容器

由于这个Pod存在Sidecar所以会看到2个ID,我们需要的是synergy-leverager这个也就是ID为31954460b60c5的这个

bash 复制代码
root@k8s-133-node02:~# crictl ps |grep synergy-leverager-6dbb59cd5d-5psfj
c744b3f17ec5a       8c811b4aec35f       31 minutes ago      Running             sidecar                     1                   0d1e2b23c5648       synergy-leverager-6dbb59cd5d-5psfj
31954460b60c5       8c811b4aec35f       31 minutes ago      Running             synergy-leverager           1                   0d1e2b23c5648       synergy-leverager-6dbb59cd5d-5psfj
  1. 获取到容器的Pid
bash 复制代码
root@k8s-133-node02:~# crictl inspect  31954460b60c5 | jq .info.pid
3681
  1. 通过Pid 来尝试用curl命令进行测试
bash 复制代码
root@k8s-133-node02:~# nsenter -t 3681 -n -- curl www.baidu.com
<!DOCTYPE html>
<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_form> <div class=s_form_wrapper> <div id=lg> <img hidefocus=true src=//www.baidu.com/img/bd_logo1.png width=270 height=129> </div> <form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><span class="bg s_ipt_wr"><input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus></span><span class="bg s_btn_wr"><input type=submit id=su value=百度一下 class="bg s_btn"></span> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>新闻</a> <a href=http://www.hao123.com name=tj_trhao123 class=mnav>hao123</a> <a href=http://map.baidu.com name=tj_trmap class=mnav>地图</a> <a href=http://v.baidu.com name=tj_trvideo class=mnav>视频</a> <a href=http://tieba.baidu.com name=tj_trtieba class=mnav>贴吧</a> <noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&amp;tpl=mn&amp;u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class=lb>登录</a> </noscript> <script>document.write('<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u='+ encodeURIComponent(window.location.href+ (window.location.search === "" ? "?" : "&")+ "bdorz_come=1")+ '" name="tj_login" class="lb">登录</a>');</script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">更多产品</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>关于百度</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>&copy;2017&nbsp;Baidu&nbsp;<a href=http://www.baidu.com/duty/>使用百度前必读</a>&nbsp; <a href=http://jianyi.baidu.com/ class=cp-feedback>意见反馈</a>&nbsp;京ICP证030173号&nbsp; <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>

看上去命令可以被执行了。我们再看下容器下是否真的没有这个命令。

bash 复制代码
root@k8s-133-node02:~# crictl exec -it 31954460b60c5 sh
/ # which curl
/ # curl
sh: curl: not found

显然我们的测试是成功的,容器下没有curl,我们利用了宿主机的命令来实现了测试的功能。

相关推荐
Patrick_Wilson2 天前
从「改个端口」到 502:Next.js on k8s 的容器端口、Service 映射与 env 覆盖
docker·kubernetes·next.js
探索云原生2 天前
K8s 1.36 这个 GA 特性,把 initContainer 拉模型的 hack 干掉了
ai·云原生·kubernetes
云恒要逆袭2 天前
运行你的第一个Docker容器
后端·docker·容器
Java之美3 天前
一次k8s升级引发的DevicePlugin注册失败
云原生·kubernetes
程序员老赵4 天前
10 分钟部署 OpenCode:Docker 一键安装,浏览器打开就能用 AI 写代码(附完整命令与排错)
docker·容器·ai编程
武子康7 天前
调查研究-183 Apple container:Mac 上用轻量 VM 跑 Linux 容器,Swift 会改写本地容器体验吗?
docker·容器·apple
2601_9618752410 天前
决战申论100题2026|最新|范文
linux·容器·centos·debian·ssh·fabric·vagrant
java_cj10 天前
深入kube-apiserver认证机制:从Bearer Token到mTLS的完整认证链解析
linux·运维·服务器·云原生·容器·kubernetes
程序员老赵10 天前
服务器没有桌面?Docker 跑个 Chrome,浏览器就能远程用
docker·容器·devops