如何解决io.fabric8.kubernetes.client.KubernetesClientException:禁止!配置的服务帐户无权访问
Config config = new ConfigBuilder().withMasterUrl("https://c2.eu-de.containers.cloud.ibm.com:78945").build(); try (KubernetesClient client = new 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: Failure execution: GET at: https://c2.eu-de.containers.cloud.ibm.com:78945/api/v1/namespaces。消息:禁止!配置的服务帐户无权访问。服务帐户可能已被撤销。命名空间被禁止:用户“system:serviceaccount:badefault”无法在集群范围内的 API 组“”中列出资源“命名空间”。这个错误
解决方法
这意味着您使用的 ServiceAccount badefault
无权访问资源 namespaces
。请检查Using RBAC Authorization。您需要创建所需的角色和角色绑定。
从您的错误来看,您的 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
绑定到您的 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
对象。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。