Kubernetes官方java客戶端之六:OpenAPI基本操作

      網(wǎng)友投稿 896 2022-05-30

      歡迎訪問我的GitHub

      https://github.com/zq2599/blog_demos

      內(nèi)容:所有原創(chuàng)文章分類匯總及配套源碼,涉及Java、Docker、Kubernetes、DevOPS等;

      概覽

      本文是《Kubernetes官方j(luò)ava客戶端》系列的第六篇,以下提到的

      java客戶端

      都是指

      client-jar.jar

      前文《Kubernetes官方j(luò)ava客戶端之五:proto基本操作 》已經(jīng)提到,java客戶端的基本功能由兩個主要脈絡(luò)組成,第一個是

      proto

      ,主要功能是使用

      ProtoClient

      類提供的增刪改查接口,這些接口用到的入?yún)⒑头祷貙ο笏婕暗降膉ava類,都是通過K8S的protobuf生成的;

      除了使用ProtoClient對K8S資源進行增刪改查,還提供了另一種更強大的方式:OpenAPI,本章咱們就來一起學(xué)習(xí)OpenAPI相關(guān)的操作;

      K8S的OpenAPI

      先拋開java客戶端不提,咱們來看看K8S本身的OpenAPI,地址是:https://kubernetes.io/zh/docs/concepts/overview/kubernetes-api/ ,關(guān)鍵信息如下圖所示,可見K8S提供了OpenAPI規(guī)范:

      如果您想查看當(dāng)前K8S環(huán)境的OpenAPI規(guī)范,請打開K8S環(huán)境的/etc/kubernetes/manifests/kube-apiserver.yaml文件,增加下圖紅框中的內(nèi)容:

      修改完畢后請稍候,系統(tǒng)會根據(jù)文件的變化自動更新(

      千萬不要執(zhí)行kubectl apply -f kube-apiserver.yaml

      ,這會導(dǎo)致新建api-server的pod,由于端口占用而啟動失敗);

      假設(shè)宿主機IP地址是192.168.50.135,那么在瀏覽器上訪問:http://192.168.50.135:8080/openapi/v2,就能得到所有OpenAPI信息如下圖:

      上圖的原始數(shù)據(jù)沒有可讀性,復(fù)制到在線JSON格式化網(wǎng)站,得到的內(nèi)容如下圖,例如查詢pod列表的API信息已經(jīng)非常詳細了:

      以上就是對K8S的OpenAPI簡介,接下來回到

      java客戶端

      本身,看看它提供了哪些OpenAPI相關(guān)的能力;

      java客戶端的OpenAPI

      打開java客戶端工程的源碼如下圖,紅框1就是和OpenAPI相關(guān)的子工程,提供服務(wù)的功能類都在紅框2的package中,也就是說,依靠紅框2中的API以及紅框3中的數(shù)據(jù)結(jié)構(gòu),我們可以完成大部分K8S資源控制相關(guān)的操作:

      打開常用的

      CoreV1Api.java

      ,如下圖紅框,頂部的注釋已經(jīng)說明了一切:這些代碼都是工具生成的(至于如何生成就不在本文中討論了):

      如果您下載了java客戶端源碼,可以在client-java-api這個子工程中看到完整的OpenAPI接口文檔:

      前文《Kubernetes官方j(luò)ava客戶端之五:proto基本操作 》的代碼中,咱們嘗試過獲取pod列表,但是ProtoClient的已有API不支持提交更詳細的業(yè)務(wù)參數(shù),此時選擇OpenAPI接口即可輸入詳細的業(yè)務(wù)參數(shù),接口詳細信息可以在文檔中查到,還帶有完整的demo代碼,如下圖所示:

      上圖中的

      listNamespacedPod

      接口有兩個重要參數(shù):

      fieldSelector

      labelSelector

      ,這是過濾用的,詳細的用法請參考K8S官方文檔,地址是:https://kubernetes.io/docs/concepts/overview/working-with-objects/ ,如下圖紅框:

      弄清楚了K8S的OpenAPI規(guī)范,以及java客戶端依據(jù)此規(guī)范生成的API服務(wù),還有詳細的接口文檔在手,可以編碼實戰(zhàn)了;

      源碼下載

      如果您不想編碼,可以在GitHub下載所有源碼,地址和鏈接信息如下表所示(https://github.com/zq2599/blog_demos):

      這個git項目中有多個文件夾,本章的應(yīng)用在

      kubernetesclient

      文件夾下,如下圖紅框所示:

      開始編碼

      打開《Kubernetes官方j(luò)ava客戶端之一:準(zhǔn)備 》中創(chuàng)建的

      kubernetesclient

      工程,在里面新建子工程

      openapi

      ,其pom.xml內(nèi)容如下,要注意的是spring-boot-starter-json已經(jīng)被排除,因此序列化工具會變?yōu)镚son(原本默認是jackson):

      4.0.0 com.bolingcavalry kubernetesclient 1.0-SNAPSHOT ../pom.xml com.bolingcavalry openapi 0.0.1-SNAPSHOT openapi Demo project for openapi client jar org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-json org.projectlombok lombok true io.kubernetes client-java org.springframework.boot spring-boot-maven-plugin 2.3.0.RELEASE

      新增OpenAPIDemoApplication.java,這是新工程的引導(dǎo)類,也有兩個web接口,一個創(chuàng)建namespace,另一個按照namespace查詢pod列表,關(guān)鍵位置已添加了注釋,就不多贅述了:

      package com.bolingcavalry.openapi; import com.google.gson.GsonBuilder; import io.kubernetes.client.openapi.ApiClient; import io.kubernetes.client.openapi.ApiException; import io.kubernetes.client.openapi.Configuration; import io.kubernetes.client.openapi.apis.CoreV1Api; import io.kubernetes.client.openapi.models.V1Namespace; import io.kubernetes.client.openapi.models.V1NamespaceBuilder; import io.kubernetes.client.openapi.models.V1PodList; import io.kubernetes.client.util.ClientBuilder; import io.kubernetes.client.util.KubeConfig; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import javax.annotation.PostConstruct; import java.io.FileReader; @SpringBootApplication @RestController @Slf4j public class OpenAPIDemoApplication { public static void main(String[] args) { SpringApplication.run(OpenAPIDemoApplication.class, args); } /** * 默認的全局設(shè)置 * @return * @throws Exception */ @PostConstruct private void setDefaultApiClient() throws Exception { // 存放K8S的config文件的全路徑 String kubeConfigPath = "/Users/zhaoqin/temp/202007/05/config"; // 以config作為入?yún)?chuàng)建的client對象,可以訪問到K8S的API Server ApiClient client = ClientBuilder .kubeconfig(KubeConfig.loadKubeConfig(new FileReader(kubeConfigPath))) .build(); // 創(chuàng)建操作類 Configuration.setDefaultApiClient(client); } @RequestMapping(value = "/openapi/createnamespace/{namespace}", method = RequestMethod.GET) public V1Namespace createnamespace(@PathVariable("namespace") String namespace) throws Exception { CoreV1Api coreV1Api = new CoreV1Api(); V1Namespace v1Namespace = new V1NamespaceBuilder() .withNewMetadata() .withName(namespace) .endMetadata() .build(); V1Namespace ns = coreV1Api.createNamespace(v1Namespace, null, null, null); // 使用Gson將集合對象序列化成JSON,在日志中打印出來 log.info("ns info \n{}", new GsonBuilder().setPrettyPrinting().create().toJson(ns)); return ns; } @RequestMapping(value = "/openapi/pods/{namespace}", method = RequestMethod.GET) public V1PodList pods(@PathVariable("namespace") String namespace) throws ApiException { CoreV1Api apiInstance = new CoreV1Api(); // String | If 'true', then the output is pretty printed. String pretty = null; // 訂閱事件相關(guān)的參數(shù),這里用不上 Boolean allowWatchBookmarks = false; // 連續(xù)查找的標(biāo)志,類似于翻頁 String _continue = null; // 字段選擇器 String fieldSelector = "status.phase=Running"; // 根據(jù)標(biāo)簽過濾 // String labelSelector = "component=kube-apiserver"; String labelSelector = null; Integer limit = null; String resourceVersion = null; Integer timeoutSeconds = null; Boolean watch = false; V1PodList v1PodList = apiInstance.listNamespacedPod(namespace, pretty, allowWatchBookmarks, _continue, fieldSelector, labelSelector, limit, resourceVersion, timeoutSeconds, watch); // 使用Gson將集合對象序列化成JSON,在日志中打印出來 log.info("pod info \n{}", new GsonBuilder().setPrettyPrinting().create().toJson(v1PodList)); return v1PodList; } }

      OpenAPIDemoApplication

      運行起來,先測試創(chuàng)建

      namespace

      的服務(wù),在瀏覽器訪問:http://localhost:8080/openapi/createnamespace/dddeeefff ,瀏覽器返回信息如下圖:

      SSH登錄K8S主機,執(zhí)行命令查看namespace,如下圖紅框,已經(jīng)創(chuàng)建成功:

      再試試Pod列表,地址是 :http://localhost:8080/openapi/pods/kube-system ,如下圖:

      Kubernetes官方j(luò)ava客戶端之六:OpenAPI基本操作

      至此,OpenAPI接口的實踐就完成了,現(xiàn)在已將java客戶端的最基本的功能都實踐過了,接下來的文章咱們將開始學(xué)習(xí)精彩的高級功能;

      Java K8s Kubernetes

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:用DevCloud研發(fā)一款A(yù)PP,這6大優(yōu)勢能提高交付效率
      下一篇:AI提取圖片里包含的文字信息-解決文字無法復(fù)制的痛點【玩轉(zhuǎn)華為云】
      相關(guān)文章
      国产亚洲精品a在线无码| 亚洲AⅤ视频一区二区三区| 国产亚洲精品激情都市| 亚洲成a人片在线不卡一二三区| 国产精品亚洲综合五月天| 亚洲精品美女久久久久| 亚洲2022国产成人精品无码区| 亚洲精品乱码久久久久久按摩| 亚洲精品成人区在线观看| 在线观看免费亚洲| WWW国产亚洲精品久久麻豆| 337P日本欧洲亚洲大胆精品| 亚洲人成色4444在线观看| 亚洲中文字幕一区精品自拍| 亚洲人成色在线观看| 亚洲av无码一区二区三区在线播放| 亚洲AV一区二区三区四区| 亚洲乱码国产乱码精华| 亚洲丶国产丶欧美一区二区三区| 亚洲AV无码专区国产乱码不卡| 成人亚洲综合天堂| 亚洲日韩在线第一页| 亚洲日韩欧洲无码av夜夜摸| 亚洲狠狠婷婷综合久久久久| 亚洲成A人片在线观看WWW| 亚洲成人中文字幕| 亚洲男人的天堂在线| 亚洲人成毛片线播放| 亚洲午夜一区二区三区| 亚洲精品无码高潮喷水A片软| 成人婷婷网色偷偷亚洲男人的天堂 | 久久亚洲AV成人无码电影| 亚洲视频一区网站| 亚洲人成免费电影| 亚洲人成电影网站免费| 内射无码专区久久亚洲 | 亚洲精品视频在线观看免费| 亚洲天堂中文字幕在线观看| 国内精品久久久久影院亚洲 | 国产成人综合亚洲绿色| 久久精品亚洲乱码伦伦中文|