当前位置: 首页 > news >正文

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

95bf9d4db0d5495ea5346935549966ec.png

默认开启的是RBAC(基于角色的访问控制)。

各类模式以及下方各类k8s资源的介绍可参见:

Kubernetes K8S之鉴权RBAC详解 - 踏歌行666 - 博客园

二、解决方案

我需要针对集群中相关资源(pods lists)通过Java client进行增删改查操作,那么最直接快速的方式就是创建一个具有集群超级用户权限的用户,并将其对应的Key用于Java client,进行API的访问操作。

Prepare:查看clusterrole

clusterrole是集群范围的角色,用于管理整个集群中的资源。

通过指令

kubectl get clusterroles

查看到集群下有众多的clusterrole

1a37a21bf2904455be6ddf10428f4583.png

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

kubectl get clusterrole cluster-admin -o yaml

d601bcfb99374f58bb8bf06a892cf324.png

我们能看出它是 Kubernetes 内置的超级权限角色,其中rules部分均为通配符,表明该角色对所有 API 组的所有资源具有所有操作权限,即为管理员提供对集群所有资源的完全控制。

具体操作

1.将用户与cluster-admin角色相绑定

kubectl create clusterrolebinding admin-access --clusterrole=cluster-admin --user=apiinvoker

74deac3c235d45a399813ba1cde8bf99.png

2.创建serviceaccount

#serviceaccount 后接名称  
kubectl create serviceaccount apiinvoker -n kube-system

7db1f02757f343febf2f7d1bca54d9c9.png

2.将serviceaccount绑定到cluster-admin

kubectl create clusterrolebinding admin-sa-binding --clusterrole=cluster-admin --serviceaccount=kube-system:apiinvoker

8a24fdbc187441e79977b2d0c59fc65f.png

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

bd67d347f2374d9c965a56531318c620.png

 这样就能在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();}}
}

结果如下:

687fbb44584d40d09c1701470b3cb79e.png

 说明调用成功,克服权限验证问题。

