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

How to call a service exposed by a Kubernetes cluster from another Kubernetes cluster in same project

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

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

是否有类似 "service-selector" 的自动更新目标池?如果没有,对于这个用例还有其他更好的方法吗?

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

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

    找到 k2 集群的 SERVICE_CLUSTER_IP_RANGE。在 GKE 上,它将是 cluster describe 输出中的 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 proposal doc (specifically the Cross Cluster Service Discovery 部分),并通过打开 issues/sending PR 加入讨论。

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

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