歡迎訪問我的GitHub
https://github.com/zq2599/blog_demos
內容:所有原創文章分類匯總及配套源碼,涉及Java、Docker、Kubernetes、DevOPS等;
關於Kubernetes官方java客戶端
- 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>
-
本文是《Kubernetes官方java客戶端》系列的第一篇,主要內容是了解概念,再為后續章節的做好准備工作;
-
回想咱們通常是如何操作K8S環境的,例如部署deployment,可以在dashboard頁面上傳yaml文件,也能在SSH終端執行kubectl命令,這些操作的去向都是K8S的API Server,如下圖:
-
從上圖可見,如果能把請求發送到API Server,就可以像kubectl命令那樣操作K8S了,K8S官方java客戶端(Kubernetes Java Client)就是擁有這樣能力的SDK,使得java應用擁有kubectl那樣的能力,如下圖所示,加載了K8S官方java客戶端庫的SpringBoot應用,可以直接將請求發送到K8S環境:
需要准備什么
《Kubernetes官方java客戶端》是以實戰為主的系列文章,為了后面實戰順利進行,會在本章進行准備工作,包括硬件、軟件、配置等方面,接下來會逐一列出;
開發環境
我這邊用來編碼的環境如下:
- 操作系統:macOS Catalina 10.15.5
- JDK:1.8.0_121
- Maven:33.3.9
- 開發工具:IntelliJ IDEA 2019.3.2 (Ultimate Edition)
運行環境
編碼完成后要運行在K8S環境,該環境只有一台CentoOS電腦,信息如下:
- 操作系統:CentOS Linux release 7.8.2003
- K8S:1.15.3
選定client-java版本
- K8S有多個版本,java客戶端也有多個版本,用的時候如何選擇呢?請參考官方給出的兼容性列表:
- 如上圖,橫向是K8S版本,縱向是java客戶端版本,表格中有三種符號,含義如下:
- ✓ 表示從特性到API,客戶端和K8S環境都匹配;
- + 表示客戶端有些特性和API與K8S環境無法匹配,但是他們共有的特性和API都能正常運行;
- - 表示當前K8S環境上有些特性和API是客戶端無法提供的;
- 我的K8S版本是1.15,可見7.0.0版本的客戶端是最合適的,后續的實戰中也就選用該版本了,請您根據自己K8S的情況選擇對應版本;
SpringBoot應用操作權限
- 后面的實戰中,咱們的SpringBoot應用會以Pod的形式運行在K8S環境,通過client-java的API操作K8S,而K8S自然不會允許Pod隨意對環境中的pod、deployment這些資源進行操作,因此我們要遵照K8S的規范進行RBAC相關的操作;
- K8S的角色設置可以非常詳細,但也會更復雜,咱們還是不要花太多時間在這上面吧,這里我選擇了使用K8S自帶的最高權限的角色:cluster-admin,您可以按照自己的實際情況定制角色,下面是具體操作;
- SSH登錄K8S,創建namespace:
kubectl create namespace kubernetesclient
- 創建文件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
- 今后的實戰中,SpringBoot應用都會部署在名為kubernetesclient的namespace之下,使用名為kubernates-client-service-account的Service Account;
IEDA安裝插件
因為項目中用到了Slf4j注解,請在IEDA上安裝lombok插件,否則編寫log相關代碼的時候會有紅叉:
創建所有java應用的父工程
- 后面的實戰要創建多個SpringBoot應用,有必要提前創建一個父maven工程,將依賴庫的定義和版本都放在在此;
- 創建名為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暫時沒有其他內容,后面的實戰會往里面添加子工程;
全系列源碼下載
- 本次實戰用到了一個普通的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協議 |
- 這個git項目中有多個文件夾,本章的應用在kubernetesclient文件夾下,如下圖紅框所示:
- 以上就是實戰前的准備工作了,感謝您的關注,后面的實戰會更加精彩;
你不孤單,欣宸原創一路相伴
歡迎關注公眾號:程序員欣宸
微信搜索「程序員欣宸」,我是欣宸,期待與您一同暢游Java世界...
https://github.com/zq2599/blog_demos