我正在尝试使用Kubernetes,并已成功地将statefull应用程序(jenkins实例)部署到单个节点。它使用PVC来确保我可以持久化我的jenkins数据(作业、插件等)。
现在,我想尝试一下故障转移。
我的集群有2个数字海洋水滴。
目前,我的jenkins pod仅在一个节点上运行。当这种情况发生时,Jenkins就不能使用了。
我现在正在研究如何在某种意义上实现故障转移,即当jenkins pod在我的节点上关闭时,它将在另一个节点上启动。(因此,在此过程中短时间停机是可以的)。
当然,它必须使用相同的PVC,这样我的数据才能保持完好。
我相信,在阅读时,StatefulSet可以用来做这件事?
任何指针都是非常感谢的!
诚挚的问候
发布于 2019-09-25 05:05:54
Digital Ocean的Kubernetes服务仅支持PVC的ReadWriteOnce接入模式(参见here)。这意味着卷一次只能连接到一个节点。
我遇到了this blogpost,虽然它专注于Azure上的Jenkins,但也有同样的情况,只支持ReadWriteOnce。作者声明:
然而,对于我来说,
的缺点在于Azure Disk持久卷的访问模式是ReadWriteOnce。这意味着Azure磁盘一次只能连接到一个群集节点。在节点发生故障或更新的情况下,Azure磁盘可能需要1-5分钟才能分离并连接到下一个可用节点。
注意,Pod故障和节点故障是两回事。因为DO只支持ReadWriteOnce,所以在节点故障容错方面,尝试比现在更复杂的东西没有任何好处。因为它是ReadWriteOnce卷,所以需要从故障节点卸载卷并重新挂载到新节点,然后在新节点上调度一个新的Pod。Kubernetes将为您完成此操作,您无法对其进行优化。
对于Pod故障,您可以使用Deployment,因为您希望读取和写入相同的数据,您不希望将不同的PV连接到不同的副本。这样做的好处可能非常有限,因为您将在同一节点上运行Pod的多个副本,因此这取决于Jenkins进程如何扩展,以及它是否能够支持该类型的横向扩展模型,同时全部写入相同的卷(而不是简单地垂直扩展内存或CPU请求)。
如果你真的想在节点和/或Pod故障的情况下实现更高的可用性,并且你正在部署的Jenkins工作负载对本地卷有持久状态的严格要求,你将需要考虑一个替代的卷插件,比如NFS,或者移动到不同的云提供商,比如GKE。
发布于 2019-09-25 04:48:11
可以,您可以根据用例使用部署或StatefulSet。对于Jenkins来说,StatefulSet将是合适的。如果正在运行的pod变得不可用,StatefulSet控制器将看到它并产生一个新的pod。
发布于 2019-09-25 05:02:30
您所描述的是由控制器管理的Kubernetes for Pods的默认行为,例如部署。
您应该将任何应用程序部署为部署(或另一个控制器),即使它只包含一个Pod。您从未真正将Pod直接部署到Kubernetes。因此,在这种情况下,您无需执行任何特殊操作即可获得此行为。
当你的一个节点死了,Pod也死了。这是由部署控制器检测到的,它会创建一个新的Pod。这反过来由调度器检测,调度器将新的Pod分配给节点。由于其中一个节点已关闭,它会将Pod分配给另一个仍在运行的节点。Pod分配到该节点后,该节点的kubelet将在该节点上运行该Pod的容器。
https://stackoverflow.com/questions/58087890
复制相似问题