有状态的Pod主机名无法解析

时间:2019-11-12 08:59:33

标签: kubernetes google-kubernetes-engine

我有许多有状态集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主机名注册应用程序时,分片可以相互访问。

只是为了澄清我们是否能够解决此问题,我们还需要在外部公开这些吊舱。我认为我可以使用它,并希望它可以工作: How to set hostname for kubernetes pod in statefulset

1 个答案:

答案 0 :(得分:0)

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

您可以更改pod的dnsPolicy来设置custom DNS settings,其中可以包含每个有状态set 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标准,则可能是一种解决方法。