歡迎訪問我的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