Kubernetes 支持 OpenAPI
Open API 讓 API 提供者可以定義自己的操作和模型,并讓開發(fā)者可以自動(dòng)化的生成喜歡語言 的客戶端,用以和 API 服務(wù)器通信。Kubernetes 已經(jīng)支持 Swagger 1.2(OpenAPI 規(guī)范的前身)有一段時(shí)間了,但是這一標(biāo)準(zhǔn)不夠完整和有效,憑借這一支持,非常難生成工具或客戶端。
在 Kubernetes 1.4,我們對目前的模型和操作進(jìn)行了升級,引入了 Open API 規(guī)范(在沒被捐獻(xiàn)給 Open API 之前被稱作 Swagger 2.0)支持的 Alpha 版本。從 Kubernetes 1.5 開始,OpenAPI 規(guī)范的支持已經(jīng)完備,能夠直接從 Kubernetes 源碼生成規(guī)范,對于模型和方法的任何變更,都會(huì)保障文檔和規(guī)范的完全同步。
新規(guī)范讓我們有了更好的 API 文檔,甚至還有了一個(gè) Python 客戶端。
這一模塊化的規(guī)范用 GroupVersion 進(jìn)行分隔,這一做法屬于未雨綢繆,我們想要讓不同的 API Server 使用不同的 GroupVersion。
規(guī)范的結(jié)構(gòu)在 Open API spec definition 中有解釋。我們用 operation 標(biāo)記 來拆分每個(gè) GroupVersion 并盡可能的豐富其中的模型、路徑、操作等信息。操作的參數(shù)、調(diào)用方法以及響應(yīng)都有文檔描述。
例如,獲取 Pod 信息的 OpenAPI 規(guī)范
{ ... "paths": { "/api/v1/namespaces/{namespace}/pods/{name}": { "get": { "description": "read the specified Pod", "consumes": [ "*/*" ], "produces": [ "application/json", "application/yaml", "application/vnd.kubernetes.protobuf" ], "schemes": [ "https" ], "tags": [ "core_v1" ], "operationId": "readCoreV1NamespacedPod", "parameters": [ { "uniqueItems": true, "type": "boolean", "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'.", "name": "exact", "in": "query" }, { "uniqueItems": true, "type": "boolean", "description": "Should this value be exported. Export strips fields that a user can not specify.", "name": "export", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/v1.Pod" } }, "401": { "description": "Unauthorized" } } }, … } …有了這些信息,以及 kube-apiserver 的 URL,就可以據(jù)此來調(diào)用接口了(/api/v1/namespaces/{namespace}/pods/{name}),參數(shù)包括 name、exact 以及 export 等,調(diào)用結(jié)果會(huì)返回 Pod 信息。客戶庫生成器也會(huì)使用這些信息來創(chuàng)建一個(gè) API 函數(shù)調(diào)用來讀取 Pod 信息。例如 Python 客戶端 能夠很簡單的進(jìn)行如下調(diào)用:
from kubernetes import clientret = client.CoreV1Api().read_namespaced_pod(name="pods_name", namespace="default")https://gist.github.com/mbohlool/d5ec1dace27ef90cf742555c05480146一個(gè)簡化版的 read_namespaced_pod。
Python Client:https://github.com/kubernetes-incubator/client-python還可以使用 Swagger-codegen 文檔生成器來根據(jù)這些信息生成文檔:
GET /api/v1/namespaces/{namespace}/pods/{name} (readCoreV1NamespacedPod)read the specified Pod Path parametersname (required) Path Parameter — name of the Pod namespace (required) Path Parameter — object name and auth scope, such as for teams and projectsConsumes This API call consumes the following media types via the Content-Type request header: */*Query parameterspretty (optional)Query Parameter — If 'true', then the output is pretty printed.exact (optional)Query Parameter — Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'.export (optional)Query Parameter — Should this value be exported. Export strips fields that a user can not specify.Return typev1.PodProducesThis API call produces the following media types according to the Accept request header; the media type will be conveyed by the Content-Type response header.application/jsonapplication/yamlapplication/vnd.kubernetes.protobufResponses200OK v1.Pod401Unauthorized有兩種方式訪問 OpenAPI :
- 從 kube-apiserver/swagger.json。這個(gè)文件會(huì)包含所有啟用的 GroupVersion 方法和模型,其中的內(nèi)容會(huì)是該 API Server 所對應(yīng)的最新版本。
- Kubernetes 的 Github 倉庫,可以訪問 master 或者其他指定的 Release。
有很多工具 能和這些 API 協(xié)同工作,例如可以用 swagger editor 來打開規(guī)范文件并渲染文檔,或者生成客戶端;還可以直接利用 swagger codegen 來生成文檔和客戶端。自動(dòng)生成的客戶端多數(shù)時(shí)候是開箱即用的。不過可能需要做一些登錄和 Kubernetes 相關(guān)的設(shè)置。可以使用 Python 客戶端 作為模板來開發(fā)自己的客戶端
本文轉(zhuǎn)自中文社區(qū)-Kubernetes 支持 OpenAPI
總結(jié)
以上是生活随笔為你收集整理的Kubernetes 支持 OpenAPI的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 以太坊DAPP[2]-×××-react
- 下一篇: springboot整合图像数据库Neo