Kubernetes 作业中的 Sidecar 容器?
Sidecar containers in Kubernetes Jobs?
我们在这里使用 Kubernetes Job
s 进行大量批处理计算,我想为每个作业配备一个监控 sidecar,以根据作业的进度更新集中式跟踪系统。
唯一的问题是,我无法弄清楚作业中多个容器的语义是什么(或应该是什么)。
我还是尝试了一下(使用 alpine
sidecar 每 1 秒打印 "hello"),在我的主要任务完成后,Job
被认为是 Successful
和 Kubernetes 1.2.0 中的 kubectl get pods
显示:
NAME READY STATUS RESTARTS AGE
job-69541b2b2c0189ba82529830fe6064bd-ddt2b 1/2 Completed 0 4m
job-c53e78aee371403fe5d479ef69485a3d-4qtli 1/2 Completed 0 4m
job-df9a48b2fc89c75d50b298a43ca2c8d3-9r0te 1/2 Completed 0 4m
job-e98fb7df5e78fc3ccd5add85f8825471-eghtw 1/2 Completed 0 4m
如果我描述其中之一 pods
State: Terminated
Reason: Completed
Exit Code: 0
Started: Thu, 24 Mar 2016 11:59:19 -0700
Finished: Thu, 24 Mar 2016 11:59:21 -0700
然后 GET
ing 作业的 yaml 显示每个容器的信息:
status:
conditions:
- lastProbeTime: null
lastTransitionTime: 2016-03-24T18:59:29Z
message: 'containers with unready status: [pod-template]'
reason: ContainersNotReady
status: "False"
type: Ready
containerStatuses:
- containerID: docker://333709ca66462b0e41f42f297fa36261aa81fc099741e425b7192fa7ef733937
image: luigi-reduce:0.2
imageID: docker://sha256:5a5e15390ef8e89a450dac7f85a9821fb86a33b1b7daeab9f116be252424db70
lastState: {}
name: pod-template
ready: false
restartCount: 0
state:
terminated:
containerID: docker://333709ca66462b0e41f42f297fa36261aa81fc099741e425b7192fa7ef733937
exitCode: 0
finishedAt: 2016-03-24T18:59:30Z
reason: Completed
startedAt: 2016-03-24T18:59:29Z
- containerID: docker://3d2b51436e435e0b887af92c420d175fafbeb8441753e378eb77d009a38b7e1e
image: alpine
imageID: docker://sha256:70c557e50ed630deed07cbb0dc4d28aa0f2a485cf7af124cc48f06bce83f784b
lastState: {}
name: sidecar
ready: true
restartCount: 0
state:
running:
startedAt: 2016-03-24T18:59:31Z
hostIP: 10.2.113.74
phase: Running
所以看起来我的 sidecar 需要监视主进程(如何?)并在检测到它单独在 pod 中时优雅地退出?如果这是正确的,那么是否有最好的 practices/patterns 来解决这个问题(sidecar 应该使用主容器的 return 代码退出吗?但它是如何得到的?)?
** 更新**
经过进一步的实验,我还发现了以下内容:
如果一个 pod 中有两个容器,那么直到 pod 中的所有容器 return 退出代码为 0 时才认为它成功。
此外,如果在 pod 规范上设置了 restartPolicy: OnFailure
,那么 pod 中以非零退出代码终止的任何容器都将在同一个 pod 中重新启动(这对于监控 sidecar 很有用)计算重试次数并在一定次数后删除作业(以解决 Kubernetes 作业中当前没有最大重试次数的问题)。
您可以使用 downward api 从 sidecar 中找出您自己的 podname,然后从 apiserver 检索您自己的 pod 以查找存在状态。让我知道这是怎么回事。
我们在这里使用 Kubernetes Job
s 进行大量批处理计算,我想为每个作业配备一个监控 sidecar,以根据作业的进度更新集中式跟踪系统。
唯一的问题是,我无法弄清楚作业中多个容器的语义是什么(或应该是什么)。
我还是尝试了一下(使用 alpine
sidecar 每 1 秒打印 "hello"),在我的主要任务完成后,Job
被认为是 Successful
和 Kubernetes 1.2.0 中的 kubectl get pods
显示:
NAME READY STATUS RESTARTS AGE
job-69541b2b2c0189ba82529830fe6064bd-ddt2b 1/2 Completed 0 4m
job-c53e78aee371403fe5d479ef69485a3d-4qtli 1/2 Completed 0 4m
job-df9a48b2fc89c75d50b298a43ca2c8d3-9r0te 1/2 Completed 0 4m
job-e98fb7df5e78fc3ccd5add85f8825471-eghtw 1/2 Completed 0 4m
如果我描述其中之一 pods
State: Terminated
Reason: Completed
Exit Code: 0
Started: Thu, 24 Mar 2016 11:59:19 -0700
Finished: Thu, 24 Mar 2016 11:59:21 -0700
然后 GET
ing 作业的 yaml 显示每个容器的信息:
status:
conditions:
- lastProbeTime: null
lastTransitionTime: 2016-03-24T18:59:29Z
message: 'containers with unready status: [pod-template]'
reason: ContainersNotReady
status: "False"
type: Ready
containerStatuses:
- containerID: docker://333709ca66462b0e41f42f297fa36261aa81fc099741e425b7192fa7ef733937
image: luigi-reduce:0.2
imageID: docker://sha256:5a5e15390ef8e89a450dac7f85a9821fb86a33b1b7daeab9f116be252424db70
lastState: {}
name: pod-template
ready: false
restartCount: 0
state:
terminated:
containerID: docker://333709ca66462b0e41f42f297fa36261aa81fc099741e425b7192fa7ef733937
exitCode: 0
finishedAt: 2016-03-24T18:59:30Z
reason: Completed
startedAt: 2016-03-24T18:59:29Z
- containerID: docker://3d2b51436e435e0b887af92c420d175fafbeb8441753e378eb77d009a38b7e1e
image: alpine
imageID: docker://sha256:70c557e50ed630deed07cbb0dc4d28aa0f2a485cf7af124cc48f06bce83f784b
lastState: {}
name: sidecar
ready: true
restartCount: 0
state:
running:
startedAt: 2016-03-24T18:59:31Z
hostIP: 10.2.113.74
phase: Running
所以看起来我的 sidecar 需要监视主进程(如何?)并在检测到它单独在 pod 中时优雅地退出?如果这是正确的,那么是否有最好的 practices/patterns 来解决这个问题(sidecar 应该使用主容器的 return 代码退出吗?但它是如何得到的?)?
** 更新** 经过进一步的实验,我还发现了以下内容: 如果一个 pod 中有两个容器,那么直到 pod 中的所有容器 return 退出代码为 0 时才认为它成功。
此外,如果在 pod 规范上设置了 restartPolicy: OnFailure
,那么 pod 中以非零退出代码终止的任何容器都将在同一个 pod 中重新启动(这对于监控 sidecar 很有用)计算重试次数并在一定次数后删除作业(以解决 Kubernetes 作业中当前没有最大重试次数的问题)。
您可以使用 downward api 从 sidecar 中找出您自己的 podname,然后从 apiserver 检索您自己的 pod 以查找存在状态。让我知道这是怎么回事。