Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kubernetes 有状态Pod主机名不';无法解决_Kubernetes_Google Kubernetes Engine - Fatal编程技术网

Kubernetes 有状态Pod主机名不';无法解决

Kubernetes 有状态Pod主机名不';无法解决,kubernetes,google-kubernetes-engine,Kubernetes,Google Kubernetes Engine,我有很多StatefolSets豆荚,它们不是彼此的复制品。我的应用程序在pod的主机名上注册服务,其他服务尝试基于主机名访问服务。它可以与headless服务一起工作,但应用程序逻辑无法更改,因为它读取POD的主机名,不幸的是,我不得不使用它 我有以下情况: [test@shard1-0 ~]$ nslookup shard2 Server: 10.96.5.5 Address: 10.96.5.5#53 Name: shard2.default.svc.cluster.l

我有很多StatefolSets豆荚,它们不是彼此的复制品。我的应用程序在pod的主机名上注册服务,其他服务尝试基于主机名访问服务。它可以与headless服务一起工作,但应用程序逻辑无法更改,因为它读取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主机名注册时,碎片可以相互联系

为了澄清我们是否能够解决这个问题,我们还需要将这些吊舱暴露在外部。我认为我可以利用它,希望它能起作用:

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

您可以更改pod的
dnsPolicy
来设置,其中可以包括每个有状态集合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通过其原始名称保留网络标识。这避免了获取IP地址的操作成本,因为您将使用主机名(它们永远不会更改)

请注意,这种方法要求您设置并维护自己的DNS服务器(在上述定义中表示为
1.2.3.4


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

此解决方案看起来不错,因为自定义DNS提供了很多好处。然而,我不知道如何在DNS中为有状态集更改IP?在每一个新的有状态pod调度上更改IP需要做大量的工作。我不确定是否可以在statefulset上强制IP,以便维护网络标识。我在想,您可能会使用别名记录将请求“转发”到原始主机名,以避免每次获取IP地址。更新了我的答案以反映这一点。感谢您指出这一点。让我试试这个,如果我发现任何问题,我会更新你。你最终尝试过这个吗?你不能修改你的应用程序来调用podName.serviceName吗?ie shard2-0.shard2?我尝试了这个,似乎我的应用程序代码需要一些更改来强制执行hostname.svcname,因为默认情况下它读取hostname。
Host:   Type:   Points to:                                  TTL
web-0   ALIAS   web-0.web-svc.namespace.svc.cluster.local   1 Hour