我正在建立的运营商需要与其他Kubernetes集群进行交流,是否有最佳实践来从Kubernetes上运行的运营商内部做到这一点?
使用k8s.io/client-go/tools/clientcmd
包,我可以调用BuildConfigFromFlags
和kubeconfig位置传递的masterURL
方法。在Kubernetes外部可以正常工作,但是在Kubernetes内,可以对kubeconfig位置进行任何假设吗?还是应该使用其他一些API?
请注意:我正在使用controller-runtime
的{{1}} API与Kubernetes通话。
答案 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中,则您应该:
有帮助吗?