写点什么

Kubernetes 官方 java 客户端之三:外部应用

作者:程序员欣宸
  • 2022 年 4 月 01 日
  • 本文字数:2894 字

    阅读完需:约 9 分钟

Kubernetes官方java客户端之三:外部应用

欢迎访问我的 GitHub

> 这里分类和汇总了欣宸的全部原创(含配套源码):[https://github.com/zq2599/blog_demos](https://github.com/zq2599/blog_demos)

概览

1. 以下提到的 java 客户端都是指 client-jar.jar

2. 本文是《Kubernetes 官方 java 客户端》系列的第三篇,《Kubernetes官方java客户端:准备》一文中咱们为实战做好了准备工作,从本文开始进入实战阶段;

3. 本文的目标是开发名为 OutsideclusterApplication 的 SpringBoot 应用,该应用没有部署在 K8S 环境,使用的 config 文件是手动从 K8S 环境复制过来的,java 客户端通过此 config 文件,能够远程访问到 K8S 上的 API Server,实现所有客户端功能,整体部署情况如下图:


- 介绍完毕,开始编码;

源码下载

如果您不想编码,可以在 GitHub 下载所有源码,地址和链接信息如下表所示(https://github.com/zq2599/blog_demos)


  • 这个 git 项目中有多个文件夹,本章的应用在 kubernetesclient 文件夹下,如下图红框所示:

部署在 K8S 之外的应用:OutsideclusterApplication

  • 名为 OutsideclusterApplication 的应用并未部署在 K8S 环境,该应用能够访问到 K8S 环境的关键,就是将 K8S 环境的 config 文件复制一份,然后放在 OutsideclusterApplication 能够访问到的位置:


  • 登录 K8S 环境,在~/.kube 目录下找到 config 文件,复制此文件到 OutsideclusterApplication 运行的机器上(我这里存放的路径是/Users/zhaoqin/temp/202007/05/,和后面的代码中一致);

  • 打开《Kubernetes官方java客户端:准备》中创建的 kubernetesclient 工程,在里面创建子工程,名为 OutsideclusterApplication,这是个 SpringBoot 工程,pom.xml 内容如下:

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">    <modelVersion>4.0.0</modelVersion>
<parent> <groupId>com.bolingcavalry</groupId> <artifactId>kubernetesclient</artifactId> <version>1.0-SNAPSHOT</version> <relativePath>../pom.xml</relativePath> </parent>
<groupId>com.bolingcavalry</groupId> <artifactId>outsidecluster</artifactId> <version>0.0.1-SNAPSHOT</version> <name>outsidecluster</name> <description>Demo project for Spring Boot</description> <packaging>jar</packaging>
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-json</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>io.kubernetes</groupId> <artifactId>client-java</artifactId> </dependency> </dependencies>
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.3.0.RELEASE</version> </plugin> </plugins> </build>
</project>
复制代码


  • 上述 pom.xml 中,需要注意的是在依赖 spring-boot-starter-web 的时候,使用 exclusion 语法排除了 spring-boot-starter-json 的依赖,这样做是为了将 jackson 的依赖全部去掉(spring-boot-starter-json 依赖了 jackson),如此一来整个 classpath 下面就没有了 jackson 库,此时 SpringBoot 框架就会使用 gson 作为序列化和反序列化工具(client-java.jar 依赖了 gson 库);(这个问题在《Kubernetes官方java客户端之二:序列化和反序列化问题》一文有详细介绍)

  • 新增 OutsideclusterApplication.java,简单起见,该类即是引导类又是 Controller:

package com.bolingcavalry.outsidecluster;
import com.google.gson.GsonBuilder;import io.kubernetes.client.openapi.ApiClient;import io.kubernetes.client.openapi.Configuration;import io.kubernetes.client.openapi.apis.CoreV1Api;import io.kubernetes.client.openapi.models.V1PodList;import io.kubernetes.client.util.ClientBuilder;import io.kubernetes.client.util.KubeConfig;import lombok.extern.slf4j.Slf4j;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;
import java.io.FileReader;
@SpringBootApplication@RestController@Slf4jpublic class OutsideclusterApplication {
public static void main(String[] args) { SpringApplication.run(OutsideclusterApplication.class, args); }
@RequestMapping(value = "/hello") public V1PodList hello() throws Exception { // 存放K8S的config文件的全路径 String kubeConfigPath = "/Users/zhaoqin/temp/202007/05/config";
// 以config作为入参创建的client对象,可以访问到K8S的API Server ApiClient client = ClientBuilder .kubeconfig(KubeConfig.loadKubeConfig(new FileReader(kubeConfigPath))) .build();
Configuration.setDefaultApiClient(client);
CoreV1Api api = new CoreV1Api();
// 调用客户端API取得所有pod信息 V1PodList v1PodList = api.listPodForAllNamespaces(null, null, null, null, null, null, null, null, null);
// 使用jackson将集合对象序列化成JSON,在日志中打印出来 log.info("pod info \n{}", new GsonBuilder().setPrettyPrinting().create().toJson(v1PodList));
return v1PodList; }
}
复制代码


  • 运行上述代码,在浏览器访问 http://localhost:8080/hello ,即可取得 K8S 所有 pod 的详情,如下所示(为了让返回数据更加整齐美观,我用的是 Firefox 浏览器):


  • 查看控制台,可见日志也将详情打印出来:


  • - 至此,咱们的第一个使用 K8S 官方 java 客户端的应用就完成了,接下来的实战会尝试将应用部署在 K8S 环境内,在 K8S 内部进行各项操作;


欢迎关注 InfoQ:程序员欣宸

[学习路上,你不孤单,欣宸原创一路相伴...](https://www.infoq.cn/profile/42B106DFEF790F/publish)


发布于: 刚刚阅读数: 2
用户头像

搜索"程序员欣宸",一起畅游Java宇宙 2018.04.19 加入

前腾讯、前阿里员工,从事Java后台工作,对Docker和Kubernetes充满热爱,所有文章均为作者原创,个人Github:https://github.com/zq2599/blog_demos

评论

发布
暂无评论
Kubernetes官方java客户端之三:外部应用_Kubernetes_程序员欣宸_InfoQ写作平台