【问题标题】:How to remove pod from service without deleting it如何从服务中删除 pod 而不删除它
【发布时间】:2021-05-12 19:37:53
【问题描述】:

我正在寻找一种从部署/复制中删除 pod 而不删除它的选项。我找到了一个很好的解决方案 using selector and labels here,但在我的情况下这是不可能的,因为我不是 pod/服务创建者,所以我不能强制创建选择器。我的应用程序只是操纵现有服务的 pod。

非常感谢您的帮助

【问题讨论】:

  • 您可以编写一个 API 扩展来执行此操作,或者更快:按照您找到的示例进行操作。

标签: kubernetes


【解决方案1】:

您可以在 pod 上使用就绪探针。然后找到你自己的方法让那个探测失败。一旦服务检测到 Pod 尚未准备好,它就会从服务将连接转发到的 Pod 集中删除。这不会杀死 pod,也不会导致它重新启动(活性探针会这样做)。它也不会断开当前客户端。如果您的计划是最终重新启动 pod,您可能希望等待那些连接的客户端耗尽。

这样做的一个想法是:在特定 pod 的 ip 上使用 jmx 或 rest 调用,并使其实现告诉应用程序返回未准备好进行就绪实现。同样的技巧可以将其切换回就绪状态,或者延迟启动时的就绪状态,直到您手动触发该 pod(例如,如果您让 pod 进行一些昂贵的启动,例如数据库扫描/更新)。

【讨论】:

    【解决方案2】:

    AFAIK 服务应该有一个选择器(例如,一个标签),否则,服务如何知道哪些 pod 提供了所需的服务?即使您可能无法更改服务本身的选择机制,您也可以尝试更改 pod 中的标签。如果您可以操作 pod,则可以删除其标签,从而使其无法被服务选择。

    【讨论】:

      【解决方案3】:

      与哈维尔所说的差不多,但只是更详细一些。

      首先找到你的pod前面的service,找到selector(kubectl describe svc):

      选择器:
      组件=我的应用程序

      选择器将与一些标签相关联。标签与每个 pod 规范中的标签匹配。

      找到您要停止服务的 pod,并通过删除与服务空间中的选择器关联的标签来编辑它的 pod 规范:

      Kubectl 编辑 pod

      标签:
      环境:我的环境
      component: my-app # 删除或注释掉

      部署将启动一个新的 pod,但您刚刚编辑的 pod 将不再有流量路由到它。您可以使用 kubectl get endpoints 进行验证,以确保 podIP 不在服务规范中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-12-11
        • 1970-01-01
        • 2013-10-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多