Kubernetes官方java客戶端之五:proto基本操作

      網友投稿 691 2022-05-29

      歡迎訪問我的GitHub

      https://github.com/zq2599/blog_demos

      內容:所有原創文章分類匯總及配套源碼,涉及Java、Docker、Kubernetes、DevOPS等;

      概覽

      本文是《Kubernetes官方java客戶端》系列的第五篇,以下提到的

      java客戶端

      都是指

      client-jar.jar

      經過前面四篇文章的準備和嘗試,我們對java客戶端有了初步了解,也成功運行了hello world,接下來要做的是繼續深入學習和實踐,掌握這門利器;

      兩個主要脈絡

      java客戶端的基本功能并不復雜,就是以何種手段發起對K8S資源的增刪改查請求,把握以下兩個主脈絡即可:

      proto主線

      :用K8S官方的protobuf定義將各種資源生成java類,用少量API處理這些對象(特點,API極少,每個API都通用,處理所有類型的資源對象);

      openapi主線

      :使用openapi工具,將所有資源都自動生成增刪改查的API(特點:API極多,每個資源都有自身的API);

      今天的文章咱們來學習和了解

      proto主線

      proto主線的核心類ProtoClient

      前面曾提到proto主線的特點是API極少,咱們來看看這些少量的API的源頭:

      ProtoClient類

      如上圖所示,ProtoClient提供了增刪改查接口,我們可以用這些接口實現對K8S資源的操作;

      有了接口,接下來要搞清楚參數怎么準備,先看create方法的源碼,看它需要什么樣的參數:

      如上圖所示,create方法的第一個參數就是

      K8S資源類

      ,該類的特性是在泛型中約束的,必須實現

      com.google.protobuf.Message

      的子接口;

      這些入參Message的子類從哪里來呢?例如我們要創建一個NameSpace的時候,是自己寫一個Message子類?還是說哪里有現成的?接下來要做的就是搞清楚K8S資源類來自哪里?畢竟所有K8S資源的操作都要用上這些java類;

      一起去

      java客戶端

      的源碼尋找線索,這是父子結構的maven工程,在名為

      client-java-proto

      的子工程中,它的README文件給出了線索,地址是:https://github.com/kubernetes-client/java/tree/master/proto ,如下圖:

      上圖紅框中的操作向我們揭示了整個過程:先去下載另一個github倉庫,然后此倉庫里有腳本generate.sh,該腳本根據protobuf配置生成java類,這些java文件被放置在

      java/proto/src/main/java

      目錄下;

      本文是學習K8S官方java客戶端的文章,有關K8S的protobuf詳情不在這里展開,只給出一段關鍵腳本供您參考,這是根據proto自動生成代碼時執行的腳本,用于下載protobuf文件,地址:https://github.com/kubernetes-client/gen/blob/master/proto/dependencies.sh ,如下圖:

      上圖紅框中的地址是:https://raw.githubusercontent.com/kubernetes//api/master/rbac/v1alpha1/generated.proto ,內容如下,java客戶端中的java代碼就是根據這些內容生成的:

      結合前面的分析,再回到java客戶端源碼的子工程

      client-java-proto

      ,可以找到generate.sh腳本生成的V1.java,這個java文件里面有V1版本的所有protobuf對象,如下圖:

      上圖紅框中

      Namespace

      類是GeneratedMessageV3的子類,來看下GeneratedMessageV3的繼承關系,如下圖,該類實現了Message接口,滿足ProtoClient.create方法對入參的泛型約束:

      小結

      ProtoClient類提供的操作K8S資源的增刪改查方法;

      java客戶端的client-java-proto子工程內,有通過K8S官方protobuf生成的對象類,這些類就是ProtoClient的增刪查用到的參數;

      增刪改查方法有了,涉及的對象也有了,接下來可以實戰了;

      實戰前的準備

      現在還不能馬上寫代碼,還差最后一個準備步驟:

      確認API參數

      假設實戰的內容是查詢kube-system這個namespace下面的所有pod列表,那么API相關信息在哪獲取:

      Kubernetes官方java客戶端之五:proto基本操作

      打開API在線文檔,我這里K8S版本是1.15,地址是:https://v1-15.docs.kubernetes.io/docs/reference/generated/kubernetes-api/v1.15/

      如下圖,紅框1是pod列表的接口文檔,紅框2顯示了該URL,有了這個URL我們可以編碼了:

      在今后的操作中,所有資源都可以根據該文檔找到對應的API信息,輔助我們編碼;

      終于,可以開始實戰了;

      源碼下載

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

      這個git項目中有多個文件夾,本章的應用在

      kubernetesclient

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

      開始編碼

      打開《Kubernetes官方java客戶端之一:準備 》中創建的kubernetesclient工程,在里面新建子工程

      protobufclient

      ,其pom.xml內容如下,要注意的是spring-boot-starter-json已經被排除,因此序列化工具會變為Gson(原本默認是jackson):

      4.0.0 com.bolingcavalry kubernetesclient 1.0-SNAPSHOT ../pom.xml com.bolingcavalry protobufclient 0.0.1-SNAPSHOT protobufclient Demo project for protobuf 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

      新增

      ProtobufApplication.java

      ,這是新工程的引導類,也有通過ProtoClient查詢pod列表的代碼:

      package com.bolingcavalry.protobufclient; import com.google.gson.GsonBuilder; import io.kubernetes.client.ProtoClient; import io.kubernetes.client.ProtoClient.ObjectOrStatus; import io.kubernetes.client.openapi.ApiClient; import io.kubernetes.client.proto.Meta; import io.kubernetes.client.proto.V1.Namespace; import io.kubernetes.client.proto.V1.PodList; 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 java.io.FileReader; @SpringBootApplication @RestController @Slf4j public class ProtobufApplication { public static void main(String[] args) { SpringApplication.run(ProtobufApplication.class, args); } /** * 根據配置文件創建ProtoClient實例 * @return * @throws Exception */ private ProtoClient buildProtoClient() throws Exception { // 存放K8S的config文件的全路徑 String kubeConfigPath = "/Users/zhaoqin/temp/202007/05/config"; // 以config作為入參創建的client對象,可以訪問到K8S的API Server ApiClient client = ClientBuilder .kubeconfig(KubeConfig.loadKubeConfig(new FileReader(kubeConfigPath))) .build(); // 創建操作類 return new ProtoClient(client); } @RequestMapping(value = "/createnamespace/{namespace}", method = RequestMethod.GET) public ObjectOrStatus createnamespace(@PathVariable("namespace") String namespace) throws Exception { // 創建namespace資源對象 Namespace namespaceObj = Namespace.newBuilder().setMetadata(Meta.ObjectMeta.newBuilder().setName(namespace).build()).build(); // 通過ProtoClient的create接口在K8S創建namespace ObjectOrStatus ns = buildProtoClient().create(namespaceObj, "/api/v1/namespaces", "v1", "Namespace"); // 使用Gson將集合對象序列化成JSON,在日志中打印出來 log.info("ns info \n{}", new GsonBuilder().setPrettyPrinting().create().toJson(ns)); return ns; } @RequestMapping(value = "/pods/{namespace}", method = RequestMethod.GET) public ObjectOrStatus pods(@PathVariable("namespace") String namespace) throws Exception { // 通過ProtoClient的list接口獲取指定namespace下的pod列表 ObjectOrStatus pods = buildProtoClient().list(PodList.newBuilder(), "/api/v1/namespaces/" + namespace + "/pods"); // 使用Gson將集合對象序列化成JSON,在日志中打印出來 log.info("pod info \n{}", new GsonBuilder().setPrettyPrinting().create().toJson(pods)); return pods; } }

      上述代碼展示了ProtoClient的API的用法,一個是獲取pod列表,一個是創建namespace;

      驗證

      確保K8S環境的config文件在本地可以訪問(代碼中kubeConfigPath變量的值);

      運行ProtobufApplication;

      先嘗試獲取

      kube-system

      這個namespace下的所有pod列表,在瀏覽器訪問:http://localhost:8080/pods/kube-system ,響應如下圖,紅框中的items_數組就是所有pod信息:

      上圖中的

      items_

      數組,展開一個卻name字段是byte數組,沒辦法看出真實內容:

      借助IDEA的斷點功能,可以看清上述

      name_

      字段的內容,如下圖:

      再來試試創建namespace的功能,瀏覽器執行:http://localhost:8080/createnamespace/aaabbbccc ,就會創建名為

      aaabbbccc

      的namespace,并將

      ProtoClient.create

      的返回信息展現到瀏覽器上:

      SSH登錄上K8S服務器,查看namespace,如下圖紅框,可以見到新增的namespace:

      驗證完成,基于ProtoClient的API和K8S官方的在線API文檔,我們可以輕松操作K8S環境;

      ProtoClient的短板

      ProtoClient的短板其實在前面已經提到了,如下圖紅框4所示,在線API文檔中提到查詢pod列表的時候可以輸入一些參數(例如過濾條件),但是ProtoClient提供的API咱們也看過了,并不支持輸入查詢參數:

      來看下ProtoClient請求K8S Api service的核心代碼,如下圖紅框所示,

      請求參數字段已經寫死

      ,所以外面調用ProtoClient的API時根本沒辦法把參數傳進來:

      咱們可以參考上述代碼自己寫一段,把紅框位置改為API文檔中指定的參數,但是,這樣似乎略微麻煩,還有更好的辦法嗎?

      當然有,敬請期待下一篇,一起學習和實戰openapi主線;

      Java K8s Kubernetes

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:Python只需要三十行代碼,打造一款簡單的人工語音對話
      下一篇:政務區塊鏈平臺設計思路
      相關文章
      亚洲av无码专区在线电影天堂| 亚洲视频在线观看网址| 亚洲毛片免费观看| 久久精品国产亚洲77777| 亚洲AV无码久久精品蜜桃| 国产亚洲精品福利在线无卡一| 亚洲精品无码久久久久AV麻豆| 亚洲乱妇熟女爽到高潮的片| 亚洲色在线无码国产精品不卡| 成人亚洲国产va天堂| 亚洲伦理中文字幕| 亚洲看片无码在线视频| 亚洲永久网址在线观看| 亚洲小说图区综合在线| 久久精品国产亚洲AV电影网| 国产亚洲综合久久| 亚洲国产成人乱码精品女人久久久不卡 | 亚洲国产专区一区| 亚洲毛片网址在线观看中文字幕| 久久久久亚洲AV成人网人人软件| 狠狠综合久久综合88亚洲| 亚洲色无码一区二区三区| 亚洲国产精品无码AAA片| 亚洲福利在线观看| 久久综合亚洲色一区二区三区| 亚洲精品国产福利片| 亚洲丰满熟女一区二区v| 亚洲天然素人无码专区| 亚洲AV成人无码网站| 亚洲国产综合久久天堂| 亚洲精品乱码久久久久久自慰| 亚洲AV成人片色在线观看| 亚洲国产精品张柏芝在线观看| 国产精品亚洲专区在线观看| 亚洲av无码兔费综合| 亚洲美日韩Av中文字幕无码久久久妻妇| 亚洲一区精品无码| 精品亚洲国产成AV人片传媒| 久久精品国产99国产精品亚洲| 亚洲AV日韩AV一区二区三曲| 亚洲日韩中文字幕日韩在线|