Java程序调kubernetes(k8s1.30.7)core API简单示例,并解决403权限验证问题,即何进行进行权限授权以及验证
简单记录问题
一、问题描述
希望通过Java程序使用Kubernetes提供的工具包实现对Kubernetes集群core API的调用,但是在高版本上遇见权限验证问题4xx。
<dependency><groupId>io.kubernetes</groupId><artifactId>client-java</artifactId><version>20.0.0</version> <!-- 请根据需要选择合适的版本 --></dependency>
权限验证的问题:
{"kind": "Status","apiVersion": "v1","metadata": {},"status": "Failure","message": "pods is forbidden: User \"system:anonymous\" cannot list resource \"pods\" in API group \"\" at the cluster scope","reason": "Forbidden","details": {"kind": "pods"},"code": 403
}
大意是system:anonymous匿名用户被禁止去访问相应集群的pods资源信息。
Kubernetes支持许多不同的身份验证方案,这些方案几乎总是在集群外部实现,包括X.509证书,基本身份验证,bearer令牌,用于通过可信身份提供商进行身份验证的OpenID Connect(OIDC)等。使用API服务器上的相关配置选项可以启用多种方案,因此请务必为计划使用的身份验证方案提供这些选项。例如,X.509客户端证书身份验证需要包含一个或多个CA证书( -client-ca-file)文件路径。需要记住的一点是,默认情况下,任何未通过其中一种身份验证方案验证的API请求都会被视为匿名请求。匿名用户(system:anonymous)默认被拒绝访问任何 API。即使是基本的 API(如列出 Pods),也需要显式分配权限,现阶段,所有 API 调用都需要经过明确的认证和授权。
查看一下集群的默认验证模式设置:
grep -C3 'authorization-mode' /etc/kubernetes/manifests/kube-apiserver.yaml

默认开启的是RBAC(基于角色的访问控制)。
各类模式以及下方各类k8s资源的介绍可参见:
Kubernetes K8S之鉴权RBAC详解 - 踏歌行666 - 博客园
二、解决方案
我需要针对集群中相关资源(pods lists)通过Java client进行增删改查操作,那么最直接快速的方式就是创建一个具有集群超级用户权限的用户,并将其对应的Key用于Java client,进行API的访问操作。
Prepare:查看clusterrole
clusterrole是集群范围的角色,用于管理整个集群中的资源。
通过指令
kubectl get clusterroles
查看到集群下有众多的clusterrole

其中有cluster-admin角色,我们可以通过如下指令查看其权限:
kubectl get clusterrole cluster-admin -o yaml

我们能看出它是 Kubernetes 内置的超级权限角色,其中rules部分均为通配符,表明该角色对所有 API 组的所有资源具有所有操作权限,即为管理员提供对集群所有资源的完全控制。
具体操作
1.将用户与cluster-admin角色相绑定
kubectl create clusterrolebinding admin-access --clusterrole=cluster-admin --user=apiinvoker

2.创建serviceaccount
#serviceaccount 后接名称
kubectl create serviceaccount apiinvoker -n kube-system

2.将serviceaccount绑定到cluster-admin
kubectl create clusterrolebinding admin-sa-binding --clusterrole=cluster-admin --serviceaccount=kube-system:apiinvoker

3.创建Token
分为临时的(选择一)以及永久的(选择二)两种方式。
选择一
下述代码能直接生成并显示token,但是该方式的token是存在有效期的。
# 需要设置有效期 添加参数--duration 其他参数使用指令kubectl -n kube-system create token --help查看
kubectl -n kube-system create token apiinvoker
选择二
要创建永久有效的Token需要使用Secret方式
在创建serviceaccount之后为其手动创建Secret,并将其与serviceaccount绑定。
1. 创建apiinvoker-token.yaml
apiVersion: v1
kind: Secret
metadata:name: apiinvoker-tokennamespace: kube-systemannotations:kubernetes.io/service-account.name: "apiinvoker" # 绑定到服务账户 改成你自定义的serviceaccount
type: kubernetes.io/service-account-token
2. 运行yaml文件
kubectl apply -f apiinvoker-token.yaml
4.获取serviceaccount的Token
kubectl -n kube-system describe secret apiinvoker-token

