6

我明白

  • StatefulSet- 管理/维护稳定的主机名、网络 ID 和持久存储。
  • HeadlessService- 稳定的网络 ID,您需要为有状态应用程序定义无头服务

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

我对“有状态与无状态”应用程序/组件的看法

  1. UI属于无状态应用程序/组件,因为它不维护任何数据。但它来自数据库并显示

  2. DB, Cache(Redis) 是有状态的应用程序/组件,因为它必须维护数据

我的问题。

  1. Persistence storage in Apps- 为什么我应该考虑将postgress(例如)部署为StatefulSet?我可以定义PVs 和PVCinDeployement来将数据存储在 PV 中。即使 Pod 重新启动,它也会获得 PV,因此不会丢失数据。

  2. Network- Redis(例如)应该部署为StatefulSet,这样我们每次都可以获得唯一的“网络 ID”/名称,即使在重新启动 pod 后也是如此。例如; Redis-0Redis-1StatefulSet,我可以定义Redis-0为大师,所以大师name永远不会改变。现在我为什么要考虑Headless Service应用StatefulSet程序?我可以直接访问/连接 POD 本身,对吗?有什么用Headless Service

  3. 我听说过Operators,管理应用程序的最佳方式StatefulSet。我在下面找到了一些例子。为什么这些(或其他)对于部署为StatefulSet. 例如,PrometheusElasticSearch;我可以定义PVsPVC存储数据而不会丢失。

我为什么/什么时候应该关心StatefulSetand Headless Serivice

4

1 回答 1

14

在尝试回答您的一些问题之前,我必须添加免责声明:给猫剥皮有不同的方法。由于我们在这里讨论 StatefulSet,请注意并非所有方法都最适合所有有状态应用程序。如果您需要具有单个 PV 的单个数据库 pod,您可以采用一种方法,如果您的 api pod 需要一些共享的和一些分离的 PV,那么另一种方法等等。

应用程序中的持久性存储 - 为什么我应该考虑将 postgress(例如)部署为 StatefulSet?我可以在 Deployement 中定义 PV 和 PVC 以将数据存储在 PV 中。

如果您的所有 pod 都在所有副本中使用相同的持久卷声明(并且配置器允许这样做),则这适用。如果您尝试基于 Deployment 增加副本数量,您的所有 pod 都将使用相同的 PVC。另一方面,API 文档中定义的 StatefulSetvolumeClaimTemplates允许每个副本拥有自己生成的 PVC,从而保护副本集中每个 pod 单独配置的 PV。

现在我为什么要为 StatefulSet 应用考虑 Headless Service?

因为容易发现。同样,您不需要知道 Headless Service 中有多少副本,检查服务 DNS 您将获得所有副本(警告 - 在那一刻启动并运行)。您可以手动执行此操作,但在这种情况下,您依赖于不同的计算/保留副本上的选项卡的机制(例如,副本是自我注册到主控的)。这是使用 nslookup 发现 pod的一个很好的例子,它可以解释为什么无头是一个好主意。

为什么这些(或其他)对于部署为 StatefulSet 很重要

据我了解,您列出的非常运营商都是使用部署本身部署的。他们虽然处理 StatefulSet,所以让我们以 ElasticSearch 为例。如果它没有被部署为 StatefulSet,你最终会得到两个针对相同 PV 的 pod(如果供应商允许的话),这会严重搞砸事情。使用 StatefulSet,每个 pod 都会获得自己的持久卷声明(来自模板),从而将持久卷与同一 StatefulSet 中的其他 ElasticSearch pod 分开。这只是冰山一角,因为 ElasticSearch 的设置/处理更加复杂,运营商正在帮助解决这个问题。

为什么/何时应该关心 StatefulSet 和 Headless Service?

  • 在复制的 pod 需要彼此分离 PV(从 PVC 模板创建并自动配置)的任何情况下,您都应该使用有状态集。

  • 如果您想自动发现服务下的所有 pod,而不是获取 ClusterIP 的常规服务,则应该使用无头服务。作为上述示例的说明,这里是服务(使用 ClusterIP)和无头服务(没有 ClusterIP)的 DNS 条目之间的区别:

    • 标准服务 - 您将获得 clusterIP 值:

      kubectl exec zookeeper-0 -- nslookup zookeeper
      Server:        10.0.0.10
      Address:    10.0.0.10#53
      
      Name:    zookeeper.default.svc.cluster.local
      Address: 10.0.0.213
      
    • 无头服务 - 您将获得每个 Pod 的 IP:

      kubectl exec zookeeper-0 -- nslookup zookeeper
      Server:        10.0.0.10
      Address:    10.0.0.10#53
      
      Name:    zookeeper.default.svc.cluster.local
      Address: 172.17.0.6
      Name:    zookeeper.default.svc.cluster.local
      Address: 172.17.0.7
      Name:    zookeeper.default.svc.cluster.local
      Address: 172.17.0.8
      
于 2018-06-16T22:30:27.637 回答