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



我正在构建的运算符需要与其他 Kubernetes 集群通信,是否有任何最佳实践可以在运行在 Kubernetes 上的运算符中执行此操作?

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

作为旁注:我正在使用controller-runtimeClientAPI与Kubernetes交谈。

最终,Kubernetes 运算符是一个运行在 Kubernetes 内部的 pod。Nicola Ben 的答案是,如果你想访问当前 K8S 集群的 API,这是要走的路。

但是,您说您的运营商"需要与其他 Kubernetes 集谈">(我的强调(,并且它在本地工作。

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

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

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

它可能还需要:

cfg.Insecure = true

摘自 "Programming Kubernetes", ed. Oreilly(我建议阅读(:

"当在集群中的 Pod 中运行二进制文件时,kubelet 会自动将服务帐户挂载到/var/run/secrets/kubernetes.io/serviceaccount 的容器中。它取代了刚才提到的 kubeconfig 文件,可以很容易地变成一个休息。通过其余部分进行配置。InClusterConfig(( 方法。

所需的配置采用以下行:

cfg, err := rest.InClusterConfig()

看看这里的代码:

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

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

Kubernetes 服务基本上是 pod 的集合,它可以是你的控制器。

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

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

这有帮助吗?

最新更新