使用Go代码从Kubernetes连接到外部Kubernetes集群

时间:2019-09-27 08:31:33

标签: go kubernetes kubernetes-operator

我正在建立的运营商需要与其他Kubernetes集群进行交流,是否有最佳实践来从Kubernetes上运行的运营商内部做到这一点?

使用k8s.io/client-go/tools/clientcmd包,我可以调用BuildConfigFromFlags和kubeconfig位置传递的masterURL方法。在Kubernetes外部可以正常工作,但是在Kubernetes内,可以对kubeconfig位置进行任何假设吗?还是应该使用其他一些API?

请注意:我正在使用controller-runtime的{​​{1}} API与Kubernetes通话。

4 个答案:

答案 0 :(得分:1)

最后,kubernetes运算符是在Kubernetes内部运行的pod。如果您想访问当前的K8S集群的API,Nicola Ben的答案就是解决之道。

但是,您是说您的运营商“需要与其他 Kubernetes集群进行交谈”(我的重点是),并且它可以在本地运行。

然后,一种简单的方法是创建一个包含ConfigMap文件的kubeconfig,并将其安装到操作员窗格中的已知位置。然后,您可以像在本地一样使用该方法。

答案 1 :(得分:1)

事实证明这很容易做到,只需使用主URL和令牌调用以下内容即可访问它:

cfg, err := clientcmd.BuildConfigFromFlags(os.Getenv("MASTERURL"), os.Getenv("KUBECONFIG"))
cfg.BearerToken = os.Getenv("BEARERTOKEN")

它可能还需要:

cfg.Insecure = true

答案 2 :(得分:0)

摘自《 Programming Kubernetes》。奥雷利(我建议阅读):

“在群集中的Pod中运行二进制文件时,kubelet将自动在/var/run/secrets/kubernetes.io/serviceaccount上的容器中安装服务帐户。它将替换刚才提到的kubeconfig文件,并且可以可以通过rest.InClusterConfig()方法轻松地转换为rest.Config。“

所需的配置与此行:

cfg, err := rest.InClusterConfig()

在这里查看代码:

https://github.com/programming-kubernetes/cnat/blob/master/cnat-client-go/main.go

答案 3 :(得分:0)

问题:这两个集群是在GKE上还是由您手动在其他环境上管理?

Kubernetes服务基本上是可以作为您的控制器的Pod的集合。

一种实现此目的的方法是将您的服务暴露给集群之外。在GKE上,您可以使用ILB来执行此操作,ILB将帮助您将服务公开给可能要在同一VPC中连接的其他k8s群集。 但是,如果您需要连接的其他服务位于某个其他VPC中,则您应该:

  1. 通过公共互联网连接中间的负载均衡器 中间。不建议用于敏感流量。 〜或〜
  2. 对两个VPC进行对等,然后再次使用某种可以连接两个k8s集群的负载均衡器。 (NGINX可能在这里起作用,但要取决于您在做什么)

有帮助吗?