kubernetes api微服务开发--访问api server

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


猜你喜欢

转载自blog.csdn.net/xingyuzhe/article/details/80564441