文字翻譯自: https://itnext.io/working-with-the-kubernetes-api-587bc5941992
Kubernetes 公開了一個強大的 API,可讓您控制叢集的各個方面。
大多數時候,它隱藏在 kubectl 後面,但沒有人會阻止您直接使用它。
在本文中,您將學習如何使用 curl
或者您喜歡的程式語言向 Kubernetes API 發出請求。
但首先,讓我們回顧一下 Kubernetes API 的工作原理。
當您鍵入命令時,kubectl:
- 客戶端校驗請求。
- 在檔案上生成 YAML(例如
kubectl run
)。 - 構造執行時物件。
此時,kubectl 還沒有向叢集發出任何請求。
下一步,它查詢當前的 API 伺服器並發現所有可用的 API 端點。
最後,kubectl 使用執行時物件和端點來協商正確的 API 呼叫。
如果您的資源是 Pod,kubectl 會讀取 apiVersion
和 kind
欄位並確保它們在叢集中可用和受支援。
然後它傳送請求。
理解在 Kubernetes 中 API 是分組的這很重要的。
為了進一步隔離多個版本,資源被版本化。
現在您已經掌握了基礎知識,讓我們來看一個示例。
您可以使用 kubectl proxy
啟動到 API 伺服器的本地隧道。
但是如何檢索所有 deployments 呢?
Deployments 屬於 apps
組並且有一個 v1
版本。
您可以列出它們:
curl localhost:8001/apis/apps/v1/namespaces/{namespace}/deployments
列出所有正在執行的 pod 怎麼樣?
Pod 屬於 ""
(空)組並且有一個 v1
版本。
您可以列出它們:
curl localhost:8001/api/v1/namespaces/{namespace}/pods
group 為空看起來有點奇怪——還有更多例外嗎?
好吧,現實是有一種更簡單的方法來構建 URL。
我通常使用 Kubernetes API 參考文件,因為路徑都整齊地列出了。
讓我們看另一個示例,但這次是在 API 參考的幫助下。
如果你想收到 pod 更改的通知怎麼辦?
在 API 中稱為 watch
,命令為:
GET /api/v1/watch/namespaces/{namespace}/pods/{name}
太好了,但這一切有什麼意義呢?
直接訪問 API 允許您構建指令碼來自動執行任務。
或者您可以構建自己的 kubernetes 擴充套件。
我來給你展示。
這是一個約 130 行 Javascript 的小型 kubernetes 儀表板。
它呼叫了 2 個 API:
- 列出所有 pod
- watch pod 的變化
其餘程式碼用於對節點進行分組和顯示。
在 Kubernetes 中,將列出和更新資源結合起來非常普遍,以至於它成為一種稱為 shared informer 的模式。
Javascript/Typescript API 有一個很好的 shared informer 的例子.
但它只是 2 個 GET 請求(和一些快取)的奇特名稱。
API 不止於讀取資源。
您還可以建立新資源並修改現有資源。
例如,您可以修改部署的副本:
PATCH /apis/apps/v1/namespaces/{namespace}/deployments/{name}
為了進行實驗,我建造了一些非常規的東西。
xlskubectl 是我嘗試使用 Excel/Google 表格控制 kubernetes 叢集。
該程式碼與上述 Javascript 程式碼非常相似:
- 它使用 shared informer
- 它輪詢 google sheets 的更新
- 它將所有內容呈現為單元格
這個示例是一個好主意嗎? 可能並不是。
希望它能幫助您實現直接使用 Kubernetes API 的潛力。
這些程式碼都不是用 Go 編寫的——您可以使用任何程式語言去呼叫 Kubernetes API。