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 应该能够访问集群范围内的 podsnamespace 对象。