0

假设我想部署一个包含连续运行/阻塞程序的 skaffold 吊舱。例如,以入门示例并更改main.go为:

package main

import (
    "fmt"
)

func main() {
    fmt.Println("Hello world!")
}

如果我skaffold dev使用上面修改过的示例运行并且只是等待而不对代码进行任何更改,则 pod 将不断重新启动,循环通过 statuses Completed-> CrashLoopBackOff-> Completed,每次重新启动都会再次运行 pod 中的程序。如何让 pod 运行程序一次,而仅在更改代码时重新运行/重新启动 pod?

这是 skaffold v1.6.0-docs, ubuntu 18, microk8s 1.16/stable, 有 set skaffold config set default-repo localhost:32000.

4

1 回答 1

2

首先,我想强调的是Skaffold没有什么特别的。它与 kubernetes 的本质有关,kubernetesPod并不是要运行到完成,而是继续运行(至少在其默认设置下)。

您可以通过在几个不同的变体中运行Pod示例中的 a来轻松验证它:

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
spec:
  containers:
  - name: myapp-container
    image: busybox
    command: ['sh', '-c', 'echo Hello Kubernetes! && sleep 3600']

尝试将睡眠时间减少到更短的值,您会发现它也在CompletedCrashLoopBackOff状态之间不断变化。当您删除使容器保持启动和运行的命令时,也会发生这种情况。

如果你运行:

kubectl get pod myapp-pod -o yaml

您可能会注意到规范中有restartPolicy定义Pod,如果您没有明确地将其设置为不同的值,则默认情况下它设置为Always. 在这里,您就有了Completed Pods不断重启的原因。

将其设置为Never应该会给您想要达到的结果。

spec:
  restartPolicy: Never
  containers:
  - name: myapp-container
    image: busybox
    ...

但是请记住,您通常不会使用 barePodskubernetes中运行您的工作负载。您宁愿使用诸如Deployment管理它们的控制器。只要Deployment用于确保某些集合Pods已启动并运行,为了运行某些内容,您在kubernetes中有另一个名为Job的控制器。

于 2020-03-30T23:33:21.460 回答