如何从同一项目中的另一个 Kubernetes 集群调用 Kubernetes 集群公开的服务
Posted
技术标签:
【中文标题】如何从同一项目中的另一个 Kubernetes 集群调用 Kubernetes 集群公开的服务【英文标题】:How to call a service exposed by a Kubernetes cluster from another Kubernetes cluster in same project 【发布时间】:2015-10-18 06:51:54 【问题描述】:我有两个服务,集群 K1 中的 S1 和集群 K2 中的 S2。他们有不同的硬件要求。服务 S1 需要与 S2 通信。
出于安全原因,我不想公开 S2 的公共 IP。在具有网络负载平衡的 K2 集群的计算实例上使用 NodePorts 会降低灵活性,因为每次在 K2 中添加/删除节点时,我都必须在目标池中添加/删除 K2 的计算实例。
是否有类似“服务选择器”的东西用于自动更新目标池?如果没有,对于这个用例还有其他更好的方法吗?
【问题讨论】:
在这里查看我的答案:***.com/questions/35812076/… 【参考方案1】:GKE 现在支持内部负载均衡器: https://cloud.google.com/kubernetes-engine/docs/how-to/internal-load-balancing
它的主要用例是拥有一个不暴露于公共互联网的负载平衡器,因此可以从同一网络中的其他 GCE 虚拟机或其他 GKE 集群访问在 GKE 上运行的服务。
【讨论】:
有一个很大的警告,内部负载平衡器只能在单个区域内工作。如果客户端在不同的区域中运行,它们将无法使用 ILB,因此仍然需要其他解决方法。 @AlexRobinson,你是如何绕过这个限制的?我自己也遇到了。【参考方案2】:我可以想到几种方法来跨连接到同一个 GCP 专用网络的多个集群访问服务:
所有 k2 服务的堡垒路由到 k2:
找到 k2 集群的 SERVICE_CLUSTER_IP_RANGE
。在 GKE 上,它将是集群描述输出中的 servicesIpv4Cidr
字段:
$ gcloud beta container clusters describe k2
...
servicesIpv4Cidr: 10.143.240.0/20
...
添加一个高级路由规则以获取发往该范围的流量并将其路由到 k2 中的节点:
$ gcloud compute routes create --destination-range 10.143.240.0/20 --next-hop-instance k2-node-0
这将导致k2-node-0
代理来自私有网络的任何 k2 服务的请求。这有给k2-node-0
额外工作的明显缺点,但它很简单。
在 k1 的所有节点上安装 k2 的 kube-proxy。
查看 k2 中任意节点上当前运行的 kube-proxy:
$ ps aux | grep kube-proxy
... /usr/local/bin/kube-proxy --master=https://k2-master-ip --kubeconfig=/var/lib/kube-proxy/kubeconfig --v=2
将 k2 的 kubeconfig 文件复制到 k1 中的每个节点(比如 /var/lib/kube-proxy/kubeconfig-v2
)并在每个节点上启动第二个 kube-proxy:
$ /usr/local/bin/kube-proxy --master=https://k2-master-ip --kubeconfig=/var/lib/kube-proxy/kubeconfig-k2 --healthz-port=10247
现在,k1 中的每个节点都在本地处理到 k2 的代理。设置起来有点困难,但具有更好的缩放属性。
如您所见,这两种解决方案都不是那么优雅。正在讨论这种类型的设置应该如何在 Kubernetes 中理想地工作。您可以查看Cluster Federation 提案文档(特别是Cross Cluster Service Discovery 部分),并通过打开问题/发送 PR 来参与讨论。
【讨论】:
CIDR 是否保证在项目中的所有集群中都是唯一的? 如果您使用 GKE,可以(在网络中的所有集群中是唯一的)。如果您手动部署自己的 kubernetes 集群,那么避免冲突由您自己决定。以上是关于如何从同一项目中的另一个 Kubernetes 集群调用 Kubernetes 集群公开的服务的主要内容,如果未能解决你的问题,请参考以下文章
将数据从一个网站集获取到同一 Web 应用程序共享点 2016 中的另一个网站集
前端 ASP.NET MVC4 作为一个项目,ASP.NET Web API 作为同一解决方案中的另一个项目 - 如何从前端调用 WebAPI?