错误:无法启动容器“在 $PATH 中找不到可执行文件:未知”

goo*_*ody 1 docker kubernetes

我对 docker Kubernetes 非常陌生。我已经创建了 3 个节点的集群,现在我正在创建一个用于 pod 创建的 YAML 文件。我从https://github.com/utkudarilmaz/docker-hping3获取了图像,图像名称是 utkudarilmaz/hping3。有人可以帮我设置路径中的命令或 docker 文件吗?因为我无法理解这个问题。我想让我的 pod 成功运行,这样我就可以利用它。\n我的 YAML 文件,例如

\n
---\n apiVersion: v1\n kind: Pod\n metadata:\n   name: second\n   labels:\n     app: web\n spec:\n   containers:\n     - name:  hping3\n       image: utkudarilmaz/hping3\n       command: ["hping3 [IP_ADDRESS"]\n       ports:\n         - containerPort: 80\n   nodeSelector:\n       disktype: ssd\n
Run Code Online (Sandbox Code Playgroud)\n

如果我不指定 [command],我的 Pod 状态为 CrashLoopBackOff。我搜索并发现我的 kubernetes pod 不断崩溃并显示“CrashLoopBackOff”,但我找不到任何日志\n我需要一个命令来连续运行容器,否则如果我在 YAML 文件中指定一个命令(如上面的命令),它就会进入循环命令:[“hping3 103.22.221.59”]然后当我运行时

\n
kubectl exec \xe2\x80\x93it second \xe2\x80\x93 hping3 [IP_ADDRESS]\n
Run Code Online (Sandbox Code Playgroud)\n

我明白了

\n
error: unable to upgrade connection: container not found ("hping3")\n
Run Code Online (Sandbox Code Playgroud)\n

kubectl 的输出描述了第二个 pod

\n
Events:\n  Type     Reason     Age                   From               Message\n  ----     ------     ----                  ----               -------\n  Normal   Scheduled  3m39s                 default-scheduler  Successfully assigned default/second1 to netcs\n  Normal   Pulled     3m35s                 kubelet            Successfully pulled image "utkudarilmaz/hping3" in 2.714028668s\n  Normal   Pulled     3m31s                 kubelet            Successfully pulled image "utkudarilmaz/hping3" in 2.734426606s\n  Normal   Pulled     3m15s                 kubelet            Successfully pulled image "utkudarilmaz/hping3" in 2.61256593s\n  Normal   Pulled     2m46s                 kubelet            Successfully pulled image "utkudarilmaz/hping3" in 2.65727147s\n  Warning  BackOff    2m11s (x5 over 3m4s)  kubelet            Back-off restarting failed container\n  Normal   Pulling    2m4s (x5 over 3m38s)  kubelet            Pulling image "utkudarilmaz/hping3"\n  Normal   Created    119s (x5 over 3m35s)  kubelet            Created container hping3\nWarning  Failed     119s (x5 over 3m35s)  kubelet            Error: failed to start container "hping3": Error response from daemon: OCI runtime create failed: container_linux.go:370: starting container process caused: exec: "hping3 103.22.221.59": executable file not found in $PATH: unknown\n\n\n  Normal   Pulled     119s                  kubelet            Successfully pulled image "utkudarilmaz/hping3" in 5.128803062s\n\n
Run Code Online (Sandbox Code Playgroud)\n

docker检查$utkudarilmaz/hping3的一些输出

