使用 Kubernetes API

rife發表於2023-03-30

文字翻譯自: https://itnext.io/working-with-the-kubernetes-api-587bc5941992


Kubernetes 公開了一個強大的 API,可讓您控制叢集的各個方面。

大多數時候,它隱藏在 kubectl 後面,但沒有人會阻止您直接使用它。

在本文中,您將學習如何使用 curl 或者您喜歡的程式語言向 Kubernetes API 發出請求。

但首先,讓我們回顧一下 Kubernetes API 的工作原理。

當您鍵入命令時,kubectl:

  • 客戶端校驗請求。
  • 在檔案上生成 YAML(例如kubectl run)。
  • 構造執行時物件。

Client side validation in kubectl

此時,kubectl 還沒有向叢集發出任何請求。

下一步,它查詢當前的 API 伺服器並發現所有可用的 API 端點。

OpenAPI descovery in kubectl

最後,kubectl 使用執行時物件和端點來協商正確的 API 呼叫。

如果您的資源是 Pod,kubectl 會讀取 apiVersionkind 欄位並確保它們在叢集中可用和受支援。

然後它傳送請求。

API negotiation in kubectl

理解在 Kubernetes 中 API 是分組的這很重要的。

為了進一步隔離多個版本,資源被版本化。

Kubernetes API groups, versions and resources

現在您已經掌握了基礎知識,讓我們來看一個示例。

您可以使用 kubectl proxy 啟動到 API 伺服器的本地隧道。

但是如何檢索所有 deployments 呢?

Proxy to kubernetes API

Deployments 屬於 apps 組並且有一個 v1 版本。

您可以列出它們:

curl localhost:8001/apis/apps/v1/namespaces/{namespace}/deployments

List deployments

列出所有正在執行的 pod 怎麼樣?

Pod 屬於 ""(空)組並且有一個 v1 版本。

您可以列出它們:

curl localhost:8001/api/v1/namespaces/{namespace}/pods

List pods

group 為空看起來有點奇怪——還有更多例外嗎?

好吧,現實是有一種更簡單的方法來構建 URL。

我通常使用 Kubernetes API 參考文件,因為路徑都整齊地列出了。

讓我們看另一個示例,但這次是在 API 參考的幫助下。

如果你想收到 pod 更改的通知怎麼辦?

在 API 中稱為 watch,命令為:

GET /api/v1/watch/namespaces/{namespace}/pods/{name}

Watch pods

太好了,但這一切有什麼意義呢?

直接訪問 API 允許您構建指令碼來自動執行任務。

或者您可以構建自己的 kubernetes 擴充套件。

我來給你展示。

這是一個約 130 行 Javascript 的小型 kubernetes 儀表板。

它呼叫了 2 個 API:

  1. 列出所有 pod
  2. watch pod 的變化

其餘程式碼用於對節點進行分組和顯示。

在 Kubernetes 中,將列出和更新資源結合起來非常普遍,以至於它成為一種稱為 shared informer 的模式。

Javascript/Typescript API 有一個很好的 shared informer 的例子.

但它只是 2 個 GET 請求(和一些快取)的奇特名稱。

API 不止於讀取資源。

您還可以建立新資源並修改現有資源。

例如,您可以修改部署的副本:

PATCH /apis/apps/v1/namespaces/{namespace}/deployments/{name}

使用 curl 修補 Kubernetes 部署

為了進行實驗,我建造了一些非常規的東西。

xlskubectl 是我嘗試使用 Excel/Google 表格控制 kubernetes 叢集。

Sheetops — 使用電子表格控制 Kubernetes

該程式碼與上述 Javascript 程式碼非常相似:

  1. 它使用 shared informer
  2. 它輪詢 google sheets 的更新
  3. 它將所有內容呈現為單元格

這個示例是一個好主意嗎? 可能並不是。

希望它能幫助您實現直接使用 Kubernetes API 的潛力。

這些程式碼都不是用 Go 編寫的——您可以使用任何程式語言去呼叫 Kubernetes API。

相關文章