我想知道如何以特定顺序启动部署。我知道initContainers
,但这对我不起作用。我有一个巨大的平台,具有大约20个部署和5个有状态集,它们每个都有自己的服务,环境变量,卷,水平自动缩放器等。因此,不可能(或我不知道如何)在另一个环境中定义它们yaml部署为initContainers
。
是否还有其他选择可以按特定顺序启动部署?
答案 0 :(得分:1)
在k8s中没有“ depends_on-like”选项,我认为它不仅仅因为在云原生(=微服务)环境中应用程序应该是无状态的而实现。无状态意味着任何应用程序都不应该知道另一个应用程序的状态:每个应用程序都应该能够在任何时候启动,杀死,恢复而不影响其他应用程序,当然平台服务质量可能会下降! / p>
如果您有这种约束(如果部署消息代理,并且每个使用者必须等待它启动并运行才能建立连接,那是合理的),则必须以“无状态”方式进行管理:实例,您可以阻止启动过程,直到未建立代理连接,然后进行定期重试。使用kubernetes healthcecks,您甚至可以在该时间段内将服务声明为“未就绪”,或者如果多次重试失败,则可以声明为“不健康”
您可以在其他情况下转换此模式,尝试举例说明您要实现的目标
答案 1 :(得分:1)
可以命令在一个Pod中或属于同一StatefulSet的Pod中启动initContainers。但是,这些解决方案不适用于您的情况。
这是因为订购初始化不是解决问题的标准方法。在微服务架构中,更具体地说,在Kubernetes中,您将编写容器,以便它们尝试调用它们所依赖的服务(无论它们是否启动),如果它们不可用,则会使容器崩溃。之所以可行,是因为Kubernetes提供了一个self-healing mechanism,如果它们失败,它会自动重新启动容器。这样,您的容器将尝试连接到它们所依赖的服务,如果后者不可用,则容器将崩溃并稍后使用指数退避重试。
通过消除服务之间不必要的依赖关系,可以简化应用程序的部署并减少不同服务之间的耦合。
答案 2 :(得分:1)
正如许多其他答案所概述的那样,如果pod /服务不可用,则微服务架构中的应用不应中断。
尽管如此,Kubernetes应该足够聪明,可以自动尝试从该故障中恢复并重新启动Pod。应当重复此操作,直到满足应用程序的依赖关系为止。
Kubernetes本质上不是发布管理器,而是一个平台。如果您需要按顺序或按特定顺序部署Pod或服务,则可能需要使用特定的部署/设计模式(例如伞形图)来查看诸如Helm之类的实际发布管理器。 (StackOverflow example)。这可能包括一些额外的工作,但可能正是您想要的。
我真的希望至少能对您有所帮助。 :)
答案 3 :(得分:1)
只需并行启动它们,然后使其崩溃即可。延迟一段时间后,Kubernetes将重新启动失败的服务器。
假设您有服务A,它依赖于B,它依赖于C。A首先启动,并且作为其启动序列的一部分,尝试调用B。这失败了(因为B没有启动),并且Pod更改为错误状态。它可能重试一次或两次,然后进入CrashLoopBackOff状态。 Kubernetes会暂停几秒钟,然后重试。 B也会发生同样的事情。
最终,服务C(在堆栈的底部)将出现,此后的一段时间,自动重启将在B(紧随其上方)开始。这次B将成功启动。一段时间后,自动重启将启动A,这次将成功启动。
您需要了解的一件事是,如果Pod确实处于CrashLoopBackOff状态,则可能是由于代码错误或配置错误,或者仅是因为它依赖的服务尚未启动。您需要查看kubectl logs
(并确保您的服务代码写出了可用的诊断程序)以了解您所处的情况。
答案 4 :(得分:1)
我希望您的容器已定义liveness probe。在从属部署中使用它们创建一个initContainer,它将检查应用程序是否准备就绪。在initContainer验证另一个容器已准备就绪后,从属容器将启动。
您遇到的initContainer到底是什么问题?用于初始化依赖容器的initContainer示例链接是here。
另一种方法是编写外壳包装,然后创建初始部署。然后,使用直到直到初始部署状态准备就绪的直到循环。然后触发取决于初始部署的部署。
答案 5 :(得分:1)
要在部署之间创建依赖关系,必须有一定条件为true的序列。
例如,等待窗格“ busybox1”包含类型为“就绪”的状态条件。
kubectl wait --for=condition=Ready pod/busybox1
之后,您可以推出下一个部署。
进一步了解kubect-wait
这是@Michael Hausenblas job-dependacies的另一个示例,在工作对象之间具有依赖性
如果您想在工作人员完成后开始其他工作?在这里,您去了:
$ kubectl -n waitplayground \
wait --for=condition=complete --timeout=32s \
job/worker
job.batch/worker condition met
答案 6 :(得分:0)
正如其他答案中已经回答的那样,您无法在部署之外的POD之间定义初始化顺序。
每个部署(POD)都是一个独立的单元,应该具有自己的生命周期,如果一个POD依赖于要运行的其他POD进行初始化,则可能需要检查设计。
您应该在设计系统时始终考虑到它们总是会失败,如果服务B在服务A之前启动,那么POD的行为方式与它们以正确的顺序启动服务A的方式相同(这是对B的依赖) )之后失败。
您的应用程序应该处理这些,而不是将其卸载到协调器上。
。
万一您真的需要实现订购和更改应用程序的权限,可以使用init containers
向其他容器中的运行状况(就绪)端点发出请求,就像K8s所做的一样要检查您的容器是否准备就绪,当他们回答成功后,您就可以完成init执行并让POD运行其他容器。