通过kubedns访问Pod,而不公开提供服务

时间:2019-05-07 10:16:03

标签: kubernetes dns kubernetes-pod kube-dns

我试图在不公开服务的情况下测试舱间通信。 我读过一个豆荚在kubedns中确实有FQDN。 kubernetes doc

其默认值应为(A记录)
metadata_name.namespace.svc.cluster.local

hostname.subdomain.namespace.svc.cluster.local

但是我尝试了curl和nslookup。全部失败。服务很健康,我可以使用pod IP(172.17.0.5)卷曲它

  

卷曲:(6)无法解析主机
  nslookup:无法解析'(null)':名称无法解析

我想念什么?

2 个答案:

答案 0 :(得分:2)

  

如果与pod相同的名称空间中存在无头服务   并使用与子域相同的名称,即群集的KubeDNS服务器   还会返回Pod的标准主机名的A记录。对于   例如,假设Pod的主机名设置为“ busybox-1”,并且   子域设置为“默认子域”,并且一个无头服务名为   在同一命名空间中的“默认子域”,窗格将看到其自己的   FQDN为“ busybox-1.default-subdomain.my-namespace.svc.cluster.local”。

因此,在您的情况下,您需要为pod定义子域,并使用指向Pod的相同名称创建headless service

答案 1 :(得分:1)

我建议为此添加一种类型为ClusterIP的服务:https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types

kind: Service
apiVersion: v1
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  type: ClusterIP

它不会将Pod暴露在群集之外。请注意,这是默认服务类型,您可以省略指定。

然后像这样查询服务:

curl http://my-service.namespace.svc.cluster.local

由于以下两个原因,这种方法比直接使用pod DNS更好:

  • 您不需要知道确切的广告连播名称(例如name-id

  • 在这种情况下,您可以在服务后面运行多个Pod,它将平衡请求的负载。或者只运行一个,它就可以完全满足您的要求。