背景

机器学习平台资源管理之前使用的是Mesos+Marathon,随着业务的发展,Mesos+Marathon已经不能满足我们的需求,所以需要使用K8s取代Mesos+Marathon。Alpha管理平台需要实现对K8s集群的操作。

Alpha管理平台基于Spring Boot开发,需要集成Fabric8来实现对K8s集群的操作。本文介绍两种Fabric8操作Kubernetes集群的方法,分别是【证书访问】和【kubeconfig访问】。不多说了,直接开始动手写代码。

POM依赖

io.fabric8

kubernetes-client

4.2.0

一、证书访问

1. 配置文件

要初始化Fabric8的KubernetesClient,需要4项配置,分别是:

k8s.url:K8s集群地址

k8s.client-crt:客户端CA证书

k8s.client-key:客户端RSA私钥

k8s.ca-crt:K8s集群CA证书

当然,配置项的名称可以自行定义,这里为了图省事,我就直接使用了kubelet的证书,从下面的配置可以看到,这些证书位于classpath:k8s目录下,即/src/main/resources/k8s。

配置文件位于/src/main/resources/application.properties

# k8s 配置

k8s.url=https://10.103.18.42:6443

k8s.client-crt=classpath:k8s/apiserver-kubelet-client.crt

k8s.client-key=classpath:k8s/apiserver-kubelet-client.key

k8s.ca-crt=classpath:k8s/ca.crt

2. 自动配置

通过Spring Boot的AutoConfiguration机制自动加载相关配置。

首先定义K8sProperties内部类,并通过@ConfigurationProperties("k8s")注解,指定要绑定的配置项。

从下面的代码可以看到,我将证书和key文件绑定为Resource对象,而不是绑定为String直接获取文件路径,是因为Spring Boot发布成jar包后,无法通过路径获取classpath下的自定义文件,而通过绑定为Resource则可以直接获取到InputStream从而读取文件内容。

import lombok.Data;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.boot.context.properties.ConfigurationProperties;

import org.springframework.boot.context.properties.EnableConfigurationProperties;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.core.io.Resource;

import java.util.Map;

@Configuration

@EnableConfigurationProperties(K8sConfig.K8sProperties.class)

public class K8sConfig {

/**

* K8s properties

*/

@Autowired

private K8sProperties k8sProperties;

@Data

@ConfigurationProperties("k8s")

public static class K8sProperties {

private String url;

// 注意用 Resource

@Value("client-crt")

private Resource clientCrt;

@Value("client-key")

private Resource clientKey;

@Value("ca-crt")

private Resource caCrt;

}

@Bean

public K8sUtils k8sUtils() {

if (k8sProperties == null) {

return null;

}

final String url = k8sProperties.getUrl();

if(StringUtils.isEmpty(url)){

return null;

}

return new K8sUtils(k8sProperties);

}

}

3. 初始化KubernetesClient

如果你发布Spring Boot项目不是使用jar包形式,建议你使用withXxxFile方法,传入文件绝对路径,让Fabric8自动读取证书和key文件。

否则建议你使用withXxxData方法,直接传入文件内容。

这里有两处需要特别注意:

读取到client-crt文件内容后,需要先用 Base64 加密,否则会提示:input null。通过简单分析Fabric8,是因为Fabric8会先将ClientCertData通过 Base64 解密。

此处需要显式地通过.withNamespace(null)将Namespace设为null,因为Fabric8在初始化Config时,会默认从环境变量从读取当前Namespace,如果你的服务也部署在K8s集群内,就会提示:kubernetesclientexception: namespace mismatch.。

@Slf4j

public class K8sUtils {

private KubernetesClient client;

private Config config;

public K8sUtils(K8sConfig.K8sProperties k8sProperties){

try {

final String k8sUrl = k8sProperties.getUrl();

log.info("k8sUrl : {}", k8sUrl);

if(k8sUrl.startsWith(HTTPS_PREFIX)) {

final String caCrtData = IOUtils.toString(k8sProperties.getCaCrt().getInputStream());

final String clientKeyData = IOUtils.toString(k8sProperties.getClientKey().getInputStream());

// 注意:此处必须先用 Base64 对证书内容加密,否则会提示 input null

final String clientCrtData = Base64.getEncoder().encodeToString(IOUtils.toByteArray(k8sProperties.getClientCrt().getInputStream()));

log.info("caCrtFile data: {} ", caCrtData);

log.info("clientKeyFile data: {} ", clientKeyData);

log.info("clientCrtFile data: {} ", clientCrtData);

config = new ConfigBuilder().withMasterUrl(k8sUrl)

.withTrustCerts(true)

.withCaCertData(caCrtData)

.withClientCertData(clientCrtData)

.withClientKeyData(clientKeyData)

// 需将 Namespace 初始化为 null

.withNamespace(null)

.build();

}else {

config = new ConfigBuilder().withMasterUrl(k8sUrl).build();

}

client = new DefaultKubernetesClient(config);

}catch (Exception e){

client = null;

log.error("初始化 K8sUtils 失败!", e);

}

}

public KubernetesClient getClient() {

return client;

}

public Config getConfig(){

return config;

}

}

二、kubeconfig访问(推荐)

但有时候因为未知原因,使用证书访问时,在初始化KubernetesClient时会提示”java.io.IOException: PEM is invalid: no begin marker “,这个问题我在网上没有查到解决方案。

这时,就可以使用kubeconfig访问K8s集群。

kubeconfig文件默认路径是/etc/kubernetes/admin.conf

