【问题标题】:Skaffold with non-blocking program具有非阻塞程序的 Skaffold
【发布时间】:2020-03-29 14:52:38
【问题描述】:

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

package main

import (
    "fmt"
)

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

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

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

【问题讨论】:

    标签: kubernetes skaffold


    【解决方案1】:

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

    您可以通过在几个不同的变体中运行来自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 状态之间不断变化。当您删除使容器保持正常运行的命令时,也会发生这种情况。

    如果你运行:

    kubectl get pod myapp-pod -o yaml
    

    您可能注意到Pod 规范中定义了restartPolicy,如果您没有明确地将其设置为不同的值,则默认设置为Always。这就是你的CompletedPods不断重启的原因。

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

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

    但请记住,您通常不会使用裸 Podskubernetes 中运行工作负载。您宁愿使用诸如Deployment 之类的控制器来管理它们。只要使用Deployment 来确保Pods 的某些集合启动并运行,为了完成某件事,您在 kubernetes 中就有另一个控制器,名为 @ 987654322@.

    【讨论】:

    • 谢谢!我的实际用例是使用 skaffold 部署运行测试的 pod。切换 skaffold 以部署作业而不是 pod 对我有用,并且测试只会执行一次,而不是每次 pod 重新启动时,这是我最初的问题。是否有更好/更惯用的方式来部署 pod 运行测试?
    • 这取决于您执行这些测试的对象。如果这些是同一集群上的其他Pods,我认为使用Job 或简单的Pod 并将restartPolicy 设置为Never 是合适的解决方案。 Skaffold 管道还包括测试阶段,但它是为构建图像上的container-structure-tests 设计的,所以我想这不是您在用例中需要的那种测试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-10
    • 2014-03-23
    • 2019-01-24
    • 2011-03-03
    • 1970-01-01
    • 2016-07-06
    • 1970-01-01
    相关资源
    最近更新 更多