具有非阻塞程序的脚手架

Skaffold with non-blocking program

假设我想部署一个带有 skaffold 的 pod,它将 包含连续 running/blocking 程序。例如。取 getting started example 并将 main.go 更改为:

package main

import (
    "fmt"
)

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

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

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

首先我想强调的是 Skaffold 没有任何特定的内容。它与 kubernetes Pod 的本质有关,这并不意味着 运行 完成,而是保持 运行ning(至少使用其默认设置)。

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

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 状态之间不断变化。当您删除使容器保持启动并 运行ning.

的命令时,也会发生这种情况

如果你运行:

kubectl get pod myapp-pod -o yaml

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

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

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

但是请记住,您通常不会在 kubernetes 中使用裸 Pods 来 运行 处理您的工作负载。您宁愿使用诸如 Deployment 之类的控制器来管理它们。只要Deployment用来保证Pods的某组up和运行ning,for 运行ning something to completion 你在 kubernetes 中有另一个控制器,名为 Job.