通过kubeconfig与通过证书访问基本相同,只是配置和初始化过程略有差异,具体修改如下文所示:

1.配置文件

与证书访问基本相同。

# k8s 配置

k8s.admin-conf=classpath:k8s/admin.conf

2. 自动化配置

@Data

@ConfigurationProperties("k8s")

public static class K8sProperties {

private String url;

@Value("admin-conf")

private Resource adminConf;

}

3. 初始化KubernetesClient

public K8sUtils(K8sConfig.K8sProperties k8sProperties){

try {

String adminConfData = IOUtils.toString(k8sProperties.getAdminConf().getInputStream());

config = Config.fromKubeconfig(adminConfData);

client = new DefaultKubernetesClient(config);

}catch (Exception e){

client = null;

log.error("初始化 K8sUtils 失败!", e);

}

}

java mesos kubernete_Fabric8操作Kubernetes(一)相关推荐

  1. Java api 操作 kubernetes

    文章目录 Java api 操作 kubernetes 一.api接口访问方式 授权方式 不授权方式 二.Java api 操作 k8s k8s初始化 创建命名空间 创建Deployment应用 创建 ...

  2. 用 Java 开发自己的 Kubernetes 控制器,想试试吗?

    作者 | Nicolas Fränkel 译者 | 天道酬勤,责编 | 徐威龙 封图 | CSDN 下载于视觉中国 在本文中,我们将开始开发自己的Kubernetes控制器. 技术栈可以是Python ...

  3. 从 OpenStack 到 Mesos 再到 Kubernetes, 携程容器云自动化运维平台实践\n

    随着虚拟化技术和云计算技术的普及,IT互联网基础设施发生了很大的变化,底层的计算.存储.网络等资源也越来越复杂,需要有平台能管理好这些资源,尽量将工作流程自动化,将运维人员从繁重的手动工作中解救出来. ...

  4. Java 使用itextPdf7操作pdf,写入照片这一篇就够了

    Java 使用itextPdf7操作pdf,写入照片这一篇就够了 1. 效果图 1.1 M*N列图片(无边界&有边界) 1.2 图片重叠 1.3 文字背景图片 1.4 图片与文字相邻 & ...

  5. job for nginx.service failed_用Python操作Kubernetes的Job

    关于Kubernetes的Python SDK,几乎只有官方项目的examples.关于Job的基本增删改查操作,可以参考job_crud.py.但是,这只是基本用法,缺乏一些实用细节. 本文给出Py ...

  6. Java使用Jdbc操作MySql数据库(一)

    这个示例是Java操作MySql的基本方法. 在这个示例之前,要安装好MySql,并且配置好账户密码,创建一个logininfo数据库,在数据库中创建userinfo数据表.并且在表中添加示例数据. ...

  7. java 字节数组 操作_Java-固定字节数组对象

    我需要通过TCP / socket连接到第三方系统并检索一些数据. 将要发送的数据格式为固定长度格式和二进制. 请求示例: short MessageID = 5; int TransactionTr ...

  8. Java数组常见操作

    Java数组常见操作 文章目录 Java数组常见操作 7.0 数组的遍历 1.使用foreach循环访问数组中每个元素. 2.使用简单的for循环(多层循环嵌套)来遍历数组. 7.1 数组长度 7.2 ...

  9. 使用 KubernetesClient 操作 kubernetes

    使用 KubernetesClient 操作 kubernetes Intro 我们的应用都是部署在 Kubernetes 上的,我们有一个服务内部有一层 MemoryCache,之前会依赖 Redi ...

最新文章

  1. python基础算法-归并排序
  2. Linux配置keepalived实现nginx高可用安装过程记录
  3. boost::stl_interfaces模块实现互操作性的测试程序
  4. uniapp快查页面链接
  5. 享元模式 Composite
  6. wps怎么投递简历发到boss直聘_央视新闻联合BOSS直聘带“岗”年薪超82亿元
  7. Netty工作笔记0035---Reactor模式图剖析
  8. 6章:常用工具类以及函数
  9. FFmpeg之获取音视频信息(二十八)
  10. Ubuntu 16.04通过源码安装QUEM虚拟机
  11. elkan K-Means
  12. 给cad文件加密的软件,CAD文件加密软件哪个好用
  13. Ubuntu 18.04安装i686-elf交叉编译工具链的方法
  14. windows10如何查看电池损耗
  15. 运用帝国CMS建站仿站的简单教程(初学者进)
  16. 未来虚拟经济的雏形,SecondLife,全新的概念。。。
  17. 云服务器无法访问解决办法
  18. linux命令学习一 :touch和mkdir 创建文件和文件夹
  19. Mysql 查询锁表指令速查
  20. 英文经典欣赏:飞鸟集

热门文章

  1. 人工智能实现a*算法解决八数码_小白带你学回溯算法
  2. 寄存器、cache、内存、硬盘之间的千丝万缕
  3. javascript / DOM、BOM、document、window 区别和联系
  4. 用git从github网站上下载代码的方法
  5. python爬虫如何连接数据库_手把手教你如何在Navicat中如何新建连接数据库及相关报错解决方法...
  6. 直播报名 | 超低延时直播架构解析
  7. 生成网页没有标题_网页设计公司有哪些?用这个快速建站!
  8. js锚点定位_overflow属性详解,利用CSS实现锚点定位
  9. python实现排序算法_python实现·十大排序算法之插入排序(Insertion Sort)
  10. python 测试用例怎么输入两个_python selenium多个测试用例