Kubernetes官方java客户端之三:外部应用
欢迎访问我的GitHub
https://github.com/zq2599/blog_demos
内容:所有原创文章分类汇总及配套源码,涉及Java、Docker、Kubernetes、DevOPS等;
概览
- 以下提到的java客户端都是指client-jar.jar;
- 本文是《Kubernetes官方java客户端》系列的第三篇,《Kubernetes官方java客户端:准备》一文中咱们为实战做好了准备工作,从本文开始进入实战阶段;
- 本文的目标是开发名为OutsideclusterApplication的SpringBoot应用,该应用没有部署在K8S环境,使用的config文件是手动从K8S环境复制过来的,java客户端通过此config文件,能够远程访问到K8S上的API Server,实现所有客户端功能,整体部署情况如下图:
- 介绍完毕,开始编码;
源码下载
- 如果您不想编码,可以在GitHub下载所有源码,地址和链接信息如下表所示(https://github.com/zq2599/blog_demos):
名称 | 链接 | 备注 |
---|---|---|
项目主页 | https://github.com/zq2599/blog_demos | 该项目在GitHub上的主页 |
git仓库地址(https) | https://github.com/zq2599/blog_demos.git | 该项目源码的仓库地址,https协议 |
git仓库地址(ssh) | git@github.com:zq2599/blog_demos.git | 该项目源码的仓库地址,ssh协议 |
- 这个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
@Slf4j
public 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内部进行各项操作;
你不孤单,欣宸原创一路相伴
欢迎关注公众号:程序员欣宸
微信搜索「程序员欣宸」,我是欣宸,期待与您一同畅游Java世界...
https://github.com/zq2599/blog_demos
Kubernetes官方java客户端之三:外部应用的更多相关文章
- Kubernetes官方java客户端之四:内部应用
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- Kubernetes官方java客户端之八:fluent style
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- Kubernetes官方java客户端之一:准备
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- Kubernetes官方java客户端之二:序列化和反序列化问题
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- Kubernetes官方java客户端之五:proto基本操作
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- Kubernetes官方java客户端之六:OpenAPI基本操作
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- Kubernetes官方java客户端之七:patch操作
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- 缓存系统MemCached的Java客户端优化历程
Memcached 是什么? Memcached是一种集中式Cache,支持分布式横向扩展.这里需要解释说明一下,很多开发者觉得Memcached是一种分布式缓存系统,但是其实Memcached服务端 ...
- 《ElasticSearch6.x实战教程》之简单搜索、Java客户端(上)
第五章-简单搜索 众里寻他千百度 搜索是ES的核心,本节讲解一些基本的简单的搜索. 掌握ES搜索查询的RESTful的API犹如掌握关系型数据库的SQL语句,尽管Java客户端API为我们不需要我们去 ...
随机推荐
- 谈谈传说中的redo log是什么?有啥用?
目录 一.引出 redo log 的作用 二.思考一个问题: 三.redo log block 四.redo log buffer 五.redo log的刷盘时机 六.推荐参数 七.redo log ...
- 深入浅出让你理解什么是LLVM
什么是LLVM 转载自https://www.jianshu.com/p/1367dad95445 LLVM项目是模块化.可重用的编译器以及工具链技术的集合. 美国计算机协会 (ACM) 将其2012 ...
- js已知A,B两点坐标,在线段AB上有C点,已知AC的距离,求C点的坐标
/** * @param {Number} _x1 A点坐标 * @param {Number} _y1 A点坐标 * @param {Number} _x2 B点坐标 * @param {Numbe ...
- 计算机网络——HTTP知识点整理
1.HTTP简介 HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议.它可以使浏览器更加高效,使网络传输减少.它 ...
- Java8新增的这些集合骚操作,你掌握了嘛?
目录 Iterable的forEach Iterator的forEachRemaining Collection的removeIf Stream操作 List的replaceAll List的sort ...
- 【Django 局域网配置】
默认方法启动django python manage.py runserver 这时启动的服务只能在本机访问,这是因为服务只向本机(127.0.0.1:8000)提供,所以局域网的其他机器不能访问. ...
- Taro 3.1 beta 发布: 开放式架构新增 4 端支持
作者:凹凸曼-JJ 自 7 月初我们正式发布了 Taro 3,至今半年时间已然略去.期间我们不断地修复着问题,同时也在构想着下一个 minor 版本. 面对小程序平台越来越多的大环境,Taro 是选择 ...
- Windows脚本转换Liunx识别并执行
1.执行安装: yum install -y dos2unix 插件2.执行 dos2unix test.sh3.赋值权限 chmod +x test.sh
- 其它语言通过HiveServer2访问Hive
先解释一下几个名词: metadata :hive元数据,即hive定义的表名,字段名,类型,分区,用户这些数据.一般存储关系型书库mysql中,在测试阶段也可以用hive内置Derby数据库. me ...
- 第一章: 初始JVM
跟很多人一样,我一开始接触 Java 虚拟机只是因为面试需要用到,所以硬着头皮看看.所以很多人对于为什么要学虚拟机这个问题,他们的答案都是:因为面试. 因为装逼 但我经过了几年的学习和实战,我发现其实 ...