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

Sun*_*mar 18 google-cloud-platform kubernetes google-kubernetes-engine

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

出于安全原因,我不想公开S2的公共IP.通过网络负载平衡在K2集群的计算实例上使用NodePorts可以灵活地实现,因为每次在K2中添加/删除节点时,我都必须在目标池中添加/删除K2的计算实例.

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

CJ *_*len 11

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

  1. 所有k2服务的堡垒路线为k2:

    找到SERVICE_CLUSTER_IP_RANGEk2群集.在GKE上,它将是servicesIpv4Cidr集群输出中的字段描述:

    $ gcloud beta container clusters describe k2
    ...
    servicesIpv4Cidr: 10.143.240.0/20
    ...
    
    Run Code Online (Sandbox Code Playgroud)

    添加高级路由规则以获取发往该范围的流量并将其路由到k2中的节点:

    $ gcloud compute routes create --destination-range 10.143.240.0/20 --next-hop-instance k2-node-0
    
    Run Code Online (Sandbox Code Playgroud)

    这将导致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
    
    Run Code Online (Sandbox Code Playgroud)

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

    现在,k1中的每个节点处理本地代理到k2.设置有点困难,但具有更好的缩放属性.

如您所见,这两种解决方案都不是那么优雅.正在讨论如何在Kubernetes中理想地使用这种类型的设置.您可以查看群集联合提议文档(特别是跨群集服务发现部分),并通过打开问题/发送PR加入讨论.


Ahm*_*gle 5

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

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

  • 有一个很大的警告,内部负载均衡器只能在单个区域内工作。如果客户端在其他区域中运行,则它们不能使用ILB,因此仍然需要其他解决方法。 (3认同)
  • @AlexRobinson,你是如何克服这个限制的?我自己也遇到了。 (2认同)