1. 程式人生 > 其它 >最好的Kubernetes客戶端Java庫fabric8io,快來自定義你的操作

最好的Kubernetes客戶端Java庫fabric8io,快來自定義你的操作

我最新最全的文章都在 南瓜慢說 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


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

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