最好的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


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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章