Docker 当处于未准备就绪状态时,保持Kubernetes吊舱处于工作状态

Docker 当处于未准备就绪状态时,保持Kubernetes吊舱处于工作状态,docker,kubernetes,openshift,Docker,Kubernetes,Openshift,我正在从事一个项目,目前正在迁移一个遗留应用程序,以实现云兼容。我们正在使用Kubernetes、Openshift和Docker来实现这一点。应用程序有一种特殊类型的“后端pod”(我们称之为BEP),其职责是处理传入的事务。在这个pod中,我们有几个相互依赖的容器,但只有一个容器实际执行“真正的处理”(称为BEC)。这个遗留应用程序每秒处理数千个事务,并且需要在云中继续这样做 为了达到这个规模,我们考虑在pod中复制BEC,而不是复制BEP(从而也复制了所有其他不必要的容器)。我们可能需要这

我正在从事一个项目,目前正在迁移一个遗留应用程序,以实现云兼容。我们正在使用Kubernetes、Openshift和Docker来实现这一点。应用程序有一种特殊类型的“后端pod”(我们称之为BEP),其职责是处理传入的事务。在这个pod中,我们有几个相互依赖的容器,但只有一个容器实际执行“真正的处理”(称为BEC)。这个遗留应用程序每秒处理数千个事务,并且需要在云中继续这样做

为了达到这个规模,我们考虑在pod中复制BEC,而不是复制BEP(从而也复制了所有其他不必要的容器)。我们可能需要这个BEC的X个副本,而我们根本不需要扩展它相互依赖的容器。因此,缩放BEP的X个副本是无用的

然而,这种解决方案带来了一个问题。一旦一个BEC关闭,整个pod将被kubernetes标记为“未准备就绪”(即使有100个其他BEC已启动并准备好处理),在此基础上移除pod端点,从而切断整个pod的流量

我想这是为pod定义某种“最低运行要求”的经典示例

因此,我有两个问题:

  • 是否有一种方法可以在所有容器均未处于“就绪”状态时将吊舱标记为仍在运行?也就是说,通过在处于“准备就绪”状态的#容器上定义一个较低的阈值来实现这一最低运行要求,以便将吊舱视为正常运行
  • 是否有一种方法可以将pod提供的服务标记为即使pod未处于就绪状态也仍发送流量?我见过一个名为:publishNotReadyAddresss()的属性,但我不确定这是否符合我们的要求
如果这两个问题的答案都是否定的:在不建议对这个遗留应用程序进行重大架构重构的情况下,您对这个问题有什么想法/方法可以采取吗?我们不能将相互依赖的容器从BEC中分离出来,它们需要在同一个pod中运行…不幸的是

提前感谢您的帮助/建议

/亚历克斯

是否有一种方法可以在所有容器均未处于“就绪”状态时将吊舱标记为仍在运行?也就是说,通过在处于“准备就绪”状态的#容器上定义一个较低的阈值来实现这一最低运行要求,以便将吊舱视为正常运行

不,这不可能

  • 是否有一种方法可以将pod提供的服务标记为即使pod未处于就绪状态也仍发送流量?我见过一个名为:publishNotReadyAddresss()的属性,但我不确定这是否符合我们的要求
您可以使用:


但是社区已经在解决这个问题/bug,您可以关注和

为什么其他容器需要在同一个pod中运行?很抱歉回答得太晚。其他容器是遗留中间件组件,它们不能与BEP解耦。但是,您可以在同一个pod中添加更多BEC,而无需扩展这些中间件容器。这并不能解释为什么。它们是否需要共享内存、UNIX套接字或其他本地IPC机制进行通信?他们是否需要共享本地文件系统以实现数据共享?问题更多的是与启动顺序有关还是与确保其他实例同时运行有关?如果你能理解其中的原因,也许可以建议你使用其他的抽象概念。例如,对于最后一个问题,StatefulSet可能是合适的。原因:因为这个遗留中间件框架本机内置了本地网络通信。这意味着您不能将框架拆分为一个pod,将后端拆分为另一个pod,并指定一个IP,以便它们可以在它们之间通信。他们都需要在同一个舱里。该框架还可以用作状态管理系统(实际上类似于kubernetes的遗留版本),为每个后端定义一个id,并需要知道它在整个生命周期中的状态。
metadata:
  name: name
  labels:
    app: app
  annotations:
    service.alpha.kubernetes.io/tolerate-unready-endpoints: "true"