Kubernetes Java客戶端快速入門

1.簡介

在本教程中,我們將展示如何使用Java應用程序的官方客戶端庫來使用Kubernetes API。

2.為什麼要使用Kubernetes API?

**如今,可以肯定地說,Kubernetes已成為管理容器化應用程序的de facto**標準。它提供了豐富的API,使我們能夠部署,擴展和監視應用程序以及相關的資源,例如存儲,機密和環境變量。實際上,考慮此API的一種方法是常規操作系統中可用的系統調用的分佈式模擬。

大多數時候,我們的應用程序可以忽略它們在Kubernetes下運行的事實。這是一件好事,因為它使我們能夠在本地進行開發,並通過一些命令和YAML命令,僅需少量更改即可將它們快速部署到多個雲提供商。

但是,在一些有趣的用例中,我們需要與Kubernetes API對話以實現特定功能:

  • 啟動外部程序以執行某些任務,然後檢索其完成狀態
  • 根據客戶需求動態創建/修改某些服務
  • 為跨多個Kubernetes集群甚至跨雲提供商運行的解決方案創建自定義監控儀表板

當然,這些用例並不常見,但是由於有了它的API,我們將看到它們非常容易實現。

此外,由於Kubernetes API是一個開放規範,因此我們可以確信我們的代碼將在不對任何經過認證的實現進行任何修改的情況下運行

3.本地開發環境

在繼續創建應用程序之前,我們需要做的第一件事就是獲得對運行中的Kubernetes集群的訪問權限。儘管我們可以為此使用公共雲提供商,但本地環境通常可以對其設置的所有方面提供更多控制。

有一些適合此任務的輕量級發行版:

