我最新最全的文章都在南瓜慢說 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=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
歡迎關注微信公眾號<南瓜慢說>,將持續為你更新...
多讀書,多分享;多寫作,多整理。