【问题标题】:How to create ordered Kubernetes deployment with non-headless service?如何使用非无头服务创建有序 Kubernetes 部署?
【发布时间】:2017-08-08 03:19:42
【问题描述】:

我需要在 pod3 之前创建 pod1 和 pod2。这意味着我需要订单。我还希望将 pod3 暴露在集群外部(外部)的 80 端口。起初我想我想在 StatefulSet 中组织这些创建。

但是,Stateful Sets 似乎需要 Headless Service。

StatefulSets 目前需要一个 Headless Service 来负责 用于 Pod 的网络身份。您负责创建 此服务。

这意味着

有时您不需要或不需要负载平衡和单个服务 IP。在这种情况下,您可以通过为集群 IP (spec.clusterIP) 指定“无”来创建“无头”服务。

我需要将 pod3(通过服务)暴露在集群之外,而无头服务不允许我这样做。在 Kubernetes 中执行此操作的正确方法是什么?

【问题讨论】:

  • 为什么在 pod3 之前需要 pod1 / pod2?如果 pod1/pod2 死了会发生什么?它们也是同一个应用程序(例如数据库集群分片吗?),如果不是 statefulset 则不是合适的资源。
  • @ant31 一个例子是我的 Web 客户端将连接到数据库或 api-server,因此我需要在启动我的 Web 客户端 pod 之前确保这些服务器已启动。我意识到替代方案是:首先手动启动 pod1/pod2 容器,验证 pod 是否正在运行,然后手动启动 pod3。另一种方法是编写一个脚本来检查部署状态,一旦我看到活动状态,就创建 pod3 部署。我猜想有状态集的一种方式是它们是包装器/容器,用于将服务容器组合在一起?
  • 像这样的简单用例,db在api-server之前,我建议你不要担心。 api-server 将回退并尝试直到成功(当数据库准备好时)。如果你真的想要一个依赖,看看 init_containers。

标签: kubernetes


【解决方案1】:

仅供参考,无头service 可以与其他类型的services 共存,例如loadBalancer。只需使用不同的名称和相同的selector 创建一个额外的service

更惯用的方法是更改​​您的 pod3 应用程序以处理数据库和 API 服务器的中断。 (应用程序不应该因为数据库或其他暂时无法访问而崩溃或变得无法使用。)我意识到这在某些应用程序中并不那么容易,(eh-hem,Ruby on Rails,eh-hem,)在这些情况下你可以编写pod3 container 的入口点(EG bash 脚本),该入口点简单地循环直到它可以到达其他两个服务,然后使用 exec 替换进程并初始化 pod3 应用程序。我已经实现了这一点,并且效果很好。这是记忆中的一个简化示例:

#!/bin/bash

while ! $(mysqladmin ping); do
  sleep 2
done

exec node app.js
# Or exec whatever arguments were passed to the container init.
# exec $@

无论您可以改进您的应用程序还是必须使用自定义入口点,都可以将用于检查 pod2 和 pod1 的可访问性的相同代码添加为 pod3 container 上的 k8s readinessProbe。 - 这将确保 pod3 被删除/不作为endpoint 添加到您的service,直到readinessProbe 通过。显然,这仅在您的应用在访问其依赖项之前等待接收请求时才有帮助。

注意:如果您要将 pod 抽象换成 container 抽象,那么所有这些都成立,即3 个containers 合为一个pod

statefulSets 创建相同pod 定义的近似副本,因此这不是您想要的抽象。相反,我会为您的 DB 服务使用不同的 statefulSet(以确保它在其他地方启动之前关闭)和 2 个不同的 deployments 用于您的 API 服务器和应用程序,并以这样的方式配置它们如上所述,顺序无关紧要。

【讨论】:

猜你喜欢
  • 2020-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-08
  • 2021-03-20
  • 1970-01-01
  • 2022-01-23
相关资源
最近更新 更多