Kubernetes官方java客戶端之三:外部應用

歡迎訪問個人GitHub

https://github.com/zq2599/blog_demosjava

內容:全部原創文章分類彙總及配套源碼,涉及Java、Docker、Kubernetes、DevOPS等;git

概覽

  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 \n{}", new GsonBuilder().setPrettyPrinting().create().toJson(v1PodList));

        return v1PodList;
    }

}
  1. 運行上述代碼,在瀏覽器訪問http://localhost:8080/hello ,便可取得K8S全部pod的詳情,以下所示(爲了讓返回數據更加整齊美觀,我用的是Firefox瀏覽器):
    在這裏插入圖片描述github

  2. 查看控制檯,可見日誌也將詳情打印出來:
    在這裏插入圖片描述web

  • 至此,我們的第一個使用K8S官方java客戶端的應用就完成了,接下來的實戰會嘗試將應用部署在K8S環境內,在K8S內部進行各項操做;

你不孤單,欣宸原創一路相伴

  1. Java系列
  2. Spring系列
  3. Docker系列
  4. kubernetes系列
  5. 數據庫+中間件系列
  6. DevOps系列

歡迎關注公衆號:程序員欣宸

微信搜索「程序員欣宸」,我是欣宸,期待與您一同暢遊Java世界...
https://github.com/zq2599/blog_demosspring

相關文章
相關標籤/搜索