我对 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\nRun Code Online (Sandbox Code Playgroud)\n如果我不指定 [command],我的 Pod 状态为 CrashLoopBackOff。我搜索并发现我的 kubernetes pod 不断崩溃并显示“CrashLoopBackOff”,但我找不到任何日志\n我需要一个命令来连续运行容器,否则如果我在 YAML 文件中指定一个命令(如上面的命令),它就会进入循环命令:[“hping3 103.22.221.59”]然后当我运行时
\nkubectl exec \xe2\x80\x93it second \xe2\x80\x93 hping3 [IP_ADDRESS]\nRun Code Online (Sandbox Code Playgroud)\n我明白了
\nerror: unable to upgrade connection: container not found ("hping3")\nRun Code Online (Sandbox Code Playgroud)\nkubectl 的输出描述了第二个 pod
\nEvents:\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\nRun Code Online (Sandbox Code Playgroud)\ndocker检查$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\nRun Code Online (Sandbox Code Playgroud)\n当我尝试此命令时,我的容器将不会继续运行\n
\ncommand: [ "/bin/bash", "-c", "--" ]\n args: [ "while true; do sleep 30; done;" ] from \n/sf/ask/2230915571/\nRun Code Online (Sandbox Code Playgroud)\n在路径中找不到相同的错误文件
\n首先,您不需要containerPort在此处指定,因为容器中没有任何 TCP 端口正在侦听hping3:
$ 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\nRun Code Online (Sandbox Code Playgroud)\n事实上,您甚至不需要提供任何已在此 docker 映像中定义的command内容,并且您实际上不需要覆盖它。运行您所需要的只是以下 yaml 清单:hping3ENTRYPOINThping3 Pod
apiVersion: v1\nkind: Pod\nmetadata:\n name: second\nspec:\n containers:\n - name: hping3\n image: utkudarilmaz/hping3\n args: ["IP-address"]\nRun Code Online (Sandbox Code Playgroud)\n是的,在这种情况下必须提供一些args,否则您的容器将陷入CrashLoopBackOff状态。
正如您可以在README.md中阅读该图像的非常简短的描述:
\n\n\n用法:
\nRun Code Online (Sandbox Code Playgroud)\ndocker pull utkudarilmaz/hping3:latest\ndocker run utkudarilmaz/hping3:latest [parameters] target_ip\n
提供target_ip是强制性的,但您不必提供任何其他内容。
虽然上面的用法描述没有提到在kubernetes上运行这个镜像的任何内容,但这样简短的描述对我们来说应该足够了,我们应该能够将它“从docker翻译成kubernetes语言”。
\n请查看kubernetes官方文档中标题为“定义容器的命令和参数”的以下部分,尤其是此片段:
\n\n\n\n当您覆盖默认入口点和 Cmd 时,将应用以下规则:
\n\n
\n- \n
如果您不提供
\ncommand容器args,则使用 Docker 映像中定义的默认值。- \n
如果您提供了 Container
\ncommand但没有 提供,则仅 使用args提供 的。commandDocker 映像中定义的默认 EntryPoint 和\n默认 Cmd 将被忽略。- \n
如果您仅为
\nargs容器提供,则 Docker 映像中定义的默认入口点将使用args您提供的\n运行。- \n
如果您提供
\ncommand和args,则 Docker 映像中定义的默认入口点和默认 Cmd 将被忽略。您的\ncommand与您的args.
综上所述,我们对第三点特别感兴趣:
\n\n\n\n
\n- 如果您仅为
\nargs容器提供,则 Docker 映像中定义的默认入口点将使用args您提供的\n运行。
这意味着在我们的kubernetes Pod定义中我们可以只提供args并且完全没问题。由于ENTRYPOINT已在utkudarilmaz/hping3映像中定义,因此无需通过定义 来覆盖它command。
我能够重现仅在尝试连接到hping3以下状态的容器时收到的错误消息CrashLoopBackOff:
$ kubectl exec -ti second -- hping3 [IP-address] \nerror: unable to upgrade connection: container not found ("hping3")\nRun Code Online (Sandbox Code Playgroud)\n但当它运行时,kubectl exec工作没有任何问题:
$ kubectl exec -ti second -- hping3 [IP-address]\nHPING [IP-address] (eth0 [IP-address]): NO FLAGS are set, 40 headers + 0 data bytes\nRun Code Online (Sandbox Code Playgroud)\n顺便提一句。命令中的连字符看起来有点奇怪,它们与从问题中的代码片段复制时不完全相同的字符并且-不能正确解释,从而导致奇怪的错误,如下所示:
Error from server (NotFound): pods "\xe2\x80\x93it" not found\nRun Code Online (Sandbox Code Playgroud)\n因此,请注意您在命令中使用的确切字符。
\nkubectl describe至于您在执行以下操作时看到的错误消息的解释Pod:
"hping3 [IP-address]": executable file not found in $PATH: unknown\nRun Code Online (Sandbox Code Playgroud)\n它清楚地表明,在您的文件中找不到名为“hping3 [IP-address]”的可执行文件(是的,单个文件的名称!),$PATH我确信您没有具有此类名称的可执行文件
如果您提供command这样的方式:
command: ["hping3 [IP-address]"]\nRun Code Online (Sandbox Code Playgroud)\n请记住,双引号之间的整个字符串被解释为单个命令/可执行文件。这就是为什么它试图寻找名为“hping3 [IP-address]”的可执行文件,但由于明显的原因它找不到它。
\n正如评论中已经提到的,该字段的正确用法command可以是:
command: ["hping3","[IP-address]"]\nRun Code Online (Sandbox Code Playgroud)\n但就你而言,你并不真正需要它。
\n我希望上述解释对您有所帮助。
\n| 归档时间: |
|
| 查看次数: |
18382 次 |
| 最近记录: |