Config config = new ConfigBuilder().withMasterUrl("https://c2.eu-de.containers.cloud.ibm.com:78945").build(); 尝试(KubernetesClient客户端=新的DefaultKubernetesClient(config)){
client.pods().inNamespace("default").list().getItems().forEach(
pod -> System.out.println(pod.getMetadata().getName())
);
} catch (KubernetesClientException ex) {
// Handle exception
ex.printStackTrace();
}
我收到 io.fabric8.kubernetes.client.KubernetesClientException: 执行失败: GET at: https://c2.eu-de.containers.cloud.ibm.com:78945/api/v1/namespaces 。消息:禁止!配置的服务帐户无权访问。服务帐户可能已被撤销。命名空间被禁止:用户“system:serviceaccount:badefault”无法在集群范围的 API 组“”中列出资源“命名空间”。这个错误
最佳答案
从您的错误来看,您的 ServiceAccount
没有执行该特定操作所需的访问权限。您已发布用于列出 Pod
对象的代码,但您的错误是提示列出 Namespace
对象。
User "system:serviceaccount:badefault" cannot list resource "namespaces" in API group "" at the cluster scope
您可以使用以下命令向集群管理员提供对 ServiceAccount
的访问权限:
kubectl create clusterrolebinding default-pod --clusterrole cluster-admin --serviceaccount=<namespace>:badefault
如果您不想授予其集群管理员访问权限,您可以定义自定义 ClusterRole 来限制您希望 ServiceAccount
访问哪些 apiGroups 和资源:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: badefault-cluster-role
rules:
- apiGroups:
- ""
resources:
- pods
- namespaces
verbs:
- create
- delete
- deletecollection
- get
- list
- patch
- update
- watch
然后,您可以定义一个 ClusterRoleBinding
将此 ClusterRole
绑定(bind)到您的 ServiceAccount
对象:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: badefault-cluster-role-binding
subjects:
- kind: ServiceAccount
name: badefault
namespace: default
roleRef:
kind: ClusterRole
name: badefault-cluster-role
apiGroup: rbac.authorization.k8s.io
有了这个,您的 ServiceAccount
应该能够访问集群范围内的 pods
和 namespace
对象。
关于kubernetes - io.fabric8.kubernetes.client.KubernetesClientException : Forbidden! 配置的服务帐户无权访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66654569/