目标:完成对api server访问服务的开发,获取kubernetes集群当前namespace与nodes
环境: IntelliJ IDEA
步骤:Kubernetes Java API简介->Gradle项目构建->API调用服务编写->Swagger组件配置->Controller服务编写->运行测试
1.Kubernetes Java API简介
REST架构是针对Web应用而设计的,基于HTTP,目的是降低开发复杂性、提高系统可伸缩性,有如下5条准则:
(1)Resource:网络上的所有事物都被抽象为资源
(2)Resource Identifier:每个资源对应一个唯一的资源标识符
(3)Generic Connector Interface:通过通用的连接器接口对资源进行操作
(4)对资源的各种操作不会改变资源标识符
(5)Stateless:所有的操作都是无状态的
Kubernetes API定义与实现符合标准的HTTP REST格式,是kubernetes集群中的重要组成部分。kubernetes中各种资源的数据通过API接口提交到后端持久化存储Etcd。
kubectl工具也通过API接口实现管理功能。
在Master节点上执行:curl http://127.0.0.1:8080
Kubernetes有两个基于Java语言开发的开源项目:
(1)Jersey
(2)Fabric8
本项目使用Fabric8框架,因其对kubernetes api的封装度较高,容易实现。
主要引用的3个jar包:kubernetes-client、kubernetes-api、kubernetes-model。
2.Gradle项目构建
新建gradle项目,项目结构如下:
修改配置文件build.gradle,引入相关依赖:
buildscript { ext { springBootVersion = '2.0.2.RELEASE' } repositories { mavenCentral() } dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") } } apply plugin: 'java' apply plugin: 'eclipse' apply plugin: 'org.springframework.boot' apply plugin: 'io.spring.dependency-management' group = 'com.boe.cloud' version = '0.0.1-SNAPSHOT' sourceCompatibility = 1.8 repositories { mavenCentral() } dependencies { compile('org.springframework.boot:spring-boot-starter-web') compile('io.fabric8:kubernetes-client:3.1.11') compile('io.fabric8:kubernetes-model:2.0.9') compile('io.fabric8:fabric-utils:2.0.46') compile('io.fabric8:kubernetes-api:3.0.8') compile('io.springfox:springfox-swagger2:2.8.0') compile('io.springfox:springfox-swagger-ui:2.8.0') testCompile('org.springframework.boot:spring-boot-starter-test') }
执行gradle build,查看是否成功。
3.API调用服务编写
api调用服务的编写是项目的核心,包括初始化k8s对象,列出命令空间,列出节点3个功能。
package com.boe.cloud.DevK8sApi; import io.fabric8.kubernetes.api.model.NamespaceList; import io.fabric8.kubernetes.api.model.NodeList; import io.fabric8.kubernetes.client.Config; import io.fabric8.kubernetes.client.ConfigBuilder; import io.fabric8.kubernetes.client.DefaultKubernetesClient; import io.fabric8.kubernetes.client.KubernetesClient; public class DevK8sApiService { //k8s api封装库调用 private static KubernetesClient kubernetesClient; private static Config config; //初始化 - 连接k8s api server public static String init(){ String initResult = "Init Failed."; try { config = new ConfigBuilder().withMasterUrl("http://10.80.25.36:8080").build(); kubernetesClient = new DefaultKubernetesClient(config); initResult = "Init Success."; System.out.println("init sucess"); }catch (Exception e){ System.out.println("can't init discovery service"); } return initResult; } //列出当前命名空间 public static NamespaceList listNamespace(){ NamespaceList namespaceList = new NamespaceList(); try { namespaceList = kubernetesClient.namespaces().list(); System.out.println("list sucess"); }catch (Exception e) { System.out.println("list failed"); } return namespaceList; } //列出当前可用节点 public static NodeList listNode(){ NodeList nodeList = new NodeList(); try { nodeList = kubernetesClient.nodes().list(); System.out.println("list sucess"); }catch (Exception e){ System.out.println("list failed"); } return nodeList; } }
其中KubernetesClient与Config为Fabric8中的类。
4.Swagger组件配置
swagger为RESTful API文档,通过HTTP访问方式测试API功能。
package com.boe.cloud.DevK8sApi; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.RequestHandlerSelectors; import springfox.documentation.service.ApiInfo; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spring.web.plugins.Docket; import springfox.documentation.swagger2.annotations.EnableSwagger2; @Configuration @EnableSwagger2 public class DevK8sApiSwagger2 { @Bean public Docket createRestApi() { return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .select() .apis(RequestHandlerSelectors.basePackage("com.boe.cloud.DevK8sApi")) .paths(PathSelectors.any()) .build(); } private ApiInfo apiInfo() { return new ApiInfoBuilder() .title("Spring Boot - Swagger Api File") .description("RESTful API") .termsOfServiceUrl("http://k8sapitest:port/test") .version("1.0") .build(); } }
5.Controller服务编写
controller服务接受外部请求,并调用后端服务,返回处理结果
package com.boe.cloud.DevK8sApi; import io.fabric8.kubernetes.api.model.NamespaceList; import io.fabric8.kubernetes.api.model.NodeList; import io.swagger.annotations.ApiOperation; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping(value = "/test") public class DevK8sApiController { DevK8sApiService devK8sApiService; //k8s api init @ApiOperation(value = "Init", notes = "Init") @RequestMapping(value = "/init", method = RequestMethod.GET) public String initK8s(){ return devK8sApiService.init(); } //k8s namespace list @ApiOperation(value = "ListNamespace", notes = "ListNamespace") @RequestMapping(value = "/listnamespace", method = RequestMethod.GET) public NamespaceList listk8snamespace(){ return devK8sApiService.listNamespace(); } //k8s node list @ApiOperation(value = "ListNode", notes = "ListNode") @RequestMapping(value = "/listnode", method = RequestMethod.GET) public NodeList listk8snode(){ return devK8sApiService.listNode(); } }
6.运行测试
修改application.properties,设置端口为10099
运行程序,访问url:
http://localhost:10099/swagger-ui.html
初始化测试:
namespace:
node:
以上,kubernetes api调用测试完成。