postgresql - Kubernetes pod 可以动态更改自己的标签吗?
问题描述
我正在尝试使用repmgr在主备用模式下设置一个 postgresql 集群,并且我正在考虑如何正确地将流量重定向到“主”pod。
我的直觉是使用一个标签来“突出显示”主 pod,并依靠服务对象的标签选择器将集群 IP“绑定”到它。但这导致了一个问题:如何在故障转移后将标签从旧的主 pod“移动”到新的?
有没有办法让我在我的 pod 定义 yaml 中注册一个自定义脚本来定期检查 pod 的角色并根据结果更改 pod 标签?
大佬们知道这个方法可行吗?或者也许已经有一个尖锐的解决方案可以处理我的情况?
解决方案
StatefulSets
就是答案!
我引用了官方Kubernetes Docs
与 Deployment 类似,StatefulSet 管理基于相同容器规范的 Pod。与 Deployment 不同,StatefulSet 为其每个 Pod 维护一个粘性标识。这些 pod 是根据相同的规范创建的,但不可互换:每个 pod 都有一个持久标识符,它在任何重新调度时都会维护该标识符。
甚至更多
StatefulSets 对于需要以下一项或多项的应用程序很有价值。
1. Stable, unique network identifiers. 2. Stable, persistent storage. 3. Ordered, graceful deployment and scaling. 4. Ordered, automated rolling updates.
我相信,第 1 点对你来说更重要(根据你的问题)。StatefullSets 也维护生成 pod 的顺序。前段时间我在 K8s 上进行 Redis Cluster 部署,我不记得正确或 repo,但他们使用容器中的一些脚本来确定 Redis Master。由于 StatefullSet 维护了生成的顺序,因此很容易使第一个生成的 pod 成为 master。再次,请参阅文档直到最后以及有关此概念的任何博客。
甚至更多
稳定的网络ID
StatefulSet 中的每个 Pod 都从 StatefulSet 的名称和 Pod 的序号派生其主机名。构造主机名的模式是 $(statefulset name)-$(ordinal)
由于稳定的 n/w ID,pod 的 DNS 名称永远不会改变
我建议将您的 postgress 集群部署为 StatefullSet。请参考以下链接以获得一些想法
推荐阅读
- mongodb - 空项目symfony + mongo:试图在索引页面加载接口CommandSubscriber
- c++ - P4VS 代码镜头集成显示每个功能的所有文件级更改
- python - 如何可视化使用networkx创建的邻接矩阵
- reactjs - 标记不适用于 google-map-react
- makefile - Makefile 变量的交互式输入
- gitlab - gitlab 中的自动发行说明
- r - 通过变量从r中的命名向量中提取单词
- python - 连接到 Django 数据库的内部服务器错误
- javascript - 如何在 Angular 8 中启动应用程序时首先加载数据服务
- r - 使用 geom_line 和 geom_point 更改图例符号“a”