2

我正在构建的操作员需要与其他 Kubernetes 集群通信,是否有任何最佳实践可以从在 Kubernetes 上运行的操作员中做到这一点?

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

附带说明:我正在使用controller-runtimeClientAPI 与 Kubernetes 对话。

4

4 回答 4

2

最终,Kubernetes 操作员是在 Kubernetes 内部运行的 pod。如果您想访问当前 K8S 集群的 API,Nicola Ben 的回答是可行的方法。

但是,您是说您的操作员“需要与其他Kubernetes 集群通信”(我的重点),并且它在本地工作。

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

于 2019-09-27T09:34:24.493 回答
1

来自“编程 Kubernetes”,编辑。Oreilly(我建议阅读):

“当在集群中的 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

于 2019-09-27T09:09:12.627 回答
1

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

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

它可能还需要:

cfg.Insecure = true
于 2020-01-09T07:28:30.670 回答
0

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

Kubernetes 服务基本上是一组可以作为控制器的 pod。

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

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

这有帮助吗?

于 2019-11-27T07:47:17.810 回答