我有许多状态集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暴露在外部。我想为此我可以使用它,希望它能起作用:如何在statefulset中为kubernetes pod设置主机名
由于这与集群内的DNS解析直接相关,因此一种可能的方法是更改需要解析主机名的应用程序的pod/部署中的DNS策略。
您可以更改pod的dnsPolicy
来设置自定义DNS设置,其中可以包含每个有状态设置pod的记录。
dnsPolicy: "None"
dnsConfig:
nameservers:
- 1.2.3.4
options:
- name: ndots
value: "0"
这解决了集群中当前DNS记录中不存在记录的问题,并允许您通过删除DNS后缀来控制与pod关联的非限定域名(web-0
,web-1
)。
此外,更安全,因为更改仅应用于您的pod/部署,而不是整个集群,这使您在之后公开有状态pod时免受潜在麻烦。
最后,关于DNS配置,您可以使用指向pod的FQDN的ALIAS
记录来通过它们的原始名称保留网络身份。这避免了获取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标准,这可能是一种解决方法。