我正在尝试使用kubernetes java客户端来处理几个用例。
https://github.com/kubernetes-client/java
我们的kubernetes集群已通过OpenId身份验证实现。
不幸的是,java客户端不支持OpenId auth。
Java代码: -
final ApiClient client = io.kubernetes.client.util.Config.defaultClient();
Configuration.setDefaultApiClient(client);
CoreV1Api api = new CoreV1Api();
V1PodList list = api.listPodForAllNamespaces(null, null, null, null, null, null, null, null, null);
for (V1Pod item : list.getItems()) {
System.out.println(item.getMetadata().getName());
}
错误: -
13:25:22.549 [main] ERROR io.kubernetes.client.util.KubeConfig - Unknown auth provider: oidc
Exception in thread "main" io.kubernetes.client.ApiException: Forbidden
at io.kubernetes.client.ApiClient.handleResponse(ApiClient.java:882)
at io.kubernetes.client.ApiClient.execute(ApiClient.java:798)
at io.kubernetes.client.apis.CoreV1Api.listPodForAllNamespacesWithHttpInfo(CoreV1Api.java:18462)
at io.kubernetes.client.apis.CoreV1Api.listPodForAllNamespaces(CoreV1Api.java:18440)
是否有任何计划支持使用Java客户端的OpenId auth。或者,还有其他方法吗?
由于
答案 0 :(得分:1)
Apparently not,但到目前为止,更大的问题是:在Java设置中oidc
auth-provider
会发生什么期望?只需使用id-token
?如果无法重新获取refresh-token
,是否可以使用id-token
并抛出异常?一些回调系统让您自己管理生命周期?
尝试从库执行oidc充满了危险,因为几乎可以肯定没有"用户"与...互动。
是否有任何计划支持使用Java客户端的OpenId auth
只有项目维护人员可以回答这个问题,当没有问题描述您期望发生的事情时,他们不太可能知道优先处理这类工作。随意create one。
或者,还有其他方法吗?
与此同时,您仍然可以使用Config.fromToken()
在.kube/config
中捕鱼,然后取出现有的id-token
,然后处理任何需要使用的ApiException
refresh-token
,因为您将更多地了解您的客户愿意做出哪些权衡。
答案 1 :(得分:0)
请注意,作为api客户端基础的ok-http支持oauth。我们的本地集群使用oidc,我已经能够与它进行如下交谈。
ApiClient client = new ClientBuilder()
.setBasePath("https://api.kube.example.com/")
.setAuthentication(new AccessTokenAuthentication(token))
.build();
我们有一个自定义命令,可将您登录到我从中获取令牌的系统。
我还没有尝试过,但是可以为io.kubernetes.client.util.authenticators.Authenticator
实现一个oidc
,然后将其注册到KubeConfig#registerAuthenticator(Authenticator)
中。如果这样做符合我的期望,那么您将获得与kubectl
命令行相同的功能,该命令行似乎知道如何获取刷新令牌,但无法进行前期身份验证。