kubernetes控制器到API的通信

kubernetes控制器到API的通信,kubernetes,Kubernetes,我有一个需要创建/编写ConfigMap的需求,此代码将作为kube controller manager的一部分。我正在使用单个主控部署kubernetes,kubernetes组件作为POD运行。我使用“k8s.io/client go/rest”获取与API通信的客户机 import "k8s.io/client-go/rest" . . . rest.InClusterConfig() 根据InClusterConfig检查kubernetes服务环境变量,即“kubernetes_服

我有一个需要创建/编写ConfigMap的需求,此代码将作为kube controller manager的一部分。我正在使用单个主控部署kubernetes,kubernetes组件作为POD运行。我使用“k8s.io/client go/rest”获取与API通信的客户机

import "k8s.io/client-go/rest"
.
.
.
rest.InClusterConfig()
根据InClusterConfig检查kubernetes服务环境变量,即“kubernetes_服务_主机”“kubernetes_服务_端口”。甚至它也会检查服务令牌(/var/run/secrets/kubernetes.io/servicecomport/token)

我面临的问题是,当控制器管理器出现环境变量(“KUBERNETES_服务_主机”“KUBERNETES_服务_端口”)时,服务令牌(/var/run/secrets/KUBERNETES.io/serviceaccount/token)不存在,并且服务令牌也未装入

控制器管理器中不应使用“k8s.io/client go/rest”?
如果不应该使用,那么从controller manager传输API以创建/写入配置映射的最佳方式是什么?

为了创建k8s资源(POD、配置映射、部署等),您的群集必须处于稳定状态,这意味着kube apiserver、kube controller manager和kube调度程序必须处于就绪状态。根据我对您描述的理解,您正在使用静态清单将kubernetes组件部署为吊舱,在本例中,这些吊舱不是纯粹由kubernetes管理的,它们是docker(rkt)容器,一旦处于运行状态,就连接到kubernetes。因此,它们没有任何特定于kubernetes的pod环境配置(正如您所注意到的,它们缺少kubernetes机密和环境),这就是您无法使用
InClusterConfig()
方法的原因。另一件事是,从kube controller manager中创建任何kubernetes资源看起来不是一个好主意。但是如果您确实想这样做,那么使用
k8s.io/client go/tools/clientcmd
中的
BuildConfigFromFlags()
,在该函数中,您可以手动指定kube apiserver url和kubeconfig文件位置,并重用kube控制器管理器标志

如果我想从集群内的kube控制器管理器与kube api通信,可能的选项是什么?实际上,没有在控制器管理器中创建secret“/var/run/secrets/kubernetes.io/serviceCount/token”。是的,但是通过使用
BuildConfigFromFlags()
,secret无需与api通信,您只需设置用于身份验证的api url和kubeconfig,这样就可以在控制器管理器中像这样设置k8s客户端:
restClientCfg,err:=clientcmd.BuildConfigFromFlags(s.Master,s.kubeconfig),如果err!=nil | | restClientCfg==nil{glog.V(2).Infof(“无法从标志%V构建rest客户端配置”,err)return err}kubeClient,err:=clientset.NewForConfig(restclient.AddUserAgent(restClientCfg,“控制器管理器”)