Kubernetes多集群服务发现

moh*_*the 3 dns service-discovery kubernetes skydns google-kubernetes-engine

如何从同一项目中的另一个Kubernetes集群调用Kubernetes集群公开的服务有关.

自从Kubernetes自7月以来发生了很大的变化以来再次询问.

语境:

我正在开发一个具有多个集群的基础架构,用于不同的目的,例如:

  • 群集A运行服务/应用程序,创建供消费的数据
  • 群集B运行服务/应用程序,消耗群集A中的应用程序创建的数据
  • Cluster C运行Redis,Memcache等数据服务.

所有群集都在default命名空间中.

问题:

在Kubernetes中,每个集群都有自己的kubernetes(在default命名空间中)和kube-dns(在kube-system命名空间中)服务,具有不同的IP.

这种设置会发生的情况是,上面的集群A和B中的服务无法发现(在服务发现术语中),比如集群C中的Redis.因此nslookup redis.default.svc.cluster.local来自集群A/B中的一个服务会返回** server can't find redis.default.svc.cluster.local: NXDOMAIN.注意:这适用于集群C内部.

我读了很多关于kube-dns的文档,几乎都假设有一个集群设置.

集群信息:

以下是/etc/resolv.conf来自两个不同的群集,显示DNS名称服务器,没有共同的kube-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.
Run Code Online (Sandbox Code Playgroud)

群集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
Run Code Online (Sandbox Code Playgroud)

这两个集群都使用它们各自的IP来运行这些服务,以用于kube-system命名空间中的集群:

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
Run Code Online (Sandbox Code Playgroud)

什么是此设置的理想修复/更新,可以在GCE环境中的所有Kubernetes集群中发现共享服务?

CJ *_*len 5

这是Kubernetes试图通过跨群集服务发现解决的大问题之一,作为群集联合计划的一部分.您还可以查看/贡献联邦SIG.

如果您使用了此处描述的其中一种黑客攻击解决方案,您可能还可以通过其他群集搜索名称服务器.要小心,因为这可能会让你陷入截断问题./etc/resolve.conf

您也可以修改群集的sky-dns RC,以包含一个额外的kube2sky pod,它指向另一个群集的kubernetes服务(我没有尝试过这个,或者想过所有的含义).

我上面描述的两个黑客都没有阻止名称冲突,所以你必须手动阻止它.