目标:完成对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调用测试完成。