我正在构建的运算符需要与其他 Kubernetes 集群通信,是否有任何最佳实践可以在运行在 Kubernetes 上的运算符中执行此操作?
使用k8s.io/client-go/tools/clientcmd
包,我可以调用BuildConfigFromFlags
传递masterURL
和 kubeconfig 位置的方法。这在 Kubernetes 之外工作得很好,但在 Kubernetes 内部,可以对 kubeconfig 的位置做出任何假设吗?还是应该使用其他一些 API?
作为旁注:我正在使用controller-runtime
的Client
API与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 中,则应:
- 通过公共互联网与中间负载均衡器连接 中间。不建议用于敏感流量。~或~
- 对等两个 VPC,然后再次使用某种可以连接两个 k8s 集群的负载均衡器。(NGINX可能在这里工作,但取决于你在做什么(
这有帮助吗?