- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我明白了
StatefulSet
- 管理/维护稳定的主机名、网络 ID 和持久存储。 HeadlessService
- 为有状态应用程序定义 headless 服务所需的稳定网络 IDFROM K8s Docs -> Sometimes you don’t need or want load-balancing and a single service IP. In this case, you can create “headless” services by specifying "None" for the cluster IP (.spec.clusterIP).
我对“有状态与无状态”应用/组件的看法
UI
属于无状态应用程序/组件,因为它不维护任何数据。但是它从数据库中获取并显示
DB
, Cache
(Redis) 是有状态的应用/组件,因为它要维护数据
我的问题。
应用程序中的持久性存储
- 为什么我应该考虑将 postgress(例如)部署为 StatefulSet
?我可以在 Deployement
中定义 PV
和 PVC
以将数据存储在 PV 中。即使 pod 重启,它也会获取它的 PV,因此不会丢失数据。
Network
- Redis(例如)应该部署为 StatefulSet
,这样即使在 pod 重启后我们也每次都能获得唯一的“网络 ID”/名称.例如; Redis-0
、Redis-1
在StatefulSet
中,我可以定义Redis-0
为master,所以master name
永远不会改变。现在为什么我应该为 StatefulSet
应用考虑 Headless Service
?我可以直接访问/连接 POD 本身,对吧? Headless Service
有什么用?
我听说过 Operators
,这是管理 StatefulSet
应用程序的最佳方式。我在下面找到了一些例子。为什么这些(或其他一些)部署为 StatefulSet
很重要。例如,Prometheus
或 ElasticSearch
;我可以定义 PVs
和 PVC
来存储数据而不丢失。
我为什么/什么时候应该关心 StatefulSet
和 Headless Service
?
最佳答案
在尝试回答您的一些问题之前,我必须添加免责声明:给猫剥皮的方法有很多种。由于我们在这里讨论 StatefulSets,请注意并非所有方法都最适合所有有状态应用程序。如果您需要具有单个 PV 的单个数据库 pod,您可以采用一种方法,如果您的 api pod 需要一些共享的和一些分离的 PV,然后是另一个等等。
Persistence storage in Apps - Why should I consider to deploy postgress (for example) as StatefulSet? I can define PVs and PVC in Deployement to store the data in PV.
如果您的所有 Pod 都在所有副本中使用相同的持久卷声明(并且供应商允许这样做),则这适用。如果您尝试根据 Deployment 增加副本数量,您的所有 Pod 将使用完全相同的 PVC。另一方面,在 api documentation 中定义的 StatefulSet具有 volumeClaimTemplates
,允许每个副本拥有自己生成的 PVC,确保为副本集中的每个 pod 单独提供的 PV。
Now why should I consider Headless Service for StatefulSet apps?
因为易于发现。同样,您不需要知道在 Headless Service 中有多少个副本,检查服务 DNS 您将获得所有副本(注意 - 在那个时刻启动并运行)。您可以手动执行此操作,但在这种情况下,您依赖于不同的副本计数/保持标签机制(例如,副本自行注册到主服务器)。这是一个很好的例子 pod discovery with nslookup这可以阐明为什么 headless 是一个好主意。
Why those(or some other) are important to deploy as StatefulSet
据我了解,您列出的很多 Operator 都是使用 Deployment 本身部署的。但是它们处理 StatefulSets,所以让我们以 ElasticSearch 为例。如果它没有作为 StatefulSet 部署,你最终会得到两个针对相同 PV 的 pod(如果供应商允许的话),这会严重搞砸事情。使用 StatefulSet,每个 pod 都有自己的持久卷声明(来自模板),因此将持久卷与同一 StatefulSet 中的其他 ElasticSearch pod 分开。这只是冰山一角,因为 ElasticSearch 的设置/处理更为复杂,而运营商正在帮助解决这一问题。
Why/When should I care about StatefulSet and Headless Serivice?
在复制的 pod 需要彼此具有单独的 PV(从 PVC 模板创建并自动配置)的任何情况下,您都应该使用有状态集。
在任何情况下,如果您想自动发现该服务下的所有 pod,您都应该使用 Headless Service,而不是获取 ClusterIP 的常规服务。作为上述说明 example这是服务(使用 ClusterIP)和 Headless 服务(不使用 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
Headless 服务 - 您将获得每个 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
关于redis - statefulset和headless service是如何工作的-K8s,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50891104/
这个问题在这里已经有了答案: Why don't Java's +=, -=, *=, /= compound assignment operators require casting? (11 个
我搜索了很多,但没有一个链接能帮助我解决这个问题。我得到了 ORA-21500: internal error code, arguments: [%s], [%s], [%s], [%s], [%s
我正在做 RegexOne 正则表达式教程,它有一个 question关于编写正则表达式以删除不必要的空格。 教程中提供的解决方案是 We can just skip all the starting
([\s\S]+|\s?) 中 |\s? 的目的或作用是什么?如果没有它,表达式会不会与 ([\s\S]+) 相同? 最佳答案 这不是完全相同的。 ([\s\S]+|\s?) 会匹配空字符串,而 ([
这个正则表达式有一组还是两组? 我正在尝试使用第二组访问 bookTitle 但出现错误: Pattern pattern = Pattern.compile("^\\s*(.*?)\\s+-\\s+
在 C 中给定一个字符串指针 s,下面的迭代会做什么?即它以什么方式遍历字符串? for (++s ; *s; ++s); 最佳答案 for (++s ; *s;++s) 表示 将指针 s 递增到字符
我正在用一个 node.js 应用程序解析一个大列表并有这段代码 sizeCode = dbfr.CN_DESC.split('\s+-\s*|\s*-\s+') 这似乎不起作用,因为它返回了 [ '
我正在编写一个简单的字符串连接程序。 该程序按照我发布的方式运行。但是,我首先使用以下代码编写它来查找字符串的结尾: while (*s++) ; 但是,这个方法并没有奏效。我传递给它的字符串
这个问题已经有答案了: What does (?和aramchand来自Mohandas Karamchand G 因此,在使用这些匹配来分割字符串后,您最终会得到 {"M", "K", "G"} 注
我正在尝试转换 Map到 List使用 lambda。 本质上,我想将键和值与 '=' 连接起来之间。这看起来微不足道,但我找不到如何去做。 例如 Map map = new HashMap<>();
我正在经历 K & R,并且在递增指针时遇到困难。练习 5.3(第 107 页)要求您使用指针编写一个 strcat 函数。 在伪代码中,该函数执行以下操作: 将 2 个字符串作为输入。 找到字符串
在下面的代码中,pS 和 s.pS 在最后一行是否保证相等?也就是说,在语句S s = S();中,是否可以确定不会构造一个临时的S? #include using namespace std; s
演示示例代码: public void ReverseString(char[] s) { for(int i = 0, j = s.Length-1; i < j; i++, j--){
我一直在寻找类似于 .NET examples 中的示例的 PowerShell 脚本.取一个 New-TimeSpan 并显示为 1 天 2 小时 3 分钟 4 秒。排除其零的地方,在需要的地方添加
def func(s): s = s + " is corrected" return s string_list = ["She", "He"] for s in string_li
我是 python 的新手。当我在互联网上搜索 lambda 时。我在 lambda_functions 中找到了这个声明. processFunc = collapse and (lambda s:
我最近开始学习正则表达式,并试图为上面的问题写一个正则表达式。如果限制只放在一个字母上(例如不超过 2 个“b”),这并不困难。 那么答案就是:a* c*(b|ε)a* c*(b|ε)a* c* 但是
当我运行 npm install 时出现以下错误,但我无法修复它。 我试过:npm install -g windows-build-tools 也没有修复这个错误 ERR! configure
有很多有趣的haskell网上可以找到片段。 This post可以在 this (awesome) Stack Overflow question 下找到. The author写道: discou
我知道以下三行代码旨在将字符串提取到$ value中并将其存储在$ header中。但是我不知道$value =~ s/^\s+//;和$value =~ s/\s+$//;之间有什么区别。 $val
我是一名优秀的程序员,十分优秀!