我最新最全的文章都在 南瓜慢說 www.pkslow.com ,歡迎大家來喝茶!
1 Kubernetes Java客戶端
對于Kubernetes集群的操作,官方提供了命令列工具kubectl,這也是我們最常用且必須掌握的方式,通過kubectl來實作增刪改查操作,方便而直接,但總有一些更復雜的場景難以滿足,比如我希望在資料庫的某個值達到10萬后就觸發一個Kubernetes Job去處理某項任務,即使shell編程似乎也可以解決,但為了專案維護,如果能整合到現有代碼里,豈不是更好?

從Kubernetes的架構圖可以看出,我們只要和API server做好互動就可以了,實際上kubectl也是如此的,那我們就可以使用任何語言來操作Kubernetes,
本文將介紹Java方面最好用的客戶端庫fabric8io/kubernetes-client,它支持Kubernetes和OpenShift,并被許多專案參考,如Spring Cloud、Spark、Istio Java API等,可見它的優秀之處,
2 如何使用
本文將通過代碼演示一些常用操作,
2.1 引入依賴
目前的最新版本為5.0.0,通過maven引入最新依賴如下:
<dependency>
<groupId>io.fabric8</groupId>
<artifactId>kubernetes-client</artifactId>
<version>5.0.0</version>
</dependency>
這個依賴包含了相關的核心類、模型類、Json和okhttp3等,

看它的依賴就可以學習優秀的專案是如何組織和管理的,
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=https://www.cnblogs.com/larrydpk/p/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
歡迎關注微信公眾號<南瓜慢說>,將持續為你更新...

多讀書,多分享;多寫作,多整理,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/288352.html
標籤:Java
上一篇:Netty 框架學習 —— 引導
