22

我有两个服务,集群 K1 中的 S1 和集群 K2 中的 S2。他们有不同的硬件要求。服务 S1 需要与 S2 对话。

出于安全原因,我不想公开 S2 的公共 IP。在具有网络负载平衡的 K2 集群的计算实例上使用 NodePorts 会降低灵活性,因为每次在 K2 中添加/删除节点时,我都必须在目标池中添加/删除 K2 的计算实例。

是否有用于自动更新目标池的“服务选择器”之类的东西?如果没有,对于这个用例还有其他更好的方法吗?

4

2 回答 2

13

我可以想到几种方法来跨连接到同一个 GCP 专用网络的多个集群访问服务:

  1. 所有 k2 服务的堡垒路由到 k2:

    找到SERVICE_CLUSTER_IP_RANGEk2 集群的。在 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,但它很简单。

  2. 在 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 来参与讨论。

于 2015-07-27T23:48:09.430 回答
6

GKE 现在支持内部负载均衡器: https ://cloud.google.com/kubernetes-engine/docs/how-to/internal-load-balancing

它的主要用例是拥有一个不暴露于公共互联网的负载均衡器,因此可以从同一网络中的其他 GCE 虚拟机或其他 GKE 集群访问在 GKE 上运行的服务。

于 2018-01-26T04:46:17.550 回答