使用 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-runtime
的 Client
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 中,您应该:
- 通过 public 互联网与中间负载平衡器连接
中间。不推荐用于敏感流量。 ~或~
- 对等两个 VPC,并再次使用某种可以连接两个 k8s 集群的负载均衡器。 (NGINX 可能在这里工作,但取决于你在做什么)
这有帮助吗?
事实证明这很容易做到,只需使用主 URL 和令牌调用以下命令即可访问它:
cfg, err := clientcmd.BuildConfigFromFlags(os.Getenv("MASTERURL"), os.Getenv("KUBECONFIG"))
cfg.BearerToken = os.Getenv("BEARERTOKEN")
它可能还需要:
cfg.Insecure = true
我正在构建的 Operator 需要与其他 Kubernetes 集群通信,是否有关于如何从运行在 Kubernetes 上的 Operator 中做到这一点的最佳实践?
使用 k8s.io/client-go/tools/clientcmd
包我可以调用 BuildConfigFromFlags
方法传递 masterURL
和 kubeconfig 位置。这在 Kubernetes 外部运行良好,但在 Kubernetes 内部,是否可以对 kubeconfig 位置做出任何假设?还是应该使用其他 API?
附带说明:我正在使用 controller-runtime
的 Client
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 中,您应该:
- 通过 public 互联网与中间负载平衡器连接 中间。不推荐用于敏感流量。 ~或~
- 对等两个 VPC,并再次使用某种可以连接两个 k8s 集群的负载均衡器。 (NGINX 可能在这里工作,但取决于你在做什么)
这有帮助吗?
事实证明这很容易做到,只需使用主 URL 和令牌调用以下命令即可访问它:
cfg, err := clientcmd.BuildConfigFromFlags(os.Getenv("MASTERURL"), os.Getenv("KUBECONFIG"))
cfg.BearerToken = os.Getenv("BEARERTOKEN")
它可能还需要:
cfg.Insecure = true