我试图在不公开服务的情况下测试舱间通信。 我读过一个豆荚在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)':名称无法解析
我想念什么?
答案 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,它将平衡请求的负载。或者只运行一个,它就可以完全满足您的要求。