我有许多有状态集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
答案 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-0
,web-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标准,则可能是一种解决方法。