kubernetes Client 使用

news/2025/1/15 23:47:50/

参考连接 github: https://github.com/kubernetes-client/java/

初次使用 : 测试连接

导入kubernetes-client包

 <!--kubernetes--><dependency><groupId>io.kubernetes</groupId><artifactId>client-java</artifactId><version>17.0.0</version></dependency>

由于使用gke(google cloud kubernetes)不好获取kubernetes的配置文件,且程序要在kubernetes集群内运行,所以直接使用examples 中的InClusterClientExample 的例子测试是否连通

//这里默认获取的是程序运行所在命名空间下的default账户
ApiClient client = ClientBuilder.cluster().build();Configuration.setDefaultApiClient(client);// the CoreV1Api loads default api-client from global configuration.
CoreV1Api api = new CoreV1Api();// invokes the CoreV1Api client//这里官方给的例子是listPodForAllNamespaces 
//获取所有命名空间下的pod 但是我的default这里会没有所有命名空间权限
//可以修改为api.listNamespacedPod(),namespace 填写“default”
V1PodList list =
api.listPodForAllNamespaces(null, null, null, null, null, null, null, null, null, null);
for (V1Pod item : list.getItems()) {System.out.println(item.getMetadata().getName());
}

代码来源 : https://github.com/kubernetes-client/java/blob/master/examples/examples-release-15/src/main/java/io/kubernetes/client/examples/InClusterClientExample.java

如上面所述,default缺少很多权限,即使将listPodForAllNamespaces()替换成listNamespacedPod() default服务账号还是会由于缺少pod访问权限 出现ApiException

提示信息如下:

Response body: {"kind":"Status","apiVersion":"v1","metadata":{},"status":"Failure","message":"pods is forbidden: User "system:serviceaccount:default:default" cannot list resource "pods" in API group "" at the cluster scope","reason":"Forbidden","details":{"kind":"pods"},"code":403}

所以现在需要为服务账户 default 授予访问 Pod 资源的权限。使用 Role 和 RoleBinding 对象来授予服务账户所需的权限

编写rbac.yaml

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:name: pod-reader
rules:
- apiGroups: [""]resources: ["pods"]verbs: ["get", "list", "watch"]---apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:name: read-pods
roleRef:apiGroup: rbac.authorization.k8s.iokind: Rolename: pod-reader
subjects:
- kind: ServiceAccountname: defaultnamespace: default

这里创建了一个role对象,拥有pod资源的get,list watch 的权限,并且创建了一个RoleBinding对象将role对象绑定到服务账号default上,从而授予它访问pod资源的权限。

使用kuberctl apply命令:

kubectl apply -f rbac.yaml

就可以通过代码读取default命名空间下的pod信息了。

完成功能 :通过代码创建job

public void createJob(String jobName,String image,List<String> commend,String containName,Map<String,String> nodeSelector,Map<String, Quantity> resourceLimits,Map<String, Quantity> resourceRequests) {ApiClient client = null;try {client = ClientBuilder.cluster().build();} catch (IOException e) {;throw new RuntimeException(e);}Configuration.setDefaultApiClient(client);V1Volume v1Volume = new V1Volume().name(config.getVolumeName()).persistentVolumeClaim(new V1PersistentVolumeClaimVolumeSource().claimName(config.getVolumeName()));V1VolumeMount v1VolumeMount = new V1VolumeMount();v1VolumeMount.setMountPath(config.getVolumeMountPath());v1VolumeMount.setName(config.getVolumeName());V1ResourceRequirements resources = new V1ResourceRequirements().limits(resourceLimits).requests(resourceRequests);V1Job job = new V1Job();job.setMetadata(new V1ObjectMeta().name(jobName));job.setSpec(new V1JobSpec().backoffLimit(1).template(new V1PodTemplateSpec().spec(new V1PodSpec().addVolumesItem(v1Volume).addContainersItem(new V1Container().addVolumeMountsItem(v1VolumeMount).name(containName).image(image).command(commend).resources(resources)).nodeSelector(nodeSelector).restartPolicy("Never"))));try {BatchV1Api batchApi = new BatchV1Api();V1Job createdJob = batchApi.createNamespacedJob("default", job, null, null, null,null);log.info("Created Job: {}" , createdJob.getMetadata().getName());} catch (ApiException e) {log.error("Kubernetes API returned an error:");log.error("Code: {}", e.getCode());log.error("Response body: {}", e.getResponseBody());log.error("Message: {}", e.getMessage());e.printStackTrace();}}

