zoukankan      html  css  js  c++  java
  • Kubernetes官方java客户端之三:外部应用

    欢迎访问我的GitHub

    https://github.com/zq2599/blog_demos

    内容:所有原创文章分类汇总及配套源码,涉及Java、Docker、Kubernetes、DevOPS等;

    概览

    1. 以下提到的java客户端都是指client-jar.jar
    2. 本文是《Kubernetes官方java客户端》系列的第三篇,《Kubernetes官方java客户端:准备》一文中咱们为实战做好了准备工作,从本文开始进入实战阶段;
    3. 本文的目标是开发名为OutsideclusterApplication的SpringBoot应用,该应用没有部署在K8S环境,使用的config文件是手动从K8S环境复制过来的,java客户端通过此config文件,能够远程访问到K8S上的API Server,实现所有客户端功能,整体部署情况如下图:
      在这里插入图片描述
    • 介绍完毕,开始编码;

    源码下载

    1. 如果您不想编码,可以在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协议
    1. 这个git项目中有多个文件夹,本章的应用在kubernetesclient文件夹下,如下图红框所示:
      在这里插入图片描述

    部署在K8S之外的应用:OutsideclusterApplication

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

    1. 登录K8S环境,在~/.kube目录下找到config文件,复制此文件到OutsideclusterApplication运行的机器上(我这里存放的路径是/Users/zhaoqin/temp/202007/05/,和后面的代码中一致);
    2. 打开《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>
    
    1. 上述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客户端之二:序列化和反序列化问题》一文有详细介绍)
    2. 新增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 
    {}", new GsonBuilder().setPrettyPrinting().create().toJson(v1PodList));
    
            return v1PodList;
        }
    
    }
    
    1. 运行上述代码,在浏览器访问http://localhost:8080/hello ,即可取得K8S所有pod的详情,如下所示(为了让返回数据更加整齐美观,我用的是Firefox浏览器):
      在这里插入图片描述

    2. 查看控制台,可见日志也将详情打印出来:
      在这里插入图片描述

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

    你不孤单,欣宸原创一路相伴

    1. Java系列
    2. Spring系列
    3. Docker系列
    4. kubernetes系列
    5. 数据库+中间件系列
    6. DevOps系列

    欢迎关注公众号:程序员欣宸

    微信搜索「程序员欣宸」,我是欣宸,期待与您一同畅游Java世界...
    https://github.com/zq2599/blog_demos

  • 相关阅读:
    什么是垃圾回收??
    Nginx教程3:SSL设置
    Nginx教程2:性能
    Nginx教程1:基本概念
    iOS 设计中-- 自定义-- 评星图标的方法
    iOS设计中对Xcode设置中创建PCH文件的过程
    iOS设计中不同屏幕适配的方法-登陆界面
    iOS设计之--OC学习总结之延展类目协议
    iOS 最新版 CocoaPods 的安装流程介绍
    iOS基本UI控件总结
  • 原文地址:https://www.cnblogs.com/bolingcavalry/p/14233415.html
Copyright © 2011-2022 走看看