:当然在实际的生产环境中不建议直接将 超级权限(如 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的调用&#xff0c;但是在高版本上遇见权限验证问题4xx。 <dependency><groupId>io.kubernetes</groupId><artifactId>client-java</artifact…...

java八股-Redis Stream和RocketMQ实现的解决方案

文章目录 Redis Stream方案&#xff1a;ShortLinkStatsSaveProducer.javaShortLinkStatsSaveConsumer.java RocketMQ方案ShortLinkStatsSaveProducer.javaShortLinkStatsSaveConsumer.java Redis Stream方案&#xff1a; ShortLinkStatsSaveProducer.java package com.nageoff…...

第29天 MCU入门

目录 MCU介绍 MCU的组成与作用 电子产品项目开发流程 硬件开发流程 常用元器件初步了解 硬件原理图与PCB板 常见电源符号和名称 电阻 电阻的分类 贴片电阻的封装说明&#xff1a; 色环电阻的计算 贴片电阻阻值计算 上拉电阻与下拉电阻 电容 电容的读数 二极管 LED 灯电路 钳位作…...

【Python网络爬虫笔记】6- 网络爬虫中的Requests库

一、概述 Requests 是一个用 Python 语言编写的、简洁且功能强大的 HTTP 库。它允许开发者方便地发送各种 HTTP 请求&#xff0c;如 GET、POST、PUT、DELETE 等&#xff0c;并且可以轻松地处理请求的响应。这个库在 Python 生态系统中被广泛使用&#xff0c;无论是简单的网页数…...

Linux网络_网络协议_网络传输_网络字节序

一.协议 1.概念 协议&#xff08;Protocol&#xff09; 是一组规则和约定&#xff0c;用于定义计算机网络中不同设备之间如何进行通信和数据交换。协议规定了数据的格式、传输方式、传输顺序等详细规则&#xff0c;确保不同设备和系统能够有效地互联互通。 在网络通信中&#…...

浅谈网络 | 应用层之流媒体与P2P协议

目录 流媒体名词系列视频的本质视频压缩编码过程如何在直播中看到帅哥美女&#xff1f;RTMP 协议 P2PP2P 文件下载种子文件 (.torrent)去中心化网络&#xff08;DHT&#xff09;哈希值与 DHT 网络DHT 网络是如何查找 流媒体 直播系统组成与协议 近几年直播比较火&#xff0c;…...

css vue vxe-text-ellipsis table 实现多行文本超出隐藏省略

分享 vxe-text-ellipsis table grid 多行文本溢出省略的用法 正常情况下如果需要使用文本超出隐藏&#xff0c;通过 css 就可以完成 overflow: hidden; text-overflow: ellipsis; white-space: nowrap;但是如果需要实现多行文本溢出&#xff0c;就很难实现里&#xff0c;谷歌…...

基于hexo框架的博客搭建流程

这篇博文讲一讲hexo博客的搭建及文章管理&#xff0c;也算是我对于暑假的一个交代 &#xff01;&#xff01;&#xff01;注意&#xff1a;下面的操作是基于你已经安装了node.js和git的前提下进行的&#xff0c;并且拥有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多种重定向跳转方式的差异

在现代网站开发中&#xff0c;HTTP 重定向是一种常见的技术&#xff0c;用于将用户的请求从一个 URL 跳转到另一个 URL。重定向机制广泛应用于网站迁移、SEO 优化、以及内容管理系统中。不同的 HTTP 状态码代表不同的重定向方式&#xff0c;每种方式的行为和适用场景各有不同。…...

利用Python爬虫精准获取淘宝商品详情的深度解析

在数字化时代&#xff0c;数据的价值日益凸显&#xff0c;尤其是在电子商务领域。淘宝作为中国最大的电商平台之一&#xff0c;拥有海量的商品数据&#xff0c;对于研究市场趋势、分析消费者行为等具有重要意义。本文将详细介绍如何使用Python编写爬虫程序&#xff0c;精准获取…...

架构师的英文:Architect

中文版 软件架构师 的英文是 “Software Architect”。 Software: 软件Architect: 架构师&#xff0c;通常指的是设计和规划某种系统或结构的人。 Software Architect 通常负责软件系统的整体设计、技术选型、架构规划&#xff0c;确保系统的可扩展性、可维护性和高效性等。…...

数据结构 ——— 计数排序算法的实现

目录 计数排序算法的思想 计数排序算法的实现 计数排序算法的思想 遍历数组&#xff0c;找出数组中的最大值 max 和 最小值 min 最大值 max 减去最小值 min 再加 1 得出数组元素的范围 range 利用 range 的大小 malloc 一个 count 数组用来计数 再对 count 数组进行初始化…...

k8s搭建Istio环境,案例pod一直处在Init:CrashLoopBackOff

1 部署calico网络环境&#xff0c;网上去找k8s版本对应的calico的配置文件&#xff0c;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升级到最新版本后&#xff0c;后台无法启动jenkins服务&#xff0c;服务状态如下&#xff1a; 运行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下载代码&#xff0c;firewall-config中需要为当前区域的防火墙开启SSH服务吗 是的&#xff0c;如果你想通过 git clone gitgithub.com:skumra/robotic-grasping.git 使用 SSH 协议从 GitHub 下载代码&#xff0…...

分治算法——二分查找(c++)(详解)

大家好&#xff0c;今天进入一个实用算法&#xff1a;分治算法。 1.分治算法介绍 分治算法&#xff0c;大概就是将一个大问题拆解成若干个小问题&#xff0c;将小问题一一解决&#xff0c;大问题也就迎刃而解。它包含了多种算法&#xff0c;比如递归、递推等。这里就讲解一下其…...

Binder架构

一、架构 如上图&#xff0c;binder 分为用户层和驱动层两部分&#xff0c;用户层有客户端&#xff08;Client&#xff09;、服务端&#xff08;Server&#xff09;、服务管理&#xff08;ServiceManager&#xff09;。 从用户空间的角度&#xff0c;使用步骤如下&#xff08;…...

大数据治理:解锁数据价值,引领未来创新

目录 引言 一、大数据治理的定义 二、大数据治理的重要性 三、大数据治理的核心组件 四、大数据治理的实践案例 1. 数据标准化 2. 数据质量管理 案例一&#xff1a;医疗行业的大数据治理——智能医疗助手守护健康 引言 在数字化时代&#xff0c;数据已成为企业最宝贵的…...

解决windows下php8.x及以上版本,在Apache2.4中无法加载CURL扩展的问题

本文已首发于&#xff1a;秋码记录 若你也想搭建一个个人博客&#xff0c;可参考&#xff1a;国内 gitee.com Pages 下线了&#xff0c;致使众多站长纷纷改用 github、gitlab Pages 托管平台 在日新月异的信息化下&#xff0c;软件也在跟随着互联网的脚步&#xff0c;逐步推进…...

【韩顺平老师Java反射笔记】

反射 文章目录 基本使用反射机制java程序在计算机有三个阶段反射相关的主要类 反射调用优化Class类的常用方法获取Class对象的6种方式哪些类型有Class对象类加载类加载时机类加载过程图 通过反射获取类的结构信息第一组&#xff1a;java.lang.Class类第二组&#xff1a;java.la…...

Arrays.asList()新增报错,该怎么解决

一、前言 在 Java 开发中&#xff0c;Arrays.asList() 是一个常用的工具方法&#xff0c;它允许开发者快速将数组转换为列表。尽管这个方法非常方便&#xff0c;但许多开发者在使用时可能会遭遇一个常见的错误&#xff1a;尝试向由 Arrays.asList() 返回的列表中添加元素时抛出…...

【热门主题】000072 分布式数据库:开启数据管理新纪元

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 【热…...

基于Springboot开发的云野旅游平台

一、功能介绍 云野旅游平台包含管理员、用户两个角色以及前后台系统。 前台系统功能 用户登录成功后&#xff0c;可以进行查看旅游路线、最新线路、旅游资讯、个人中心、后台管理、购物车、客服等功能模块。进行相对应操作。 后台系统功能 管理员或用户登录成功后&#xf…...

2024金盾信安杯线上赛 MISC ezpng[wp]

下载题目发现给了个password和png 图片发现损坏的 password丢随波逐流一键解 base64 给出解码的结果是 cimbar搜索发现在Github有工具 然后对附件中的图片进行小厨房xor 得到一张新图片 利用工具进行跑出答案...

搭建业务的性能优化指南

这是一篇搭建业务优化的心路历程&#xff0c;也是写给搭建业务的性能优化指南。 前言 直到今天&#xff0c;淘内的页面大多都迁移到了 SSR&#xff0c;从我们终端平台 - 搭建研发团队的视角看&#xff0c;业务大致可以分为两类 —— 搭建派 和 源码派。 这两者互不冲突&#xf…...

电脑提示报错“Directx error”怎么解决?是什么原因导致的?游戏软件提示“Directx error”错误的解决方案

DirectX Error&#xff08;DX错误&#xff09;通常指的是在使用基于DirectX技术的应用程序&#xff08;尤其是游戏&#xff09;时遇到的问题。这个问题可能由多种因素导致&#xff0c;以下是一些可能的原因及相应的解决方案&#xff1a; 可能的原因 DirectX版本不匹配&#x…...

Linux——自定义简单shell

shell 自定义shell目标普通命令和内建命令&#xff08;补充&#xff09; shell实现实现原理实现代码 自定义shell 目标 能处理普通命令能处理内建命令要能帮助我们理解内建命令/本地变量/环境变量这些概念理解shell的运行 普通命令和内建命令&#xff08;补充&#xff09; …...

基于matlab程序实现人脸识别

1.人脸识别流程 1.1.1基本原理 基于YCbCr颜色空间的肤色模型进行肤色分割。在YCbCr色彩空间内对肤色进行了建模发现&#xff0c;肤色聚类区域在Cb—Cr子平面上的投影将缩减&#xff0c;与中心区域显著不同。采用这种方法的图像分割已经能够较为精确的将人脸和非人脸分割开来。…...

潍坊大型网站建设/自己开平台怎么弄啊

Java中的位运算符中有一个叫做异或的运算符&#xff0c;符号为(^)或者 Xor异或8个字总结 相同出0 不同出1int a1;int b1;System.out.println(a^b);这里则输出 0int a12;int b0;System.out.println(a^b);这里则输出 12小结&#xff1a; 相同的两个数会输出0既false &#xff0c;…...

js面向对象网站开发/百度推广客户端官方下载

先说一下用于磁盘空间快满时检查 很多小伙伴会想到find &#xff0c;这个想法是好的&#xff0c;不过find 有点慢&#xff0c;也不方便&#xff0c;例如&#xff1a; find /home1 -type f -size 1000000k如果我们这样做呢&#xff1a;duawk组合 显示所有目录及文件大于100M的d…...

深圳短视频关键词搜索排名推广/seo和sem的概念

1 安装说明 1.1 服务器安装必备软件 在使用该工作流软件之前&#xff0c;有以下一些软件是必须安装&#xff1a; l IIS7.0以上版本(必须)&#xff1b; l .Net Framework 4.5(必须)&#xff1b; l Active Directory&#xff08;可选&#xff09;&#xff0c;H3自身…...

做行政关注什么类型的网站/百度指数 移民

Web API使你可以快速轻松地创建HTTP服务。与常规的ASP.Net MVC项目不同&#xff0c;Web API不适用于视图。要使用一种特殊类型的控制器&#xff0c;即返回模型对象的方法。 这种控制器的任务是传输数据&#xff0c;而不是表示。我们来看看如何创建一个提供FastReport报表的简单…...

福安建设厅网站/合肥关键词排名技巧

为什么80%的码农都做不了架构师&#xff1f;>>> 官网&#xff1a;http://hibernate.org/orm/Hiberante对象关系&#xff1a;http://blog.csdn.net/u013806366/article/details/52092735转载于:https://my.oschina.net/zhxm/blog/893701...

哪些网站做企业招聘不要花钱/线上网络推广怎么做

转载请注明出处<http://blog.csdn.net/qianqin_2014/article/details/51277094> 试题&#xff1a; 有这样一道智力题&#xff1a;“某商店规定&#xff1a;三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶&#xff0c;她最多可以换多少瓶汽水喝&#xff1f;”答案是…...