k8s管理不僅提供了命令行工具,還提供了完整的rest api接口供用戶使用,其dashboard就是基于該api接口實現的,我們可以通過這些api實現自定義的管理及監控等功能,本文我們使用java實現最基本的接口調用。
實現過程
配置文件
進入 master節點,導出k8s證書config文件
cd /root/.kube
sz config #下載該文件
然后我們將文件改名為k8s.config,復制到java項目resource的config目錄中供使用
java 引用
springboot pom文件中添加以下依賴:
<dependency>
<groupId>io.kubernetes</groupId>
<artifactId>client-java</artifactId>
<version>7.0.0</version>
<scope>compile</scope>
</dependency>
程序開發
新建一k8sController
@RequestMapping("/getPods")
public String getPods(){
try
{
ApiClient client = ClientBuilder.kubeconfig(KubeConfig.loadKubeConfig(new FileReader(k8sConfigFile))).build();
Configuration.setDefaultApiClient(client);
CoreV1Api api = new CoreV1Api();
V1PodList list = api.listPodForAllNamespaces(null,null,null,null,null,null,null,null,null);
StringBuilder str = new StringBuilder();
for (V1Pod item : list.getItems()) {
str.append(item.toString());
str.append("\n");
}
return str.toString();
}
catch(Exception ex) {
log.error(ex.toString());
return "Error:"+ex.getMessage();
}
}
部署驗證
部署該程序到k8s環境,然后通過瀏覽器訪問驗證:
通過api獲取k8s資源
總結
k8s的api提供幾乎所有k8s的信息獲取及操作,通過其api我們甚至可以自行開發一套管理平臺,主動化+自動化+智能化是IT運維變革的方向,而傳統的命令行模式支撐略有不足,API恰好彌補了這一短板,剩下的就要看內部開發及集成能力發揮的程度。
附相關接口地址
以下內容引用自http://www.lxweimin.com/p/a25e9e613f2c
/api/v1/proxy/nodes/{name}/pods/ #列出指定節點內所有Pod的信息
/api/v1/proxy/nodes/{name}/stats/ #列出指定節點內物理資源的統計信息
/api/v1/prxoy/nodes/{name}/spec/ #列出指定節點的概要信息
/api/v1/proxy/nodes/{name}/run #在節點上運行某個容器
/api/v1/proxy/nodes/{name}/exec #在節點上的某個容器中運行某條命令
/api/v1/proxy/nodes/{name}/attach #在節點上attach某個容器
/api/v1/proxy/nodes/{name}/portForward #實現節點上的Pod端口轉發
/api/v1/proxy/nodes/{name}/logs #列出節點的各類日志信息
/api/v1/proxy/nodes/{name}/metrics #列出和該節點相關的Metrics信息
/api/v1/proxy/nodes/{name}/runningpods #列出節點內運行中的Pod信息
/api/v1/proxy/nodes/{name}/debug/pprof #列出節點內當前web服務的狀態,包括CPU和內存的使用情況
/api/v1/proxy/namespaces/{namespace}/pods/{name}/{path:*} #訪問pod的某個服務接口
/api/v1/proxy/namespaces/{namespace}/pods/{name} #訪問Pod
#以下寫法不同,功能一樣
/api/v1/namespaces/{namespace}/pods/{name}/proxy/{path:*} #訪問pod的某個服務接口
/api/v1/namespaces/{namespace}/pods/{name}/proxy #訪問Pod
/api/v1/proxy/namespaces/{namespace}/services/{name}