在我们基于 Kubernetes 编写云原生 GoLang 代码时,通常在本地调试时,使用 kubeconfig 文件,以构建基于 clientSet 的客户端。而在将代码作为容器部署到集群时,则会使用集群 (in-cluster) 内的配置。
clientcmd 模块用于通过传递本地 kubeconfig 文件构建 clientSet。因此,在容器内使用相同模块构建 clientSet 将需要维护容器进程可访问的 kubeconfig 文件,并设置具有访问 Kubernetes 资源权限的 serviceaccount token。
下面是一个基于 kubeconfig 访问集群的代码模式
|
|
这样做可能导致 serviceaccount token 本身被潜在地暴露出去。如果任何用户能够执行到使用 kubeconfig 与集群通信的容器,那么就可以获取该 token,并可以伪装成服务账号从集群外部与 kube-apiserver 进行通信。
为了避免这种情况,我们在 client-go 模块中使用了 rest 包。这将帮助我们从集群内部与集群通信,前提是使用适当的服务账号运行。但这需要对代码进行重写,以适应从集群外部构建 client-set 的方式。
下面代码时使用 in-cluster 方式进行通讯的模式
|
|
除了这些之外,还需要创建对应的 serviceaccount 来让 Pod 在 in-cluster 有权限获取到自己要的资源,下面是一个完整的 deployment 创建这些资源的清单
|
|