Kubernetes 如何使用kubectl启动容器并获取退出代码?没有kubectl执行官

Kubernetes 如何使用kubectl启动容器并获取退出代码?没有kubectl执行官,kubernetes,continuous-deployment,kubectl,Kubernetes,Continuous Deployment,Kubectl,我的CI工具使用生命周期,所以如果开发人员部署有效,它将转到QA 我有一个要在kubernetes中运行的端到端测试容器,但是如何从容器中获取退出代码呢 我可以运行容器并在一个命令中返回退出代码吗 kubectl运行-it 似乎没有获得退出代码,在容器完成后还有一些额外的事情要说。kubectl get po pod_name-ojson | jq.status.containerstatus[].state.terminated.exitCode 要从吊舱(容器)获取出口代码,您可以通过以下命

我的CI工具使用生命周期,所以如果开发人员部署有效,它将转到QA

我有一个要在kubernetes中运行的端到端测试容器,但是如何从容器中获取退出代码呢

我可以运行容器并在一个命令中返回退出代码吗

kubectl运行-it
似乎没有获得退出代码,在容器完成后还有一些额外的事情要说。

kubectl get po pod_name-ojson | jq.status.containerstatus[].state.terminated.exitCode

要从吊舱(容器)获取出口代码,您可以通过以下命令获取吊舱详细信息:

kubectl get pod termination-demo --output=yaml
输出:

apiVersion: v1
kind: Pod
...
    lastState:
      terminated:
        containerID: ...
        exitCode: 0
        finishedAt: ...
        message: |
          Sleep expired
        ...
要了解更多信息,您可以查看

要使跑步更轻松,请执行以下操作:

kubectl get pod busybox-term -ojson | jq .status.containerStatuses[].lastState.terminated.exitCode
kubectl get pod busybox-term --output="jsonpath={.status.containerStatuses[].lastState.terminated.exitCode}"
或者,如果不想安装
jq
,可以运行:

kubectl get pod busybox-term -ojson | jq .status.containerStatuses[].lastState.terminated.exitCode
kubectl get pod busybox-term --output="jsonpath={.status.containerStatuses[].lastState.terminated.exitCode}"

您可以通过管道将
kubectl get
的输出传输到jq,jq可以解析json并打印退出代码,如果存在单个容器,您可以跳过
-c容器名称

kubectl get pod pod_name -c container_name-n namespace -ojson | jq .status.containerStatuses[].state.terminated.exitCode
前面提到过这种方式,所以我在这里添加了一些额外的细节:

通过这种方式,您可以从Pod返回退出代码0-255(255之后重新开始,256==0)

-it
--restart=Never
是必需的,
--rm
是可选的,但用于删除失败的POD。
--restart=Never
告诉生成器创建一个Pod对象,而不是部署

$ kubectl run -it --rm exitcode --image=nginx --restart=Never -- bash -c "exit 0"
pod "exitcode" deleted
$ echo $?
0

$ kubectl run -it --rm exitcode --image=nginx --restart=Never -- bash -c "exit 1"
pod "exitcode" deleted
pod default/exitcode terminated (Error)
$ echo $?
1

$ kubectl run -it --rm exitcode --image=nginx --restart=Never -- bash -c "exit 8"
pod "exitcode" deleted
pod default/exitcode terminated (Error)
$ echo $?
8

$ kubectl run -it --rm exitcode --image=nginx --restart=Never -- bash -c "exit 250"
pod "exitcode" deleted
pod default/exitcode terminated (Error)
$ echo $?
250

$ kubectl run -it --rm exitcode --image=nginx --restart=Never -- bash -c "exit 255"
pod "exitcode" deleted
pod default/exitcode terminated (Error)
$ echo $?
255

$ kubectl run -it --rm exitcode --image=nginx --restart=Never -- bash -c "exit 256"
pod "exitcode" deleted
$ echo $?
0

# exit code can also be assigned to a variable
$ kubectl run -it --rm exitcode --image=nginx --restart=Never -- bash -c "exit 255" ; a=$? && echo $a
pod "exitcode" deleted
pod default/exitcode terminated (Error)
255
LoganMzz的更新:

$ kubectl run -it --rm --image=busybox --restart=Never foobar -- ash -c 'exit 10'; echo rc=$?
pod "foobar" deleted
pod default/foobar terminated (Error)
rc=10

$ kubectl version
Client Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.5", GitCommit:"e6503f8d8f769ace2f338794c914a96fc335df0f", GitTreeState:"clean", BuildDate:"2020-06-26T03:47:41Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.5", GitCommit:"e6503f8d8f769ace2f338794c914a96fc335df0f", GitTreeState:"clean", BuildDate:"2020-06-26T03:39:24Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"}

$ kubectl get nodes -o wide
NAME         STATUS   ROLES    AGE    VERSION   INTERNAL-IP   EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME
10.10.0.21   Ready    master   2d1h   v1.18.5   10.10.0.21    <none>        Ubuntu 16.04.6 LTS   4.4.0-184-generic   docker://18.9.7
10.10.0.22   Ready    <none>   2d1h   v1.18.5   10.10.0.22    <none>        Ubuntu 16.04.6 LTS   4.4.0-184-generic   docker://18.9.7
$kubectl run-it--rm--image=busybox--restart=Never-foobar--ash-c'exit 10';echo rc=$?
删除pod“foobar”
pod默认/foobar终止(错误)
rc=10
$kubectl版本
客户端版本:Version.Info{Major:“1”,Minor:“18”,GitVersion:“v1.18.5”,GitCommit:“e6503f8f769ace2f338794c914a96fc335df0f”,gittrestate:“clean”,BuildDate:“2020-06-26T03:47:41Z”,政府版本:“go1.13.9”,编译器:“gc”,平台:“linux/amd64”}
服务器版本:Version.Info{Major:“1”,Minor:“18”,GitVersion:“v1.18.5”,GitCommit:“e6503f8f769ace2f338794c914a96fc335df0f”,gittrestate:“clean”,BuildDate:“2020-06-26T03:39:24Z”,政府版本:“go1.13.9”,编译器:“gc”,平台:“linux/amd64”}
$kubectl获取节点-o宽
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
10.10.0.21 Ready master 2d1h v1.18.5 10.10.0.21 Ubuntu 16.04.6 LTS 4.4.0-184-genericdocker://18.9.7
10.10.0.22 Ready 2d1h v1.18.5 10.10.0.22 Ubuntu 16.04.6 LTS 4.4.0-184-genericdocker://18.9.7

虽然这段代码可以回答这个问题,但最好包含一些上下文,解释它是如何工作的以及何时使用它。从长远来看,只有代码的答案是没有用的。你检查过我的答案了吗。这对你有帮助吗?如果是的话,考虑接受和投票,这样它可以在将来帮助其他人。没有一个答案真的有助于启动POD,只需获得退出代码。我需要一种提交作业/ POD并获得退出代码的方法。但部署和吊舱似乎有随机名称。我怎样才能得到我刚刚启动的那一个呢?如果运行
kubectl run--image=busybox--attach=true--restart=Never sleep--/bin/sh-c“sleep 10”
,然后在运行
echo$?
之后,将返回
0
,并引用pod执行。如果运行
kubectl run--image=busybox--attach=true--restart=Never sleep--/bin/sh-c“none”
,那么
echo$?
将返回
127
(未找到命令)。让我知道它是否对您有帮助,这样我就可以更新我的答案,包括对相关文档的引用;echo rc=$?
我从服务器上删除了
pod“foobar”
+
错误(未找到):未找到pod“foobar”
+
rc=1