这样就能在Java client使用这个token进行API的调用了。
5.编写Java程序代码示例
在pom中添加依赖:
<dependency><groupId>io.kubernetes</groupId><artifactId>client-java</artifactId><version>20.0.0</version> <!-- 请根据需要选择合适的版本 --></dependency>
运行如下示例代码:
package com.yang.collector;import io.kubernetes.client.openapi.ApiClient;
import io.kubernetes.client.openapi.Configuration;
import io.kubernetes.client.openapi.apis.CoreV1Api;
import io.kubernetes.client.openapi.models.V1NamespaceList;
import io.kubernetes.client.openapi.models.V1PodList;import java.io.IOException;public class K8SAPITest {public static void main(String[] args) {try {ApiClient client = new ApiClient();client.setBasePath("https://k8s-master IP:6443"); // 集群的 API 地址client.setApiKey("Bearer "+"生成的Token");
// client.setDebugging(true);client.setVerifyingSsl(false);Configuration.setDefaultApiClient(client);// 将配置设置为默认的 API 客户端io.kubernetes.client.openapi.Configuration.setDefaultApiClient(client);// 创建 CoreV1Api 实例CoreV1Api api = new CoreV1Api();// 获取所有命名空间中的 Pod 列表CoreV1Api.APIlistPodForAllNamespacesRequest list = api.listPodForAllNamespaces();V1PodList execute = list.execute();// 遍历并打印每个 Pod 的信息execute.getItems().forEach(v1Pod -> {System.out.println(v1Pod.toJson());});} catch (Exception e) {e.printStackTrace();}}
}
结果如下:

说明调用成功,克服权限验证问题。
注:当然在实际的生产环境中不建议直接将 超级权限(如 cluster-admin) 交给 Java 程序(或任何外部程序)。这样做存在高安全风险,可能导致集群被误操作或恶意利用。
但是使用 服务账户(ServiceAccount) 的 Token的形式进行细粒度权限控制API的调用是推荐的,本文直接赋值所有资源的所有操作权限十分不可取,仅供学习参考。
推荐方式:在生产环境中,所有权限分配都应该基于实际需求,授予 Java 程序仅需要的权限即可。创建自定义Role或ClusterRole,仅授予程序需要的权限,再通过Rolebinding或ClusterRoleBinding将权限绑定到服务账户,再将此token交给API调用程序。token的使用也不建议永久有效,通过使用kubectl create token动态生成短期 Token,供程序动态获取使用更为安全,避免了长期token的泄露风险。
参考文献
1.Kubernetes K8S之鉴权RBAC详解 - 踏歌行666 - 博客园
2.API 访问控制 | Kubernetes
3.Kubernetes集群组件的安全_手机搜狐网
相关文章:
Java程序调kubernetes(k8s1.30.7)core API简单示例,并解决403权限验证问题,即何进行进行权限授权以及验证
简单记录问题 一、问题描述 希望通过Java程序使用Kubernetes提供的工具包实现对Kubernetes集群core API的调用,但是在高版本上遇见权限验证问题4xx。 <dependency><groupId>io.kubernetes</groupId><artifactId>client-java</artifact…...
java八股-Redis Stream和RocketMQ实现的解决方案
文章目录 Redis Stream方案:ShortLinkStatsSaveProducer.javaShortLinkStatsSaveConsumer.java RocketMQ方案ShortLinkStatsSaveProducer.javaShortLinkStatsSaveConsumer.java Redis Stream方案: ShortLinkStatsSaveProducer.java package com.nageoff…...
第29天 MCU入门
目录 MCU介绍 MCU的组成与作用 电子产品项目开发流程 硬件开发流程 常用元器件初步了解 硬件原理图与PCB板 常见电源符号和名称 电阻 电阻的分类 贴片电阻的封装说明: 色环电阻的计算 贴片电阻阻值计算 上拉电阻与下拉电阻 电容 电容的读数 二极管 LED 灯电路 钳位作…...
【Python网络爬虫笔记】6- 网络爬虫中的Requests库
一、概述 Requests 是一个用 Python 语言编写的、简洁且功能强大的 HTTP 库。它允许开发者方便地发送各种 HTTP 请求,如 GET、POST、PUT、DELETE 等,并且可以轻松地处理请求的响应。这个库在 Python 生态系统中被广泛使用,无论是简单的网页数…...
Linux网络_网络协议_网络传输_网络字节序
一.协议 1.概念 协议(Protocol) 是一组规则和约定,用于定义计算机网络中不同设备之间如何进行通信和数据交换。协议规定了数据的格式、传输方式、传输顺序等详细规则,确保不同设备和系统能够有效地互联互通。 在网络通信中&#…...
浅谈网络 | 应用层之流媒体与P2P协议
目录 流媒体名词系列视频的本质视频压缩编码过程如何在直播中看到帅哥美女?RTMP 协议 P2PP2P 文件下载种子文件 (.torrent)去中心化网络(DHT)哈希值与 DHT 网络DHT 网络是如何查找 流媒体 直播系统组成与协议 近几年直播比较火,…...
css vue vxe-text-ellipsis table 实现多行文本超出隐藏省略
分享 vxe-text-ellipsis table grid 多行文本溢出省略的用法 正常情况下如果需要使用文本超出隐藏,通过 css 就可以完成 overflow: hidden; text-overflow: ellipsis; white-space: nowrap;但是如果需要实现多行文本溢出,就很难实现里,谷歌…...
基于hexo框架的博客搭建流程
这篇博文讲一讲hexo博客的搭建及文章管理,也算是我对于暑假的一个交代 !!!注意:下面的操作是基于你已经安装了node.js和git的前提下进行的,并且拥有github账号 创建一个blog目录 在磁盘任意位置创建一个…...
数据结构-简单排序
一.前提 二.冒泡排序 三.插入排序 #include<iostream> using namespace std; typedef int ElemengType; void Bubble_Sort(ElemengType A[], int N) {for (int p N - 1; p > 0; p--) {int flag 0;for (int i 0; i < p; i) {if (A[i] > A[i 1]) {swap(A[i], …...
三十一:HTTP多种重定向跳转方式的差异
在现代网站开发中,HTTP 重定向是一种常见的技术,用于将用户的请求从一个 URL 跳转到另一个 URL。重定向机制广泛应用于网站迁移、SEO 优化、以及内容管理系统中。不同的 HTTP 状态码代表不同的重定向方式,每种方式的行为和适用场景各有不同。…...
利用Python爬虫精准获取淘宝商品详情的深度解析
在数字化时代,数据的价值日益凸显,尤其是在电子商务领域。淘宝作为中国最大的电商平台之一,拥有海量的商品数据,对于研究市场趋势、分析消费者行为等具有重要意义。本文将详细介绍如何使用Python编写爬虫程序,精准获取…...
架构师的英文:Architect
中文版 软件架构师 的英文是 “Software Architect”。 Software: 软件Architect: 架构师,通常指的是设计和规划某种系统或结构的人。 Software Architect 通常负责软件系统的整体设计、技术选型、架构规划,确保系统的可扩展性、可维护性和高效性等。…...
数据结构 ——— 计数排序算法的实现
目录 计数排序算法的思想 计数排序算法的实现 计数排序算法的思想 遍历数组,找出数组中的最大值 max 和 最小值 min 最大值 max 减去最小值 min 再加 1 得出数组元素的范围 range 利用 range 的大小 malloc 一个 count 数组用来计数 再对 count 数组进行初始化…...
k8s搭建Istio环境,案例pod一直处在Init:CrashLoopBackOff
1 部署calico网络环境,网上去找k8s版本对应的calico的配置文件,k8s2.8.0我用的3.28 2 安装istio环境 curl -L https://istio.io/downloadIstio | sh - # 省略istioctl生效的步骤 source <(istioctl completion zsh) istioctl install --set profile…...
Jenkins升级到最新版本后无法启动
1. 场景还原 最近在web界面将jenkins升级到最新版本后,后台无法启动jenkins服务,服务状态如下: 运行jenkins命令提示invalid Java version jenkins --version jenkins: invalid Java version: java version "1.8.0_202" Java(TM)…...
用户界面创建一个新的运动类型
● 现在我们需要根据我们之前规划的架构步骤来实现在用户界面创建一个运动类型 ● 首先我们在要获取用户在表单中输入的数据 //从表单中获取数据const type inputType.value;const distance inputDistance.value;const duration inputDuration.value;● 然后针对与不同的运动…...
ubuntu防火墙入门(一)——设置服务、关闭端口
本机想通过git clone gitgithub.com:skumra/robotic-grasping.git下载代码,firewall-config中需要为当前区域的防火墙开启SSH服务吗 是的,如果你想通过 git clone gitgithub.com:skumra/robotic-grasping.git 使用 SSH 协议从 GitHub 下载代码࿰…...
分治算法——二分查找(c++)(详解)
大家好,今天进入一个实用算法:分治算法。 1.分治算法介绍 分治算法,大概就是将一个大问题拆解成若干个小问题,将小问题一一解决,大问题也就迎刃而解。它包含了多种算法,比如递归、递推等。这里就讲解一下其…...
Binder架构
一、架构 如上图,binder 分为用户层和驱动层两部分,用户层有客户端(Client)、服务端(Server)、服务管理(ServiceManager)。 从用户空间的角度,使用步骤如下(…...
大数据治理:解锁数据价值,引领未来创新
目录 引言 一、大数据治理的定义 二、大数据治理的重要性 三、大数据治理的核心组件 四、大数据治理的实践案例 1. 数据标准化 2. 数据质量管理 案例一:医疗行业的大数据治理——智能医疗助手守护健康 引言 在数字化时代,数据已成为企业最宝贵的…...
HY-Motion 1.0保姆级教程:解决CUDA OOM、Prompt截断等常见问题
HY-Motion 1.0保姆级教程:解决CUDA OOM、Prompt截断等常见问题 1. 前言:为什么需要这篇教程 你是不是也遇到过这样的情况:好不容易下载了HY-Motion 1.0这个强大的3D动作生成模型,准备大展身手,结果一运行就遇到CUDA内…...
w3x2lni:魔兽地图跨版本转换的技术架构与实战指南
w3x2lni:魔兽地图跨版本转换的技术架构与实战指南 【免费下载链接】w3x2lni 魔兽地图格式转换工具 项目地址: https://gitcode.com/gh_mirrors/w3/w3x2lni 一、价值定位:破解魔兽地图版本兼容难题 魔兽争霸III地图开发者长期面临版本碎片化挑战&…...
基于imfindcircles函数的圆形检测实战:从原理到MATLAB实现
1. 霍夫变换与圆形检测原理 第一次接触圆形检测时,我也被各种数学公式绕得头晕。直到把霍夫变换想象成"投票游戏",才真正理解它的精妙之处。想象一张布满黑白点的图纸,每个黑点都可能属于某个潜在的圆。霍夫变换就像让每个黑点为所…...
跨境服务数字化转型 JAVA 国际版打手俱乐部陪玩系统完整开发教程
以下是基于JAVA开发国际版打手俱乐部陪玩系统的完整开发教程,涵盖技术选型、核心功能实现、安全合规及部署方案:一、技术选型与架构设计后端框架:Spring Boot 3.2 Spring Cloud Alibaba:提供微服务拆分能力,支持Nacos…...
无公网IP解决方案:OpenClaw+nanobot内网穿透配置
无公网IP解决方案:OpenClawnanobot内网穿透配置 1. 为什么需要内网穿透? 去年我在尝试将OpenClaw接入家庭NAS时遇到了一个典型问题:没有公网IP。这意味着我无法在外网直接访问部署在家里的nanobot服务。经过多次尝试,最终通过内…...
智能客服体验问题诊断:从技术架构到优化实践
智能客服体验问题诊断:从技术架构到优化实践 智能客服作为企业与用户交互的重要窗口,其体验好坏直接影响用户满意度和业务转化率。一个响应迟钝、答非所问的客服机器人,不仅无法解决问题,反而会加剧用户的不满。本文将从一个开发者…...
脑皮层房地产:公司在我的神经突触建数据中心
在数字时代的浪潮中,一个颠覆性的概念正在兴起:企业将数据中心直接构建于人类神经突触之上,仿佛一场“脑皮层房地产”的革命。这并非科幻小说的臆想,而是对现代分布式系统和人工智能架构的深刻隐喻。对于软件测试从业者而言&#…...
ESP32 IDF环境下DHT11温湿度读取避坑指南:从时序图到数据拼接的完整解析
ESP32 IDF环境下DHT11温湿度读取避坑指南:从时序图到数据拼接的完整解析 在物联网设备开发中,温湿度传感器是最基础也最常用的环境感知元件之一。DHT11作为一款低成本、单总线数字输出的温湿度传感器,被广泛应用于各类嵌入式项目中。然而&…...
如何在3个步骤内完成Logisim-Evolution数字电路设计工具的安装配置
如何在3个步骤内完成Logisim-Evolution数字电路设计工具的安装配置 【免费下载链接】logisim-evolution Digital logic design tool and simulator 项目地址: https://gitcode.com/gh_mirrors/lo/logisim-evolution Logisim-Evolution是一款功能强大的数字逻辑电路设计和…...
JEECG Boot项目实战:如何优雅地移除登录验证码(前后端完整操作指南)
JEECG Boot项目实战:如何优雅地移除登录验证码(前后端完整操作指南) 在JEECG Boot的开发过程中,验证码功能虽然能有效防止恶意登录,但在某些特定场景下反而会成为效率瓶颈。想象一下这样的场景:开发团队正在…...