\n
\n"Mounts": [],\n        "Config": {\n            "Hostname": "104e9920881b",\n            "Domainname": "",\n            "User": "",\n            "AttachStdin": false,\n            "AttachStdout": false,\n            "AttachStderr": false,\n            "Tty": true,\n            "OpenStdin": false,\n            "StdinOnce": false,\n            "Env": [\n                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"\n            ],\n            "Cmd": null,\n            "Image": "utkudarilmaz/hping3",\n            "Volumes": null,\n            "WorkingDir": "",\n            "Entrypoint": [\n                "hping3"\n            ],\n            "OnBuild": null,\n            "Labels": {\n                "desription": "hping3 tool building on Alpine:latest",\n                "version": "1.0"\n\n
Run Code Online (Sandbox Code Playgroud)\n

当我尝试此命令时,我的容器将不会继续运行\n

\n
command: [ "/bin/bash", "-c", "--" ]\n    args: [ "while true; do sleep 30; done;" ] from \n/sf/ask/2230915571/\n
Run Code Online (Sandbox Code Playgroud)\n

在路径中找不到相同的错误文件

\n

mar*_*rio 7

首先,您不需要containerPort在此处指定,因为容器中没有任何 TCP 端口正在侦听hping3

\n
$ kubectl exec -ti second -- /bin/sh                                                                               \n/ # netstat -ntlp\nActive Internet connections (only servers)\nProto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name\n
Run Code Online (Sandbox Code Playgroud)\n

事实上,您甚至不需要提供任何已在此 docker 映像中定义的command内容,并且您实际上不需要覆盖它。运行您所需要的只是以下 yaml 清单:hping3ENTRYPOINThping3 Pod

\n
apiVersion: v1\nkind: Pod\nmetadata:\n  name: second\nspec:\n  containers:\n    - name:  hping3\n      image: utkudarilmaz/hping3\n      args: ["IP-address"]\n
Run Code Online (Sandbox Code Playgroud)\n

是的,在这种情况下必须提供一些args,否则您的容器将陷入CrashLoopBackOff状态。

\n

正如您可以在README.md中阅读该图像的非常简短的描述:

\n
\n

用法:

\n
docker pull utkudarilmaz/hping3:latest\ndocker run utkudarilmaz/hping3:latest [parameters] target_ip\n
Run Code Online (Sandbox Code Playgroud)\n
\n

提供target_ip是强制性的,但您不必提供任何其他内容。

\n

虽然上面的用法描述没有提到在kubernetes上运行这个镜像的任何内容,但这样简短的描述对我们来说应该足够了,我们应该能够将它“从docker翻译成kubernetes语言”。

\n

请查看kubernetes官方文档中标题为“定义容器的命令和参数”的以下部分,尤其是此片段:

\n
\n

在此输入图像描述

\n

当您覆盖默认入口点和 Cmd 时,将应用以下规则:

\n
    \n
  • 如果您不提供 command 容器 args ,则使用 Docker 映像中定义的默认值。

    \n
  • \n
  • 如果您提供了 Containercommand 但没有 提供,则仅 使用args 提供 的。commandDocker 映像中定义的默认 EntryPoint 和\n默认 Cmd 将被忽略。

    \n
  • \n
  • 如果您仅为 args 容器提供,则 Docker 映像中定义的默认入口点将使用 args 您提供的\n运行。

    \n
  • \n
  • 如果您提供 commandargs,则 Docker 映像中定义的默认入口点和默认 Cmd 将被忽略。您的\ncommand 与您的 args.

    \n
  • \n
\n
\n

综上所述,我们对第三点特别感兴趣:

\n
\n
    \n
  • 如果您仅为 args 容器提供,则 Docker 映像中定义的默认入口点将使用 args 您提供的\n运行。
  • \n
\n
\n

这意味着在我们的kubernetes Pod定义中我们可以只提供args并且完全没问题。由于ENTRYPOINT已在utkudarilmaz/hping3映像中定义,因此无需通过定义 来覆盖它command

\n

我能够重现仅在尝试连接到hping3以下状态的容器时收到的错误消息CrashLoopBackOff

\n
$ kubectl exec -ti second -- hping3 [IP-address]                                                                  \nerror: unable to upgrade connection: container not found ("hping3")\n
Run Code Online (Sandbox Code Playgroud)\n

但当它运行时,kubectl exec工作没有任何问题:

\n
$ kubectl exec -ti second -- hping3 [IP-address]\nHPING [IP-address] (eth0 [IP-address]): NO FLAGS are set, 40 headers + 0 data bytes\n
Run Code Online (Sandbox Code Playgroud)\n

顺便提一句。命令中的连字符看起来有点奇怪,它们与从问题中的代码片段复制时不完全相同的字符并且-不能正确解释,从而导致奇怪的错误,如下所示:

\n
Error from server (NotFound): pods "\xe2\x80\x93it" not found\n
Run Code Online (Sandbox Code Playgroud)\n

因此,请注意您在命令中使用的确切字符。

\n

kubectl describe至于您在执行以下操作时看到的错误消息的解释Pod

\n
"hping3 [IP-address]": executable file not found in $PATH: unknown\n
Run Code Online (Sandbox Code Playgroud)\n

它清楚地表明,在您的文件中找不到名为“hping3 [IP-address]”的可执行文件(是的,单个文件的名称!),$PATH我确信您没有具有此类名称的可执行文件

\n

如果您提供command这样的方式:

\n
command: ["hping3 [IP-address]"]\n
Run Code Online (Sandbox Code Playgroud)\n

请记住,双引号之间的整个字符串被解释为单个命令/可执行文件。这就是为什么它试图寻找名为“hping3 [IP-address]”的可执行文件,但由于明显的原因它找不到它。

\n

正如评论中已经提到的,该字段的正确用法command可以是:

\n
command: ["hping3","[IP-address]"]\n
Run Code Online (Sandbox Code Playgroud)\n

但就你而言,你并不真正需要它。

\n

我希望上述解释对您有所帮助。

\n