前幾天已經介紹了要如何安裝、設定 Kubernetes 並且可以在 Ohara 上,使用 Kubernetes 的環境建立 Zookeeper Cluster、Broker Cluster 和 Worker Cluster 服務的 Container,今天主要介紹 Ohara 呼叫了 Kubernetes 的哪些 Restful API。
在介紹 Ohara 呼叫了哪些 Kubernetes 的 Restful API 之前,先說明一下 Ohara 的程式碼是如何連到 Kubernetes 的 Restful API。Ohara 主要是透過 Akka 的 HTTP 連到 Kubernetes 的 Restful API,Request 和 Response 的資料格式是使用 JSON 傳送,透過 akka http spray json 的 library 來做物件的轉換。
簡單的程式碼範例如下:
Http()
.singleRequest(HttpRequest(HttpMethods.GET, uri = s"$k8sApiServerURL/nodes"))
.flatMap(unmarshal[K8SNodeInfo])
.map(nodeInfo =>
nodeInfo.items.map(item => {
val internalIP: String =
item.status.addresses.filter(node => node.nodeType.equals("InternalIP")).head.nodeAddress
val hostName: String =
item.status.addresses.filter(node => node.nodeType.equals("Hostname")).head.nodeAddress
HostAliases(internalIP, Seq(hostName))
}))
以上的程式碼呼叫 Http() 方法,就是使用 akka http 的 library,然後呼叫 Kubernetes 的 nodes Restful API,找到 Kubernetes 的 node name 和 IP 的對應資訊,之後設定給 HostAliases 的 case class 裡。
Response 是一個 JSON 的值會被轉換成 K8SNodeInfo 的 case class,程式碼如下:
final case class K8SNodeInfo(items: Seq[NodeItems])
implicit val K8SNODEINFO_JSON_FORMAT: RootJsonFormat[K8SNodeInfo] = jsonFormat1(K8SNodeInfo)
以下介紹 Ohara 主要使用了哪些 Kubernetes 的 Restful API:
POST /pods
Ohara 的設計主要是一個 pod 只會對應到一個 container。呼叫 pods 的目的是要收集所有在 kubernetes 的 container 狀態,像是環境變數, port mapping, 建立的時間....等等的資訊。
GET /nodes/${NodeName}
用來查詢 Kubernetes 的 node 詳細資訊。像是 node 的 IP, pull 了哪些的 docker image....等等的 node 資訊
Get /nodes
列出 Kubernetes 環境上有哪些 node
Get /namespaces/default/pods/${podName}/log
顯示 container 執行的 log 資訊
Post /namespaces/default/pods
在 kubernetes 的環境上,建立 pod
Delete /namespaces/default/pods/${pods}
用於刪除 pod,如果後面再加上 gracePeriodSeconds=0 的參數,代表要強制刪除 pod,主要的使用情境是在執行整合測試時,當 pod 執行完之後要快速的刪除 pod,減少執行等待的時間避免測試發生 timeout 的問題
今天已經介紹了,Ohara 使用了哪些 Kubernetes 的 Restful API。如果對於 Ohara 整合 Kubernetes 平台有興趣,可以參考 Ohara 官方的 K8SClient 程式碼,連結如下:
https://github.com/oharastream/ohara/blob/0.7.1/ohara-agent/src/main/scala/com/island/ohara/agent/k8s/K8SClient.scala