k8s namespace权限问题无法读取configmap

报错显示系统服务账户在mycomp-services-process命名空间下无权访问pods资源。解决方案是通过clusterrolebinding为serviceaccount default赋予必要的权限,创建允许列出服务的角色,并参考相关教程进行配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

报错信息:

Message: Forbidden!Configured service account doesn't have access. Service account may have been revoked. User "system:serviceaccount:mycomp-services-process:default" cannot get resource “pods” in API group "" in the namespace "sscp-sit"

报错截图:

解决方法:

在第一个错误中,问题是默认命名空间中的serviceaccount default无法获取服务,因为它无法访问list / get服务。 因此,您需要做的是使用clusterrolebinding为该用户分配角色。

参考:https://www.e-learn.cn/content/wangluowenzhang/504150

遵循一组最低权限,您可以先创建一个可以访问列表服务的角色:

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: 
### 如何通过 Java 读取 Kubernetes 资源或配置 要实现通过 Java读取 Kubernetes 的资源或配置,可以利用官方支持的 **Kubernetes Java Client** 库。该库提供了丰富的 API 接口来操作 Kubernetes 集群中的各种对象。 以下是具体方法: #### 添加依赖项 为了使用 Kubernetes Java Client,在 Maven 或 Gradle 中添加相应的依赖项[^4]。 对于 Maven: ```xml <dependency> <groupId>io.kubernetes</groupId> <artifactId>client-java</artifactId> <version>16.0.0</version> </dependency> ``` 对于 Gradle: ```gradle implementation 'io.kubernetes:client-java:16.0.0' ``` --- #### 创建客户端实例并连接到集群 可以通过加载 kubeconfig 文件或者直接访问 InCluster 环境的方式创建 `KubernetesClient` 实例[^5]。 以下是一个简单的代码示例展示如何初始化客户端以及获取 Pod 列表的信息: ```java import io.kubernetes.client.openapi.ApiClient; import io.kubernetes.client.openapi.Configuration; import io.kubernetes.client.openapi.apis.CoreV1Api; import io.kubernetes.client.util.Config; public class KubernetesExample { public static void main(String[] args) throws Exception { ApiClient client = Config.defaultClient(); // 加载默认 kubeconfig 文件 Configuration.setDefaultApiClient(client); CoreV1Api api = new CoreV1Api(); String namespace = "default"; // 替换为目标命名空间 System.out.println("Listing pods with their IPs:"); var podList = api.listNamespacedPod(namespace, null, null, null, null, null, null, null, null, null); for (var item : podList.getItems()) { System.out.printf("Name: %s\tIP: %s\n", item.getMetadata().getName(), item.getStatus().getPodIP()); } } } ``` 上述程序会打印指定命名空间下的所有 Pods 名称及其对应的 IP 地址。 --- #### 获取其他类型的资源 除了 Pod 外,还可以查询 Service、Deployment、ConfigMap 等多种资源。例如,下面是如何列举某个命名空间内的 Services: ```java import io.kubernetes.client.openapi.models.V1Service; import java.util.List; // ... 继续之前的代码逻辑 ... var serviceList = api.listNamespacedService(namespace, null, null, null, null, null, null, null, null, null); for (V1Service svc : serviceList.getItems()) { System.out.printf("Service Name: %s Type: %s ClusterIP: %s\n", svc.getMetadata().getName(), svc.getSpec().getType(), svc.getSpec().getClusterIP()); } ``` 如果需要自定义过滤条件,则可以在调用列表接口时传入额外参数(如 labelSelector)[^6]。 --- #### 使用 InCluster 配置方式 当应用程序部署于 Kubernetes 内部容器环境时,推荐采用 InCluster 方式建立连接而无需显式提供 kubeconfig 文件路径。 ```java try { ApiClient inClusterClient = Config.fromCluster(); Configuration.setDefaultApiClient(inClusterClient); } catch (IOException | ConfigException e) { throw new RuntimeException(e.getMessage()); } ``` 此模式下,默认从 `/var/run/secrets/kubernetes.io/serviceaccount/token` 和 `/etc/kubernetes/pki/ca.crt` 提取消费者凭证与 CA 数据完成身份验证过程[^7]。 --- #### 错误处理机制 实际开发过程中不可避免遇到网络超时或其他异常状况,因此建议加入全面错误捕获策略保障稳定性。 ```java try { List<V1Pod> items = api.listNamespacedPod(namespace).getItems(); if(items.isEmpty()){ System.err.println("No pods found."); }else{ // 正常业务流程... } }catch(KubernetesClientException ex){ int statusCode = ex.getCode(); switch(statusCode){ case 403 -> {System.err.println("Access denied."); break;} default->throw ex; // 将未知问题重新抛给上层解决 } } ``` --- #### 总结说明 借助 Kubernetes Java SDK 不仅能够轻松管理各类 K8S 对象状态还能进一步扩展至事件监听器等功能模块构建更复杂的运维工具集[^8]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值