Relates to How to call a service exposed by a Kubernetes cluster from another Kubernetes cluster in same project.
Asking again since Kubernetes has been changes a lot since July.
上下文:
我正在开发一个具有多个集群的基础设施,服务于不同的目的,例如:
- 集群 A 运行服务/应用,创建消费数据
- 集群 B 运行服务/应用,使用集群 A 中的应用创建的数据
- 集群 C 运行 Redis、Memcache 等数据服务。
所有集群都在 default
命名空间中。
问题:
在 Kubernetes 中,每个集群都有自己的 kubernetes(在 default
命名空间中)和 kube-dns(在 kube-system
命名空间中)服务,具有不同的 IP。
此设置发生的情况是,上述集群 A 和 B 中的服务无法发现(在服务发现术语中),比方说,集群 C 中的 Redis。因此 nslookup redis.default.svc.cluster .local
来自集群 A/B 中的一项服务返回 ** 服务器找不到 redis.default.svc.cluster.local: NXDOMAIN
。 注意:这在集群 C 中起作用。
我读过的关于 kube-dns 的文档和找到的文档一样多,而且几乎所有文档都假设一个集群设置。
集群信息:
这是来自两个不同集群的 /etc/resolv.conf
,显示了没有共同 kube-dns 祖先的 DNS 名称服务器:
集群 A:
nameserver 10.67.240.10
nameserver 169.254.169.254
nameserver 10.240.0.1
search default.svc.cluster.local svc.cluster.local cluster.local c.project-name.internal. 1025230764914.google.internal. google.internal.
集群 C:
nameserver 10.91.240.10
nameserver 169.254.169.254
nameserver 10.240.0.1
search default.svc.cluster.local svc.cluster.local cluster.local c.project-name.internal. google.internal.
options ndots:5
两个集群都在 kube-system
命名空间中使用各自集群的 IP 运行这些服务:
NAME LABELS SELECTOR
kube-dns k8s-app=kube-dns,kubernetes.io/cluster-service=true,kubernetes.io/name=KubeDNS k8s-app=kube-dns
kube-ui k8s-app=kube-ui,kubernetes.io/cluster-service=true,kubernetes.io/name=KubeUI k8s-app=kube-ui
monitoring-heapster kubernetes.io/cluster-service=true,kubernetes.io/name=Heapster k8s-app=heapster
此设置的理想修复/更新是什么,可以在 GCE 环境中的所有 Kubernetes 集群中发现共享服务?
最佳答案
这是 Kubernetes 试图用 Cross-Cluster Service Discovery 解决的大问题之一作为集群联合计划的一部分。您还可以 checkout /参与 Federation SIG .
如果您使用过 here 中描述的技巧解决方案之一,您也许可以破解您的 /etc/resolve.conf
以从其他集群搜索名称服务器。请小心,因为这可能会使您遇到截断问题。
您也可以修改 sky-dns RC让您的集群包含一个额外的 kube2sky pod,它指向另一个集群的 kubernetes 服务(我没有尝试过这个,也没有考虑过所有的影响)。
我上面描述的两种 hack 都不能防止名称冲突,因此您必须手动防止这种情况。
关于dns - Kubernetes 多集群服务发现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33816575/