實際的設置步驟超出了本文的範圍,但是,無論選擇哪種選項,只要在開始任何開發之前確保[kubectl](https://kubernetes.io/docs/reference/kubectl/overview/)是可以運行的

4. Maven依賴

首先,讓我們將Kubernetes Java API依賴項添加到我們項目的pom.xml

<dependency>

 <groupId>io.kubernetes</groupId>

 <artifactId>client-java</artifactId>

 <version>11.0.0</version>

 </dependency>

可以從Maven Central下載最新版本的[client-java](https://search.maven.org/search?q=g:io.kubernetes%20a:client-java)

5.您好,Kubernetes

現在,讓我們創建一個非常簡單的Kubernetes應用程序,該應用程序將列出可用的節點以及有關它們的一些信息。

儘管它很簡單,但此應用程序說明了連接到運行中的集群並執行API調用必須執行的必要步驟。無論我們在實際應用程序中使用哪種API,這些步驟始終是相同的。

5.1。 ApiClient初始化

ApiClient類是API中最重要的類之一,因為它包含執行對Kubernetes API服務器的調用的所有邏輯。創建此類實例的推薦方法是使用Config類中可用的靜態方法之一。特別是,最簡單的方法是使用defaultClient()方法:

ApiClient client = Config.defaultClient();

使用此方法可確保我們的代碼可以在遠程和群集方案中運行。同樣,它將自動按照**kubectl**實用程序所使用的相同步驟來查找配置文件

  • KUBECONFIG環境變量定義的配置文件
  • $HOME/.kube/config文件
  • /var/run/secrets/kubernetes.io/serviceaccount下的服務帳戶令牌
  • 直接訪問http://localhost:8080

第三步是使我們的應用程序可以在群集中作為任何pod一部分運行的步驟,只要為其提供了適當的服務帳戶即可。

另外,請注意,如果在配置文件中定義了多個上下文,則此過程將選擇“當前”上下文,如使用kubectl config set-context命令定義的那樣。

5.2。創建一個API存根

一旦掌握了ApiClient實例,就可以使用它為任何可用的API創建存根。在我們的例子中,我們將使用CoreV1Api類,其中包含我們需要列出可用節點的方法:

CoreV1Api api = new CoreV1Api(client);

在這裡,我們使用現有的ApiClient創建API存根。

請注意,還有一個no-args構造函數可用,但通常,我們應避免使用它not使用它的原因是,在內部它將使用全局ApiClient ,該全局ApiClient必須事先通過Configuration.setDefaultApiClient()進行設置。這會在使用存根之前對調用此方法的人產生隱式依賴,從而可能導致運行時錯誤和維護問題。

更好的方法是使用任何依賴項注入框架進行此初始連接,並在需要時將結果存根注入。

5.3。調用Kubernetes API

最後,讓我們進入返回可用節點的實際API調用。 CoreApiV1存根具有一種精確執行此操作的方法,因此這很簡單:

V1NodeList nodeList = api.listNode(null, null, null, null, null, null, null, null, 10, false);

 nodeList.getItems()

 .stream()

 .forEach((node) -> System.out.println(node));

在我們的示例中,我們null ,因為它們是可選的。最後兩個參數與所有listXXX呼叫相關,因為它們指定了呼叫超時以及這是否是Watch呼叫。檢查方法的簽名將顯示剩餘的參數:

public V1NodeList listNode(

 String pretty,

 Boolean allowWatchBookmarks,

 String _continue,

 String fieldSelector,

 String labelSelector,

 Integer limit,

 String resourceVersion,

 String resourceVersionMatch,

 Integer timeoutSeconds,

 Boolean watch) {

 // ... method implementation

 }

對於此快速介紹,我們將僅忽略分頁,監視和過濾器參數。在這種情況下,返回值是一個POJO,其中包含返回文檔的Java表示形式。對於此API調用,文檔包含V1Node對象的列表,其中包含有關每個節點的幾條信息。這是此代碼在控制台上產生的典型輸出:

class V1Node {

 metadata: class V1ObjectMeta {

 labels: {

 beta.kubernetes.io/arch=amd64,

 beta.kubernetes.io/instance-type=k3s,

 // ... other labels omitted

 }

 name: rancher-template

 resourceVersion: 29218

 selfLink: null

 uid: ac21e09b-e3be-49c3-9e3a-a9567b5c2836

 }

 // ... many fields omitted

 status: class V1NodeStatus {

 addresses: [class V1NodeAddress {

 address: 192.168.71.134

 type: InternalIP

 }, class V1NodeAddress {

 address: rancher-template

 type: Hostname

 }]

 allocatable: {

 cpu=Quantity{number=1, format=DECIMAL_SI},

 ephemeral-storage=Quantity{number=18945365592, format=DECIMAL_SI},

 hugepages-1Gi=Quantity{number=0, format=DECIMAL_SI},

 hugepages-2Mi=Quantity{number=0, format=DECIMAL_SI},

 memory=Quantity{number=8340054016, format=BINARY_SI},

 pods=Quantity{number=110, format=DECIMAL_SI}

 }

 capacity: {

 cpu=Quantity{number=1, format=DECIMAL_SI},

 ephemeral-storage=Quantity{number=19942490112, format=BINARY_SI},

 hugepages-1Gi=Quantity{number=0, format=DECIMAL_SI},

 hugepages-2Mi=Quantity{number=0, format=DECIMAL_SI},

 memory=Quantity{number=8340054016, format=BINARY_SI},

 pods=Quantity{number=110, format=DECIMAL_SI}}

 conditions: [

 // ... node conditions omitted

 ]

 nodeInfo: class V1NodeSystemInfo {

 architecture: amd64

 kernelVersion: 4.15.0-135-generic

 kubeProxyVersion: v1.20.2+k3s1

 kubeletVersion: v1.20.2+k3s1

 operatingSystem: linux

 osImage: Ubuntu 18.04.5 LTS

 // ... more fields omitted

 }

 }

 }

我們可以看到,有很多可用的信息。為了進行比較,這是默認設置下kubectl

[email protected]:~# kubectl get nodes

 NAME STATUS ROLES AGE VERSION

 rancher-template Ready control-plane,master 24h v1.20.2+k3s1

六,結論

在本文中,我們對Java的Kubernetes API進行了簡要介紹。在以後的文章中,我們將更深入地研究此API,並探索其一些其他功能:

  • 解釋可用的API調用變體之間的區別
  • 使用Watch實時監視集群事件
  • 如何使用分頁從集群中高效檢索大量數據