【发布时间】:2021-12-03 05:15:46
【问题描述】:
我有一个带有 StatefulSet 的 following Kubernetes YAML,我用它来部署一个带有 Patroni 的 PostgreSQL 集群。然而,这个问题与 Kubernetes 如何在 CoreDNS 中注册 Pod 名称有关。
根据稳定网络 ID 部分中的this documentation,如果我为我的 Pod 创建一个名为 spilodemo-svc 的无头服务,我可以使用短主机名 (podname.servicename) 访问它们:
spilodemo-0.spilodemo-svc
基本上,我的代码在 VirtualBox 和 Vagrant 上使用 kubeadm 部署的 K8s 集群上正常运行了很长时间。今天我想在 IBM Cloud 上部署它,但上面的主机名不起作用,奇怪的是,当我再次在 Vagrant/VirtualBox 上重复测试时,我无法再让它工作了,我不知道为什么。
现在 YAML 部署 Spilo,它是 Zalando 开发的一个开源项目,它是一个带有 Patroni 和 PostgreSQL 的 Docker 镜像。我的代码来自他们的example here。
基本上,他们创建了一个没有选择器的 ClusterIP 服务(而不是无头)。在这些情况下,Kubernetes 不会在其中创建 Endpoint。出于这个原因,我们在 YAML 中有一个与服务名称相同的 Endpoint(这似乎是 Kubernetes 期望的绑定)。
Spilo 的 Python 代码始终使用主节点的 IP 更新此 Endpoint。
StatefulSet 的字段 serviceName 等于服务的名称:
serviceName: spilodemo-svc
根据文档,这保证了 Kubernetes 在 CoreDNS 中为这个短主机名 (podname.servicename) 创建一个条目:
spilodemo-0.spilodemo-svc
它工作了很长时间,直到今天,同时没有发生任何事情。老实说,到目前为止,我还没有完全理解 DNS 名称 spilodemo-0.spilodemo-svc 是如何工作的,因为它使用 ClusterIP 服务而不是 Headless 服务。
另一个奇怪的事情是,Zalando 团队使用了另一个 Headless 服务,我称之为 spilodemo-config,根据他们代码中的注释,它应该避免 Kubernetes 删除端点,但这对我来说没有多大意义。
但是,今天我也尝试将服务转换为无头服务,删除spilodemo-config 但没有运气。 Kubernetes 只在 CoreDNS 中为服务创建入口:
spilodemo.spilons.svc.cluster.local
但不是每个 Pod 都有一个:
spilodemo-0.spilodemo-svc
spilodemo-1.spilodemo-svc
spilodemo-2.spilodemo-svc
谁能帮我弄清楚我的 YAML 文件发生了什么,以及如何让上面的三个短主机名在 CoreDNS 中工作?
PS 在 Stackoverflow 上,我发现了这些讨论:
【问题讨论】:
-
我从这个文件github.com/zalando/spilo/blob/master/kubernetes/…重新开始做了一些实验。如果我按原样使用它,那么它就可以工作,但是如果我将我的 StatefulSet 放在命名空间
中,那么域 . 就不再工作了。命名空间如何影响 StatefulSet 域注册以使短名称 . 不再起作用? -
你用的是什么k8s版本?
-
1.21 用于 kubectl 1.22 用于服务器
-
看起来您正在使用没有选择器的无头服务,这意味着端点不是自动创建的,要解决此问题,您可能希望手动端点与无头服务同名。
-
我会尽快发布我的问题的解决方案。它与 Patroni 的工作方式密切相关。
标签: kubernetes kubernetes-pod kubernetes-statefulset coredns patroni