kubernetes - io.fabric8.kubernetes.client.KubernetesClientException : Forbidden! 配置的服务帐户无权访问

标签 kubernetes namespaces fabric8

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

关于kubernetes - io.fabric8.kubernetes.client.KubernetesClientException : Forbidden! 配置的服务帐户无权访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66654569/

相关文章:

kubernetes - 如何在Kubernetes配置文件中添加环境变量?

python - Django 'polls' 不是注册的命名空间

java - io.fabric8插件生成kubernetes和openshift yaml

java - Forbidden : updates to statefulset spec for fields other than 'replicas' , 'template' 和 'updateStrategy' 被禁止

java - 如何使用 Fabric8 docker-maven-plugin 从 Dockerfile 构建 docker 镜像?

kubernetes - 如何找到 kubectl 支持的给定资源类型的字段选择器列表?

mongodb - 如何在创建时在 bitnami mongodb 图表中插入数据?

kubernetes - 使用外部ELK堆栈记录Kubernetes

swift - 两个不同模块中的相同类扩展

c# - 命名空间未正确加载