首页 > 解决方案 > Kubernetes pod 可以动态更改自己的标签吗?

问题描述

我正在尝试使用repmgr在主备用模式下设置一个 postgresql 集群,并且我正在考虑如何正确地将流量重定向到“主”pod。

我的直觉是使用一个标签来“突出显示”主 pod,并依靠服务对象的标签选择器将集群 IP“绑定”到它。但这导致了一个问题:如何在故障转移后将标签从旧的主 pod“移动”到新的?

有没有办法让我在我的 pod 定义 yaml 中注册一个自定义脚本来定期检查 pod 的角色并根据结果更改 pod 标签?

大佬们知道这个方法可行吗?或者也许已经有一个尖锐的解决方案可以处理我的情况?

标签: postgresqlkubernetes

解决方案


  • 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。请参考以下链接以获得一些想法


推荐阅读