java操作k8s原生api

java操作k8s-Api(fabric8)

k8s资源文件路径

默认k8s的配置文件在/etc/kubernetes目录下

k8s maven依赖

XML 复制代码
<dependency>
     <groupId>io.fabric8</groupId>
     <artifactId>kubernetes-client</artifactId>
     <version>6.10.0</version>
</dependency>

访问k8s-api的几种方式

通过配置文件访问

java 复制代码
 //可以放在resource下,通过配置获取admin.conf
 Resource adminConf = k8sInfoConfig.getAdminConf();
 String adminConfStr = IOUtils.toString(adminConf.getInputStream());
 Config config = Config.fromKubeconfig(adminConfStr);
 //sourceK8s.getApiServer() 获取的是k8s地址端口,默认为ip:6443端口
 config.setMasterUrl(sourceK8s.getApiServer());
 KubernetesClient client = new DefaultKubernetesClient(config);

通过证书访问

证书包括三点: certificate-authority-data、client-certificate-data、 client-key-data。

withCaCertData: certificate-authority-data

withClientCertData: client-certificate-data

withClientKeyData: client-key-data

java 复制代码
ConfigBuilder builder = new ConfigBuilder();
builder.withMasterUrl(sourceK8s.getApiServer());
//客户端访问需要证书,此三项参数不可缺少
builder.withCaCertData(sourceK8s.getCaCertData());
builder.withClientCertData(sourceK8s.getClientCertData());
builder.withClientKeyData(sourceK8s.getClientKeyData());
Config config = builder.build();
KubernetesClient client = new DefaultKubernetesClient(config);

如果证书访问被拒绝,因为令牌被再次进行了加密,第一次时可以拿到加密前的令牌,后面就拿不到了,需要问问运维哦

java访问k8s报错

通过(serviceAccount)sa-token访问

pod在启动时,每个pod都会分配一个serviceAccount,如果没有配置,则分配default的serviceAccount。(这里我只启动了一个deployment绑定了serviceAccount获取到了token,就能够访问k8s了)

默认default用户没有权限访问deployment等权限。所以新建serviceAccount,创建用户绑定cluster-admin(可换,具体有哪些用户百度一下)权限。

以下执行:kubectl apply -f xxx.yaml

powershell 复制代码
apiVersion: v1
kind: ServiceAccount
metadata:
  name: kubepi-user
  namespace: spas

用户角色权限绑定

powershell 复制代码
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: kubepi-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
  - kind: ServiceAccount
    name: kubepi-user
    namespace: spas

其中spas为集群存在namespace。

创建deployment(pod)绑定serviceAccount:

获取token,mtac-c59b65fd6-ncd9j为pod名称,默认是在/run/secrets/kubernetes.io/serviceaccount/token,可以看看官网。

powershell 复制代码
kubectl -n spas exec -it mtac-c59b65fd6-ncd9j  -- cat /run/secrets/kubernetes.io/serviceaccount/token

获取token后:

java 复制代码
String tokenStr = k8sInfoConfig.getTokenStr();//这就是获取到的token,替换一下
Config build = new ConfigBuilder().withMasterUrl(sourceK8s.getApiServer()).withTrustCerts(true).withOauthToken(tokenStr).build();
KubernetesClient client = new DefaultKubernetesClient(build);
相关推荐
没有bug.的程序员1 小时前
Serverless 弹性扩容引发的全线熔断:Spring Boot 启动耗时从 1s 压缩至 0.3s 的物理级绞杀
java·spring boot·kubernetes·serverless·扩容·线上
bearpping1 小时前
java进阶知识点
java·开发语言
独自破碎E1 小时前
【面试真题拆解】你知道ThreadLocal是什么吗
java·jvm·面试
kkkkatoq1 小时前
JAVA中的IO操作
java·开发语言
深蓝轨迹1 小时前
@Autowired与@Resource:Spring依赖注入注解核心差异剖析
java·python·spring·注解
不想看见4041 小时前
C++八股文【详细总结】
java·开发语言·c++
huaweichenai2 小时前
java的数据类型介绍
java·开发语言
weisian1512 小时前
Java并发编程--17-阻塞队列BlockingQueue:生产者-消费者模式的最佳实践
java·阻塞队列·blockqueue
奔跑的呱呱牛2 小时前
GeoJSON 在大数据场景下为什么不够用?替代方案分析
java·大数据·servlet·gis·geojson
爱丽_2 小时前
Pinia 状态管理:模块化、持久化与“权限联动”落地
java·前端·spring