编写授权default服务账号创建job权限的rbac.yaml

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:name: job-creator
rules:
- apiGroups: ["batch"]resources: ["jobs"]verbs: ["create", "delete", "get", "list", "patch", "update", "watch"]---apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:name: create-jobs
roleRef:apiGroup: rbac.authorization.k8s.iokind: Rolename: job-creator
subjects:
- kind: ServiceAccountname: defaultnamespace: default

运行命令 : kubectl apply -f rbac.yaml


http://www.ppmy.cn/news/350211.html

相关文章

如何判断HTTP响应结束(何时可关闭HTTP连接)

如何判断一个HTTP连接的结束&#xff1f; case 1&#xff1a;有Content-Length 依据Content-Length判断接收数据完成&#xff0c;来结束连接。 case2&#xff1a; 请求头带Connection字段 2.1 close 表明客户端或服务器想要关闭该网络连接&#xff0c;这是 HTTP/1.0 请求的…

Nginx访问报错 (123: The filename, directory name, or volume label syntax is incorrect)

Windows上用nginx部署本地nodejs前端项目&#xff0c;一直报错&#xff0c;通过查看日志&#xff0c;找到问题所在并解决掉。 error.log 2022/03/24 09:43:27 [crit] 10204#6208: *1 GetFileAttributesEx() "C: ginx\webapp\test" failed (123: The filename, dire…

Nginx访问异常的解决方法

Nginx访问异常的解决方法 项目场景问题描述原因分析及解决方案 项目场景 项目使用前端Vue后端SpringBoot进行开发&#xff0c;今天试图将前端项目打包部署到本地Windows nginx上进行访问。 问题描述 于是&#xff0c;在nginx配置文件nginx.conf中进行了如下的配置&#xff1a…

IBM System x3650 M3_RAID服务器找不到ctrl+H,要进入阵列卡配置界面(webBIOS)

http://www.hugesky.com/showarticle.php?id6208 加电启动&#xff1a; 按 F1 进入 UEFI 选择“System Settings”-“Adapters and UEFI Drivers” “Please press ENTER to compile the list of drivers”&#xff0c; 然候选择“LSI EFI SAS Driver”下面那一行&#xff0…

【dp】UvaLive 6201 6204 6205 6208

6201 Wedding of Sultan https://icpcarchive.ecs.baylor.edu/index.php?optioncom_onlinejudge&Itemid8&pageshow_problem&problem4212 本题只要想到用Stack做的话&#xff0c;会很简单。如果当前的节点已经入过栈了&#xff0c;则pop出来同时给栈顶元素的值加…

Echarts实现系统监控

效果图 页面代码 <!DOCTYPE html> <html style"height: 100%"><head> <meta charset"utf-8"> <title>Echarts</title> <script type"text/javascript"src"http://echarts.baidu.com/gallery/vendo…

Lambda表达式使用详细讲解

目录 1.新思想 1.1函数式编程思想 1.2.函数式接口 2.通往lambda之路 2.1.什么是lambda表示式&#xff1f; 2.2. lambda表示式有哪些特点&#xff1f; 2.3.lambda表示式使用场景 2.4.lambda表示式语法 2.5.Lambda简化写法 2.6.Lambda表达式结构 3.Stream流 3.1概述 …

UVALive 6208

离散DP 由于状态转移需要记录三维&#xff0c;第三维是之前的高度&#xff0c;而这个变量取值只有离散的几个&#xff0c;故用map来存。 不过一开始一直T啊&#xff0c;最后加些剪枝终于过了。。。 #include <iostream> #include <cstdio> #include <string&g…