Error handling 管理具有依赖关系的多个POD的健康和幸福感
在k8s工作流中,我们有几个相互依赖的POD(作为服务/部署),因此,如果一个POD进入Error handling 管理具有依赖关系的多个POD的健康和幸福感,error-handling,kubernetes,Error Handling,Kubernetes,在k8s工作流中,我们有几个相互依赖的POD(作为服务/部署),因此,如果一个POD进入CrashLoopBackOff状态,那么所有这些服务都需要重新部署 有没有一种程序化的方法来处理这个问题,而不必手动执行 当然,我们正在试图弄清楚为什么问题中的荚果正在崩溃。 < P>如果它们之间的关系如此紧密,我会考虑这些选择。 a) 如果pod暂时不可用,重新构建您的系统,使其具有更强的故障恢复能力和容忍能力 b) 将所有部件作为单独的容器放入一个吊舱中,使原子设计更加明确 如果这些不符合您的需要,您可
CrashLoopBackOff
状态,那么所有这些服务都需要重新部署
有没有一种程序化的方法来处理这个问题,而不必手动执行
当然,我们正在试图弄清楚为什么问题中的荚果正在崩溃。 < P>如果它们之间的关系如此紧密,我会考虑这些选择。 a) 如果pod暂时不可用,重新构建您的系统,使其具有更强的故障恢复能力和容忍能力 b) 将所有部件作为单独的容器放入一个吊舱中,使原子设计更加明确
如果这些不符合您的需要,您可以使用Kubernetes API创建一个程序,自动重新启动所有依赖部件的任务。有多种语言的客户端库,集成非常容易。下一步是定制资源定义(CRD),这样您就可以使用Kubernetes API的扩展来管理自己的系统。首先要做的是确保POD按正确的顺序启动。这可以使用如下的initContainers来完成:
spec:
initContainers:
- name: waitfor
image: jwilder/dockerize
args:
- -wait
- "http://config-srv/actuator/health"
- -wait
- "http://registry-srv/actuator/health"
- -wait
- "http://rabbitmq:15672"
- -timeout
- 600s
在这里,只有列表中的所有服务都响应HTTP探测,pod才会启动
接下来,您可能需要定义定期对相同服务执行curl的活动性探测
spec:
livenessProbe:
exec:
command:
- /bin/sh
- -c
- curl http://config-srv/actuator/health &&
curl http://registry-srv/actuator/health &&
curl http://rabbitmq:15672
现在,如果这些服务中的任何一个出现故障,您的pod将无法启动liveness probe,重新启动并等待服务重新联机
这只是一个例子。在您的情况下,支票当然可以不同。谢谢。我想到一个问题:如果我有一个具有多个副本的守护程序或部署,那么所有实例都必须关闭才能使liveness probe失败吗?我喜欢将多个容器添加到一个pod中的想法。我一直在研究在一个pod中部署多个容器的各种设计模式。我的用例要求有三个容器:两个容器需要是服务/部署(主机名需要用于在工作流中通信),第三个容器是启动使用部署的服务处理数据的流程的客户端。你认为侧车模式对客户有意义吗?如果是这样,我将如何在旋转侧车之前旋转我的两个容器作为
部署规范?如果没有,那么您有什么建议?如果部署新版本/重新启动应用程序,为什么需要重新启动所有内容?kubernetes服务对象提供了稳定的主机名和稳定的ip地址,因此您可以重新启动底层应用程序,而依赖的应用程序只需在发生故障后重新连接即可。我并不意味着需要重新启动kubelet。所述应用程序有两个相关服务,在发生故障时需要重新部署,以便它们能够彼此同步。需要重新启动客户端,以便重新连接到应用程序并在发生故障时继续处理。问题是如何自动重新启动失败的容器进程而不再次失败。我假设使用@vasily angapov概述的liveness探测器可以重新启动处于良好状态的所有容器,而无需重新部署所有POD。