我理解
StatefulSet
- 管理/维护稳定的主机名,网络ID和持久存储。 HeadlessService
- 为有状态应用程序定义无头服务所需的稳定网络ID FROM K8s Docs - >有时您不需要或不需要负载平衡和单个服务 IP。在这种情况下,您可以通过指定来创建“无头”服务 "无"对于集群IP(.spec.clusterIP)。
我对" Statefull vs Stateless"应用程序/部件
UI
属于无状态应用程序/组件,因为它不会维护任何数据。但它来自数据库并显示
DB
,Cache
(Redis)是Statefull应用程序/组件,因为它必须维护数据
我的问题。
Persistence storage in Apps
- 我为什么要考虑将postgress(例如)部署为StatefulSet
?我可以在PV
中定义PVC
和Deployement
来将数据存储在PV中。即使pod重新启动,它也会获得PV,因此不会丢失数据。
Network
- Redis(例如)应该部署为StatefulSet
,这样即使重新启动pod,我们也可以每次获得唯一的"网络ID" / Name。例如; Redis-0
,Redis-1
位于StatefulSet
,我可以将Redis-0
定义为主,因此主name
永远不会更改。现在我为什么要考虑Headless Service
个应用StatefulSet
?我可以直接访问/连接POD本身,对吗? Headless Service
的用途是什么?
我听说过Operators
,这是管理StatefulSet
个应用的最佳方式。我在下面找到了一些例子。为什么那些(或其他一些)对于StatefulSet
部署很重要。例如,Prometheus
或ElasticSearch
;我可以定义PVs
和PVC
来存储数据而不会丢失。
为什么/何时应该关注StatefulSet
和Headless Serivice
?
答案 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