如何从同一项目中的另一个 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 中的另一个网站集

如何从同一项目中的另一个类访问主类中的变量? [复制]

如何将项目从一个 STMFx 系列移植到同一系列中的另一个

前端 ASP.NET MVC4 作为一个项目,ASP.NET Web API 作为同一解决方案中的另一个项目 - 如何从前端调用 WebAPI?

当图像从 Kubernetes 集群中的另一个微服务提供时,如何使用下一个 js 图像优化?