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

Connect with go code from Kubernetes to external Kubernetes cluster

我正在构建的 Operator 需要与其他 Kubernetes 集群通信,是否有关于如何从运行在 Kubernetes 上的 Operator 中做到这一点的最佳实践?

使用 k8s.io/client-go/tools/clientcmd 包我可以调用 BuildConfigFromFlags 方法传递 masterURL 和 kubeconfig 位置。这在 Kubernetes 外部运行良好,但在 Kubernetes 内部,是否可以对 kubeconfig 位置做出任何假设?还是应该使用其他 API?

附带说明:我正在使用 controller-runtimeClient API 与 Kubernetes 通信。

来自 "Programming Kubernetes",编辑。 Oreilly(我建议阅读):

"When running a binary inside of a pod in a cluster, the kubelet will automatically mount a service account into the container at /var/run/secrets/kubernetes.io/serviceaccount. It replaces the kubeconfig file just mentioned and can easily be turned into a rest.Config via the rest.InClusterConfig() method."

需要的配置是用这行:

cfg, err := rest.InClusterConfig()

看看这里的代码:

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

Kubernetes Operator 最终是 Kubernetes 内部的一个 pod 运行。如果您想访问当前 K8S 集群的 API.

,Nicola Ben 的回答是必经之路

但是,您说的是您的运算符 "needs to talk to other Kubernetes clusters"(我强调的),并且它在本地有效。

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

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

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

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

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

这有帮助吗?

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

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

它可能还需要:

cfg.Insecure = true