我最新最全的文章都在南瓜慢說 www.pkslow.com,歡迎大家來喝茶!

1 Kubernetes Java客戶端

對於Kubernetes叢集的操作,官方提供了命令列工具kubectl,這也是我們最常用且必須掌握的方式。通過kubectl來實現增刪改查操作,方便而直接。但總有一些更復雜的場景難以滿足,比如我希望在資料庫的某個值達到10萬後就觸發一個Kubernetes Job去處理某項任務。即使shell程式設計似乎也可以解決,但為了專案維護,如果能整合到現有程式碼裡,豈不是更好?

Kubernetes的架構圖可以看出,我們只要和API server做好互動就可以了,實際上kubectl也是如此的。那我們就可以使用任何語言來操作Kubernetes

本文將介紹Java方面最好用的客戶端庫fabric8io/kubernetes-client,它支援KubernetesOpenShift,並被許多專案引用,如Spring CloudSparkIstio Java API等,可見它的優秀之處。

2 如何使用

本文將通過程式碼演示一些常用操作。

2.1 引入依賴

目前的最新版本為5.0.0,通過maven引入最新依賴如下:

<dependency>
<groupId>io.fabric8</groupId>
<artifactId>kubernetes-client</artifactId>
<version>5.0.0</version>
</dependency>

這個依賴包含了相關的核心類、模型類、Jsonokhttp3等。

看它的依賴就可以學習優秀的專案是如何組織和管理的。

2.2 建立客戶端

建立客戶端最簡單的方式是使用預設配置:

KubernetesClient client = new DefaultKubernetesClient();

它會從目錄~/.kube/config中讀取配置檔案。如果想要修改配置,可以通過配置以下設定:

  • 系統屬性(System Properties)
  • 環境變數(Enviroment Variables)
  • Kube配置檔案
  • ServiceAccount的Token和載入的CA證書

系統屬性和環境變數列表可檢視官網。

當然,還可以通過Java來自定義配置:

Config config = new ConfigBuilder()
.withMasterUrl("https://localhost:6443")
.build();
KubernetesClient client = new DefaultKubernetesClient(config);

2.3 建立資源

這個Java庫使用了大量的Builder模式來建立物件,建立命令空間如下:

Namespace namespace = new NamespaceBuilder()
.withNewMetadata()
.withName("pkslow")
.addToLabels("reason", "pkslow-sample")
.endMetadata()
.build();
client.namespaces().createOrReplace(namespace);

非常靈活,上面例子添加了名字和標籤,最後通過createOrReplace方法可新建,如果存在可替換。

對於Pod也是類似的:

Pod pod = new PodBuilder()
.withNewMetadata()
.withName("nginx")
.addToLabels("app", "nginx")
.endMetadata()
.withNewSpec()
.addNewContainer()
.withName("nginx")
.withImage("nginx:1.19.5")
.endContainer()
.endSpec()
.build();
client.pods().inNamespace("pkslow").createOrReplace(pod);

指定名字、標籤和映象後就可以建立了。

2.4 檢視資源

檢視資源可以查詢所有,或者通過條件options來過濾,具體程式碼如下:

// 檢視名稱空間
NamespaceList namespaceList = client.namespaces().list();
namespaceList.getItems()
.forEach(namespace ->
System.out.println(namespace.getMetadata().getName() + ":" + namespace.getStatus().getPhase())); // 檢視Pod
ListOptions options = new ListOptions();
options.setLabelSelector("app=nginx");
Pod nginx = client.pods().inNamespace("pkslow")
.list(options)
.getItems()
.get(0);
System.out.println(nginx);

2.5 修改資源

修改資源是通過edit方法來實現的,可通過名稱空間和名字來定位到資源,然後進行修改,示例程式碼如下:

// 修改名稱空間
client.namespaces().withName("pkslow")
.edit(n -> new NamespaceBuilder(n)
.editMetadata()
.addToLabels("project", "pkslow")
.endMetadata()
.build()
); // 修改Pod
client.pods().inNamespace("pkslow").withName("nginx")
.edit(p -> new PodBuilder(p)
.editMetadata()
.addToLabels("app-version", "1.0.1")
.endMetadata()
.build()
);

2.6 刪除資源

刪除資源也是類似的,先定位再操作:

client.pods().inNamespace("pkslow")
.withName("nginx")
.delete();

2.7 通過yaml檔案操作

我們還可以直接通過yaml檔案來描述資源,而不用Java來定義,這樣可以更直觀和方便。完成yaml檔案的編寫後,Load成對應的物件,再進行各種增刪改查操作,示例如下:

yaml檔案定義了一個Deployment

apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
myapp: nginx
spec:
replicas: 1
selector:
matchLabels:
myapp: nginx
template:
metadata:
labels:
myapp: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80

Java程式碼如下:

Deployment deployment = client.apps().deployments()
.load(Fabric8KubernetesClientSamples.class.getResourceAsStream("/deployment.yaml"))
.get();
client.apps().deployments().inNamespace("pkslow")
.createOrReplace(deployment);

2.8 監聽事件

我們還可以通過監聽資源的事件,來進行對應的反應,比如有人刪除了Pod就記錄日誌到資料庫等,這個功能還是非常有用的。示例程式碼如下:

client.pods().inAnyNamespace().watch(new Watcher<Pod>() {
@Override
public void eventReceived(Action action, Pod pod) {
System.out.println("event " + action.name() + " " + pod.toString());
} @Override
public void onClose(WatcherException e) {
System.out.println("Watcher close due to " + e); }
});

通過一個Watcher監聽了Pod的所有動作事件,然後列印動作名和對應的Pod。輸出後的日誌如下:

event ADDED Pod(apiVersion=v1, kind=Pod, metadata=ObjectMeta(
event MODIFIED Pod(apiVersion=v1, kind=Pod, metadata=ObjectMeta(
event DELETED Pod(apiVersion=v1, kind=Pod, metadata=ObjectMeta(
event MODIFIED Pod(apiVersion=v1, kind=Pod, metadata=ObjectMeta(

日誌太長,就不完全顯示。

3 總結

這個Kubernetes的Java客戶端實在是好用,API簡單易用,即使不用文件也能通過方法名判斷。最讓人驚喜的是,官方還提供了許多絕佳的示例,簡直不要太友好。

使用這個API,在專案中可以更靈活地管理和使用Kubernetes應用了。

程式碼請檢視:https://github.com/LarryDpk/pkslow-samples


歡迎關注微信公眾號<南瓜慢說>,將持續為你更新...

多讀書,多分享;多寫作,多整理。