我在本地机器中配置了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 = new ConfigBuilder().build();
或创建客户端,例如:
KubernetesClient client = new DefaultKubernetesClient();
从吊舱内,它将自动为您读取令牌。
如果您需要在其他地方通过它,则可以:
String token = config.getOauthToken();
或
String token = client.getConfiguration().getOauthToken();
从吊舱内,服务帐户令牌量为/var/run/secrets/kubernetes.io/serviceaccount/token
,如下所示。该路径在(至少在v2.6.2的braind8 Client
中)进行了硬编码的事实使我相信,如果仅省略了withOauthToken()
呼叫Client
可能会工作&Trade;
目前尚不清楚您提供的代码片段是否预计将运行集群的,但是如果是这样,那么您就有一个小的鸡肉和蛋的问题,可以向API提供AUTH可以获取Secret
创建一个带有下面yaml定义的服务帐户
步骤1:创建api-manager.yaml,以下内容
种类:角色apiversion:rbac.authorization.k8s.io/v1元数据:名称:Api-Manager名称空间:默认值规则:
- apigroups:[batch;资源:[jobs; quot; quot" cronjob; quot"]动词:[get get; quot list&quord'''''''''''''''''''''''''''''''''''
种类:角色apiversion:rbac.authorization.k8s.io/v1元数据:名称:udefreadonlybinding名称空间:默认值主题:
- 种类:ServiceAccount名称:Api-Manager名称空间:默认值ROLEREF:善良:角色名称:创造者Apigroup:rbac.authorization.k8s.io
步骤2:kubectl create -f api -manager.yaml
步骤3:编辑您的POD DP文件并映射服务帐户然后将此服务帐户映射到内部映射容器内的服务帐户的POD(path:/var/run/secrets/kubernetes.io/serviceaccount/token)
步骤4:在Java代码中io.fabric8.kubernetes.client.defaultkubernetesclient client = new DefaultKuberNetesClient();system.out.println(&quot' client.getNamespace());
Config config = new ConfigBuilder().withMasterUrl(externalTunnelUrl).withOauthToken(managementTokenProvider.getManagementToken(clusterName)).withUsername("management-token").build();
只有同样的需求。Oauthtoken可能不是显而易见的名称,而是工作。
请注意,我没有在此处指定客户端证书。