Kubernetes官方java客戶端之一:準備

程式設計師欣宸發表於2020-12-31

歡迎訪問我的GitHub

https://github.com/zq2599/blog_demos

內容:所有原創文章分類彙總及配套原始碼,涉及Java、Docker、Kubernetes、DevOPS等;

關於Kubernetes官方java客戶端

  1. Kubernetes官方java客戶端全稱是Kubernetes Java Client,是K8S官方推出的java庫,以8.0.2版本為例,其maven座標如下:
<dependency>
    <groupId>io.kubernetes</groupId>
    <artifactId>client-java</artifactId>
    <version>8.0.2</version>
    <scope>compile</scope>
</dependency>
  1. 本文是《Kubernetes官方java客戶端》系列的第一篇,主要內容是瞭解概念,再為後續章節的做好準備工作;

  2. 回想我們們通常是如何操作K8S環境的,例如部署deployment,可以在dashboard頁面上傳yaml檔案,也能在SSH終端執行kubectl命令,這些操作的去向都是K8S的API Server,如下圖:
    在這裡插入圖片描述

  3. 從上圖可見,如果能把請求傳送到API Server,就可以像kubectl命令那樣操作K8S了,K8S官方java客戶端(Kubernetes Java Client)就是擁有這樣能力的SDK,使得java應用擁有kubectl那樣的能力,如下圖所示,載入了K8S官方java客戶端庫的SpringBoot應用,可以直接將請求傳送到K8S環境:
    在這裡插入圖片描述

需要準備什麼

《Kubernetes官方java客戶端》是以實戰為主的系列文章,為了後面實戰順利進行,會在本章進行準備工作,包括硬體、軟體、配置等方面,接下來會逐一列出;

開發環境

我這邊用來編碼的環境如下:

  1. 作業系統:macOS Catalina 10.15.5
  2. JDK:1.8.0_121
  3. Maven:33.3.9
  4. 開發工具:IntelliJ IDEA 2019.3.2 (Ultimate Edition)

執行環境

編碼完成後要執行在K8S環境,該環境只有一臺CentoOS電腦,資訊如下:

  1. 作業系統:CentOS Linux release 7.8.2003
  2. K8S:1.15.3

選定client-java版本

  1. K8S有多個版本,java客戶端也有多個版本,用的時候如何選擇呢?請參考官方給出的相容性列表:
    在這裡插入圖片描述
  2. 如上圖,橫向是K8S版本,縱向是java客戶端版本,表格中有三種符號,含義如下:
  • ✓ 表示從特性到API,客戶端和K8S環境都匹配;
  • + 表示客戶端有些特性和API與K8S環境無法匹配,但是他們共有的特性和API都能正常執行;
  • - 表示當前K8S環境上有些特性和API是客戶端無法提供的;
  • 我的K8S版本是1.15,可見7.0.0版本的客戶端是最合適的,後續的實戰中也就選用該版本了,請您根據自己K8S的情況選擇對應版本;

SpringBoot應用操作許可權

  1. 後面的實戰中,我們們的SpringBoot應用會以Pod的形式執行在K8S環境,通過client-java的API操作K8S,而K8S自然不會允許Pod隨意對環境中的pod、deployment這些資源進行操作,因此我們要遵照K8S的規範進行RBAC相關的操作;
  2. K8S的角色設定可以非常詳細,但也會更復雜,我們們還是不要花太多時間在這上面吧,這裡我選擇了使用K8S自帶的最高許可權的角色:cluster-admin,您可以按照自己的實際情況定製角色,下面是具體操作;
  3. SSH登入K8S,建立namespace:
kubectl create namespace kubernetesclient
  1. 建立檔案rbac.yaml,內容如下:
apiVersion: v1
kind: ServiceAccount
metadata:
  name: kubernates-client-service-account
  namespace: kubernetesclient
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: kubernates-client-cluster-role-binding
subjects:
  - kind: ServiceAccount
    name: kubernates-client-service-account
    namespace: kubernetesclient
roleRef:
  kind: ClusterRole
  name: cluster-admin
  apiGroup: rbac.authorization.k8s.io
  1. 今後的實戰中,SpringBoot應用都會部署在名為kubernetesclient的namespace之下,使用名為kubernates-client-service-account的Service Account;

IEDA安裝外掛

因為專案中用到了Slf4j註解,請在IEDA上安裝lombok外掛,否則編寫log相關程式碼的時候會有紅叉:
在這裡插入圖片描述

建立所有java應用的父工程

  1. 後面的實戰要建立多個SpringBoot應用,有必要提前建立一個父maven工程,將依賴庫的定義和版本都放在在此;
  2. 建立名為kubernetesclient的maven工程,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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>com.bolingcavalry</groupId>
    <artifactId>kubernetesclient</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <modules>
        <module>helloworld</module>
        <module>outsidecluster</module>
    </modules>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <dependencyManagement>

        <dependencies>
            <dependency>
                <groupId>io.kubernetes</groupId>
                <artifactId>client-java</artifactId>
                <version>7.0.0</version>
                <scope>compile</scope>
            </dependency>
        </dependencies>

    </dependencyManagement>
</project>

由於這是個父工程,因此目前除了pom.xml暫時沒有其他內容,後面的實戰會往裡面新增子工程;

全系列原始碼下載

  1. 本次實戰用到了一個普通的SpringBoot工程,原始碼可在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資料夾下,如下圖紅框所示:

在這裡插入圖片描述

  • 以上就是實戰前的準備工作了,感謝您的關注,後面的實戰會更加精彩;

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

  1. Java系列
  2. Spring系列
  3. Docker系列
  4. kubernetes系列
  5. 資料庫+中介軟體系列
  6. DevOps系列

歡迎關注公眾號:程式設計師欣宸

微信搜尋「程式設計師欣宸」,我是欣宸,期待與您一同暢遊Java世界...
https://github.com/zq2599/blog_demos

相關文章