Statefulset和无头服务如何运作-K8s

时间:2018-06-16 19:33:35

标签: redis kubernetes statefulset kubernetes-service

我理解

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

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

我对" Statefull vs Stateless"应用程序/部件

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

  2. DBCache(Redis)是Statefull应用程序/组件,因为它必须维护数据

  3. 我的问题。

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

    2. Network - Redis(例如)应该部署为StatefulSet,这样即使重新启动pod,我们也可以每次获得唯一的"网络ID" / Name。例如; Redis-0Redis-1位于StatefulSet,我可以将Redis-0定义为主,因此主name永远不会更改。现在我为什么要考虑Headless Service个应用StatefulSet?我可以直接访问/连接POD本身,对吗? Headless Service的用途是什么?

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

    4. 为什么/何时应该关注StatefulSetHeadless Serivice

1 个答案:

答案 0 :(得分:5)

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

  

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

如果所有pod都在所有副本中使用相同的持久卷声明(并且配置器允许),则此操作成立。如果您尝试根据部署增加副本数量,则所有pod都将使用完全相同的PVC。另一方面,api documentation中定义的StatefulSet具有volumeClaimTemplates,允许每个副本拥有自己生成的PVC,从而为副本集中的每个pod保护单独配置的PV。

  

现在我为什么要考虑StatefulSet应用程序的无头服务?

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

  

为什么那些(或其他)部署为StatefulSet

很重要

据我了解,您列出的非常操作员是使用部署本身部署的。但它们处理StatefulSets,所以让我们考虑使用ElasticSearch。如果它没有被部署为StatefulSet,你最终会得到两个以相同PV为目标的pod(如果配置者允许的话),这会使事情变得非常糟糕。使用StatefulSet,每个pod都会获得其自己的持久卷声明(来自模板),从而将持久卷与同一StatefulSet中的其他ElasticSearch pod分开。这只是冰山一角,因为ElasticSearch在设置/处理方面更加复杂,运营商正在为此提供帮助。

  

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

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

  • 无头服务,您应该在任何需要自动发现服务下所有pod的情况下使用,而不是在您获得ClusterIP的常规服务中。如上所述example的例子,这里是服务(使用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