在GKE上,库贝-dns在我的节点上运行,我可以看到docker容器。
我确实可以按名称访问服务,这对于负载平衡是完全合适的解决方案的所有这些应用程序都很好,但是如何使用DNS访问单个Pod呢?
我知道我可以在API中查找特定的pod,但是我需要自己更新host
文件,并继续查看pod列表。DNS应该为我这样做,那么它是如何在pod中使用的呢?
库伯内特斯文档说DNS信息需要传递给kubelet,但据我所知,我无法访问GKE上的信息,所以它是不是在GKE上没有这样设置,还是有什么事情要做来激活它?
我的一些服务(特别是zoogger)自己知道其他节点,并尝试通过主机名(即pod名称)连接到它们,除非我自己更新host
文件,否则会失败。我想为此使用集成的DNS服务。
关于如何做到这一点的任何指导将不胜感激。
谢啦
更新
根据文档,现在的格式是:
_my-port-name._my-port-protocol.my-svc.my-namespace. s vc.group.local
请参阅此处的相关文档:https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/#pods
原答复:
截至目前,这实际上是不可能的…但是库伯内特斯团队正在研究这个问题。
看到这个问题:https://github.com/kubernetes/kubernetes/issues/13552
更新:
自09/2015起DNS可用于Pod见PR:https://github.com/kubernetes/kubernetes/pull/13759
简而言之:
这将以的形式提供pods dns
库伯内特斯statefulset支持关联服务名称,并通过服务名称定义pod dns名称。
比如你创建一个zk守护进程集和一个zk服务,那么zk守护进程集的第一个pod的dns名称是zk-0。$(servicename)。$(命名空间). svc.club.local
更多详情见:https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/
重要提示:服务必须是“无头”的,也就是说它的. spec.grousterIP
必须是无
。
库伯内特斯为StatefulSet
的所有组件提供稳定的网络ID
考虑以下示例:
kind: Namespace
apiVersion: v1
metadata:
name: mynamespace
---
apiVersion: v1
kind: Service
metadata:
name: myservice
namespace: mynamespace
labels:
app: myapp
spec:
ports:
- port: 80
name: http
type: ClusterIP
selector:
app: myapp
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: myapp
namespace: mynamespace
spec:
serviceName: myservice
replicas: 2
selector:
matchLabels:
app: myapp
# ...
然后,您将在k8s集群中拥有以下可解析的DNS条目:
myservice. mynamesspace.svc.club.local
用于通过myservice
myapp
pod之一进行负载平衡访问
myapp-0. myservice.mynamesspace.svc.club.local
用于直接访问myapp
StatetefulSet
myapp-1. myservice.mynamesspace.svc.club.local
用于直接访问myapp
StatetefulSet
文档:https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#stable-network-id