【问题标题】:Stateful Pod hostname doesn't resolve有状态 Pod 主机名无法解析
【发布时间】:2019-11-12 08:59:33
【问题描述】:

我有许多 statefulsets POD,它们不是彼此的副本。我的应用程序在 pod 的主机名上注册服务,其他服务尝试根据主机名访问服务。它适用于无头服务,但应用程序逻辑无法更改,因为它读取 POD 的主机名,不幸的是我必须使用它。

我有以下场景:

[test@shard1-0 ~]$ nslookup shard2
Server:     10.96.5.5
Address:    10.96.5.5#53

Name:   shard2.default.svc.cluster.local
Address: 10.244.0.50

[test@shard1-0 ~]$ nslookup shard2-0
Server:     10.96.5.5
Address:    10.96.5.5#53

** server can't find shard2-0: NXDOMAIN

[test@shard1-0 ~]$ 

有没有办法让分片可以使用 POD 名称的主机名进行解析?并且可以在应用程序基于 pod 主机名注册时相互访问。

为了澄清我们是否能够解决这个问题,我们还需要将这些 pod 暴露在外部。我认为为此我可以使用它,并希望它会起作用: How to set hostname for kubernetes pod in statefulset

【问题讨论】:

  • 你不能修改你的应用程序来调用podName.serviceName吗?即 shard2-0.shard2?
  • 我试过了,看来我的应用程序代码需要一些更改来强制执行 hostname.svcname,因为默认情况下它读取主机名。

标签: kubernetes google-kubernetes-engine


【解决方案1】:

由于这与集群内的 DNS 解析直接相关,因此一种可能的方法是更改​​需要解析主机名的应用程序的 pod/部署中的 DNS 策略。

您可以更改一个pod的dnsPolicy来设置您的custom DNS settings,其中可以包含每个有状态集pod的记录。

  dnsPolicy: "None"
  dnsConfig:
    nameservers:
      - 1.2.3.4        
    options:
      - name: ndots
        value: "0"

这解决了集群内当前 DNS 记录中不存在记录的问题,并允许您通过删除 DNS 后缀来控制与您的 pod 关联的不合格域名(web-0web-1)。

此外,由于更改仅应用于您的 pod/部署而不是整个集群,因此更安全,这使您在之后公开有状态的 pod 时避免潜在的麻烦。

最后,关于 DNS 配置,您可以使用 ALIAS records 指向 pod 的 FQDN,以通过其原始名称保留网络身份。这避免了获取 IP 地址的运营成本,因为您将使用主机名(它们永远不会更改)。

Host:   Type:   Points to:                                  TTL
web-0   ALIAS   web-0.web-svc.namespace.svc.cluster.local   1 Hour

请注意,这种方法需要您设置和维护自己的 DNS 服务器(在上面的定义中表示为 1.2.3.4)。

如果在您的情况下无法更改应用程序逻辑以在集群内使用 DNS 标准,这可能是一种解决方法。

【讨论】:

  • 这个解决方案看起来不错,因为自定义 DNS 有很多好处。但是,我不知道如何为有状态集更改 DNS 中的 IP?在每个有状态 Pod 的新调度上更改 IP 将是大量工作。我不确定是否可以在 statefulset 上强制执行 IP,以便维护网络标识。
  • 我在想,您可能会使用 ALIAS 记录将请求“转发”到原始主机名,以避免每次都获取 IP 地址。更新了我的答案以反映这一点。
  • 感谢您指出这一点。让我试试这个,如果我发现任何问题会更新你。
  • 你最后试过了吗?
猜你喜欢
  • 2020-02-13
  • 1970-01-01
  • 2020-03-15
  • 2023-03-05
  • 1970-01-01
  • 2017-03-26
  • 1970-01-01
  • 2013-11-05
  • 1970-01-01
相关资源
最近更新 更多