io.fabric8.kubernetes.client.KubernetesClientException: Forbidden!配置的服务帐户没有访问权限
io.fabric8.kubernetes.client.KubernetesClientException: Forbidden!Configured service account doesn't have access
Config config = new ConfigBuilder().withMasterUrl("https://c2.eu-de.containers.cloud.ibm.com:78945").build();
试试 (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:执行失败:GET 位于:https://c2.eu-de.containers.cloud.ibm.com:78945/api/v1/namespaces。消息:禁止!配置的服务帐户没有访问权限。服务帐号可能已被撤销。命名空间被禁止:用户“system:serviceaccount:badefault”无法在集群范围内的 API 组“”中列出资源“命名空间”。这个错误
这意味着您使用的ServiceAccount badefault
没有访问资源namespaces
的权限。请检查 Using RBAC Authorization。您需要创建所需的 Role 和 RoleBinding。
从您的错误看来,您的 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
如果您不想授予它集群管理员访问权限,您可以定义 Custom 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
对象。
Config config = new ConfigBuilder().withMasterUrl("https://c2.eu-de.containers.cloud.ibm.com:78945").build(); 试试 (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:执行失败:GET 位于:https://c2.eu-de.containers.cloud.ibm.com:78945/api/v1/namespaces。消息:禁止!配置的服务帐户没有访问权限。服务帐号可能已被撤销。命名空间被禁止:用户“system:serviceaccount:badefault”无法在集群范围内的 API 组“”中列出资源“命名空间”。这个错误
这意味着您使用的ServiceAccount badefault
没有访问资源namespaces
的权限。请检查 Using RBAC Authorization。您需要创建所需的 Role 和 RoleBinding。
从您的错误看来,您的 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
如果您不想授予它集群管理员访问权限,您可以定义 Custom 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
对象。