我已经在我的本地机器上配置了 minikube,并打算在外部使用 kubernetes。我在 kubernetes 中创建了一个服务帐户并使用它的秘密我可以使用以下命令获取访问令牌。
kubectl get secret <service-account-secret> -o yaml -n mynamespace
我的问题是如何在运行时使用 fabric8 java 客户端执行此操作?我想要的是通过将服务帐户的秘密作为参数来获取访问令牌。
我正在如下启动配置。
Config config = new ConfigBuilder().withMasterUrl(masterURL)
.withClientCertFile(certFile).withOauthToken(serviceAccountAccessToken).build();
我能知道如何使用 fabric8 java 客户端获取如上所述的 serviceAccountAccessToken 吗?
客户已经为你做了。
如果你只是创建一个空的 Config 对象:
Config config = new ConfigBuilder().build();
或者创建客户端,比如:
KubernetesClient client = new DefaultKubernetesClient();
在 pod 中,它会自动为您读取令牌。
如果你需要传递到其他地方,你可以:
String token = config.getOauthToken();
或
String token = client.getConfiguration().getOauthToken();
在 Pod 中,服务帐户令牌被卷挂载为
/var/run/secrets/kubernetes.io/serviceaccount/token
,如此处所示。该路径在(至少 v2.6.2 的)fabric8 Client
中被硬编码这一事实使我相信,也许如果一个人只是省略了 withOauthToken()
调用,那么 Client
可能只是工作™
有点不清楚您提供的代码片段是否应该在集群外运行,但如果是这样,那么您将遇到一个小鸡和蛋的问题,即向 API 提供身份验证,以便您可以获得
Secret
使用以下 yaml 定义创建服务帐户
第 1 步:使用以下内容创建 api-manager.yaml
种类:作用 api版本:rbac.authorization.k8s.io/v1 元数据: 名称:api-manager 命名空间:默认 规则:
种类:角色绑定 api版本:rbac.authorization.k8s.io/v1 元数据: 名称:udefreadonlybinding 命名空间:默认 科目:
第二步: kubectl create -f api-manager.yaml
第三步: 编辑您的 pod dp 文件并映射服务帐户 然后将此服务帐户映射到在容器内部映射服务帐户的 pod(路径:/var/run/secrets/kubernetes.io/serviceaccount/token)
第四步:在java代码中 io.fabric8.kubernetes.client.DefaultKubernetesClient client = new DefaultKubernetesClient(); System.out.println("client"+client.getNamespace());
Config config = new ConfigBuilder().withMasterUrl(externalTunnelUrl).withOauthToken(managementTokenProvider.getManagementToken(clusterName)).withUsername("management-token").build();
只是有同样的需求。 OauthToken 可能不是一个显而易见的名字,但它确实有效。
请注意,我没有在那里指定客户端证书文件。