日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java api 操作helm

發(fā)布時(shí)間:2023/12/20 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java api 操作helm 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • java api 操作helm
    • 一、helm架構(gòu)在云管理平臺開發(fā)中的不足
    • 二、captain介紹
      • 安裝captain
      • 卸載captain
      • chart repo問題
    • 三、命令行安裝mongodb案例
    • 四、java api操作helm
      • 依賴
      • 創(chuàng)建mongo
      • 測試創(chuàng)建結(jié)果
      • 刪除mongo
      • 測試刪除結(jié)果
      • 更新helm
      • 創(chuàng)建CharRepo倉庫
      • 刪除ChartRepo倉庫
    • 五、java代碼操作helm命令
      • helm客戶端安裝
      • 通過代碼操作helm命令

java api 操作helm

一、helm架構(gòu)在云管理平臺開發(fā)中的不足

helm至今為止,官方仍然沒有g(shù)a版的api。chart的下載,部署,升級,卸載,全部依賴cli。在多集群環(huán)境下cli很難滿足平臺的業(yè)務(wù)要求。

通過查看github issue,社區(qū)大概有兩種解決思路:

  • 封裝cli成api。這種方式仍然存在每個(gè)集群需要通過ssh或者ansible的方式部署helm二進(jìn)制文件到master節(jié)點(diǎn)上,給底層部署工作添加負(fù)擔(dān)
  • CRD。將helm的核心能力打包成docker鏡像,部署到k8s集群中,以controller的方式提供能力。利用crd的方式完成release的部署,卸載,升級,回滾等業(yè)務(wù)動作

cli方式最大的問題就在于不符合云原生的思想,而且cli的方式和helm版本鎖定,如果要升級helm,需要重新適配解析console內(nèi)容。 crd的問題在于,官方目前還沒有g(shù)a。但仍然期待controller的方式

在github搜索helm controller,發(fā)現(xiàn)了兩個(gè)倉庫,一個(gè)是rancher提供的controller,一個(gè)是靈雀云提供的。經(jīng)過簡單的測試,captain一次性安裝并測試成功,并結(jié)合內(nèi)部的討論,最終決定基于captain進(jìn)行開發(fā)

二、captain介紹

github: https://github.com/alauda/captain

captain是靈雀云開源的helm v3 controller。其內(nèi)部依賴helm library。所以核心的邏輯與helm client是一致的。等到后期helm官方正式ga后,可以遷移回官方正式版本

安裝captain

kubectl create ns captain-system kubectl create clusterrolebinding captain --serviceaccount=captain-system:default --clusterrole=cluster-admin kubectl apply -n captain-system -f https://raw.githubusercontent.com/alauda/captain/master/artifacts/all/deploy.yaml

卸載captain

kubectl delete -n captain-system -f https://raw.githubusercontent.com/alauda/captain/master/artifacts/all/deploy.yaml kubectl delete ns captain-system

chart repo問題

captain默認(rèn)自帶stable的helm官方倉庫,helm官方的倉庫地址本身沒有問題,但是chart鏡像中如果使用了被墻了的docker鏡像,無法下載。測試的時(shí)候是使用的aliyun提供的倉庫地址https://developer.aliyun.com/hub/。這樣captain controller才能順利的將chart鏡像下載成功

當(dāng)測試結(jié)束時(shí),我們需要將k8s與內(nèi)網(wǎng)的chart私庫進(jìn)行打通,需要新建一個(gè)ChartRepo的yaml文件

apiVersion: app.alauda.io/v1alpha1 kind: ChartRepo metadata:name: bitnaminamespace: captain-system spec:url: https://charts.bitnami.com/bitnami

然后使用kubectl create -f fileName添加到k8s中,需要注意的是,我們使用了harbor做docker鏡像和helm鏡像的管理,因?yàn)閐ocker的問題,我們使用了自簽的證書,captain在根據(jù)地址同步的時(shí)候,會校驗(yàn)證書,這個(gè)問題我們也和官方進(jìn)行了溝通,得到了解決,目前captain已經(jīng)ga,可以直接使用,不需要擔(dān)心證書的問題。

這里我添加完成之后查看倉庫會發(fā)現(xiàn)沒有Synced,過一段時(shí)間之后就好啦

命令:

#添加chartRepo $ kubectl create -f fileName# 查看已經(jīng)添加成功了的chartRepo $ kubectl get ChartRepo -A

三、命令行安裝mongodb案例

在一個(gè)位置創(chuàng)建一個(gè)mongodb.yaml文件

apiVersion: "app.alauda.io/v1alpha1" kind: "HelmRequest" metadata:name: "mongodb-java-1" spec:chart: "stable/mongodb"namespace: "test-hl2"releaseName: "mongodb-java-1"version: "7.8.10"

參數(shù)解釋:

  • apiVersion,kind固定寫法

  • namespace:這個(gè)是值生成deployment之后放在kubernetes的那個(gè)命名空間

  • releaseName:生成deployment的名稱

  • version:版本號,這個(gè)是指chart version

  • chart:舉例stable/mongodb,前面是chartrepo的name,后面是repo的chart

然后在安裝chart

$ kubectl apply -f mongodb.yaml -n test-hl2

查看是否安裝成功

root@k8s1:~/huanglei/helm# kubectl get pods -n test-hl2 NAME READY STATUS RESTARTS AGE mongodb-java-1-7c76c88954-tkv8l 1/1 Running 0 54m root@k8s1:~/huanglei/helm# kubectl get hr -n test-hl2 NAME CHART VERSION NAMESPACE ALLCLUSTER PHASE AGE mongodb-java-1 stable/mongodb 7.8.10 test-hl2 Synced 65m

命令

# 這里hr是指HelmRequest # 查看chart方式是否部署成功 $ kubectl get hr -n test-hl2# 查看chart方式部署遇到的問題 $ kubectl describe hr mongodb-java-1 -n test-hl2# 刪除chart方式部署 $ kubectl delete hr mongodb-java-1 -n test-hl2

四、java api操作helm

依賴

<dependency><groupId>io.kubernetes</groupId><artifactId>client-java</artifactId><version>12.0.0</version><scope>compile</scope></dependency>

創(chuàng)建mongo

private static ApiClient getApiClient(){String master = "https://127.0.0.1:6443";String oauthToken = "eyJhbGciOiJSUzI1NiIsImtpZCI6InNRRi1VVFpmUE9nQ3VNc25kcVFXV29nVGZWN0hJX1N5WndHX1p4STc2a3cifQ.eyJpc3MiOVhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5jIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdWzhzIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiNWVlZjQ0MDQtYWY5OS00NDE4LTk2YTctZWFmYzlkNDJhNmYxIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOms4cyJ9.npRtUn7_AM0yPmdHdw6DEwKxNrapN76CKlNOkc8sWJcOuhCKHT-o58oRvg5_kDfCIZyfhV0UjepkLhq1xzP_mHbbUu8_u5SnTbpFhqslOoKywXsI17oDOIQk44nXyRkrGzsM4xNKN9kov4fzSpQqhHNGfXIMA1D0WGD2nZzh2CMklVhVzbWDDnLGgzhzBr9WNDuyBVXlJc40Tz_B0aTurxZ1yZ2P34VSK_vXW8mWWZxfCSRSf6L2vyHfKwhA4ogoqopHANwOpE0O1Fz8q50kclcyxc9a-GD3nPzYISLnGbDAsuKD4qEAi6QhnXVDdUEf9XYvzTvkBeTvL8g4YSGZrQ";ApiClient apiClient = new ClientBuilder()//設(shè)置 k8s 服務(wù)所在 ip地址.setBasePath(master)//是否開啟 ssl 驗(yàn)證.setVerifyingSsl(false)//插入訪問 連接用的 Token.setAuthentication(new AccessTokenAuthentication(oauthToken)).build();io.kubernetes.client.openapi.Configuration.setDefaultApiClient(apiClient);return apiClient;} @GetMapping("/create/chart")public String createChart() throws ApiException, JsonProcessingException {String name = "mongodb-java-6666";String namespace = "test-hl2";String chart = "bitnami/mongodb";String version = "11.0.4";JsonObjectBuilder build = new JsonObjectBuilder().set("rootUser", "admin").set("rootPassword", "admin123123");JsonObjectBuilder type = new JsonObjectBuilder().set("type", "NodePort");JsonObjectBuilder values = new JsonObjectBuilder().set("service", type).set("auth",build);JsonObject jsonObjectBuilder = new JsonObjectBuilder().set("apiVersion", "app.alauda.io/v1alpha1").set("kind", "HelmRequest").set("metadata", new JsonObjectBuilder().set("name", name).build()).set("spec", new JsonObjectBuilder().set("chart", chart).set("namespace", namespace).set("releaseName", name).set("values", values).set("version", version)).build();JsonNode jsonNode = new ObjectMapper().readTree(String.valueOf(jsonObjectBuilder));String s = new YAMLMapper().writeValueAsString(jsonNode);System.out.println(s);ApiClient apiClient = getApiClient();CustomObjectsApi customObjectsApi = new CustomObjectsApi(apiClient);Object result = customObjectsApi.createNamespacedCustomObject("app.alauda.io", "v1alpha1", namespace, "helmrequests", jsonObjectBuilder, "true", null, null);return "ok";}

注意:

public Object createNamespacedCustomObject(String group, String version, String namespace, String plural, Object body, String pretty, String dryRun, String fieldManager)

上面的幾個(gè)參數(shù)必須唯一:

  • group:app.alauda.io
  • version:v1alpha1
  • plural:helmrequests

測試創(chuàng)建結(jié)果

查看自定義設(shè)置的密碼是否創(chuàng)建成功

刪除mongo

@DeleteMapping("/delete/chart")public String deleteChart() throws ApiException {String namespace = "test-hl2";String name = "mongodb-java-2";CustomObjectsApi customObjectsApi = new CustomObjectsApi(getApiClient());customObjectsApi.deleteNamespacedCustomObject("app.alauda.io","v1alpha1",namespace,"helmrequests",name,0,null,null,null,new V1DeleteOptions().gracePeriodSeconds(0L).propagationPolicy("Foreground"));return "ok";}

測試刪除結(jié)果

原本這里是有倆個(gè)的,現(xiàn)在這里只有一個(gè)了表示刪除成功

更新helm

@GetMapping("/update/mongodb-sharded")public String updateChartMongo() throws JsonProcessingException, ApiException {String name = "mongodb-sharded-java-33";String namespace = "test-hl2";String chart = "bitnami/mongodb-sharded";String version = "4.0.6";ApiClient apiClient = getApiClient();CustomObjectsApi customObjectsApi = new CustomObjectsApi(apiClient);Object object = customObjectsApi.getNamespacedCustomObject("app.alauda.io", "v1alpha1", namespace,"helmrequests", name);String jsonStr = JSONUtil.toJsonStr(object);JSONObject jsonObject = JSONUtil.parseObj(jsonStr);JSONObject metadata = JSONUtil.parseObj(JSONUtil.toJsonStr(jsonObject.get("metadata")));String resourceVersion = (String)metadata.get("resourceVersion");JsonObjectBuilder type = new JsonObjectBuilder().set("type", "NodePort").set("nodePort","30010");JsonObjectBuilder resources = new JsonObjectBuilder().set("limits", new JsonObjectBuilder().set("cpu", "500m").set("memory","1Gi")).set("requests",new JsonObjectBuilder().set("cpu", "25m").set("memory","512Mi"));JsonObjectBuilder values = new JsonObjectBuilder().set("mongos",new JsonObjectBuilder().set("replicas","3").set("resources",resources)).set("mongodbRootPassword","root").set("service", type).set("resources",resources);JsonObject jsonObjectBuilder = new JsonObjectBuilder().set("apiVersion", "app.alauda.io/v1alpha1").set("kind", "HelmRequest").set("metadata", new JsonObjectBuilder().set("name", name).set("resourceVersion",resourceVersion).build()).set("spec", new JsonObjectBuilder().set("chart", chart).set("namespace", namespace).set("releaseName", name).set("values", values).set("version", version)).build();try {customObjectsApi.replaceNamespacedCustomObject("app.alauda.io","v1alpha1",namespace,"helmrequests",name,jsonObjectBuilder,null,null);} catch (ApiException e) {e.printStackTrace();}return "ok";}

注意:
這里需要先根據(jù)名稱和命名空間查出這個(gè)helm的resourceVersion他的值為多少,然后根據(jù)下圖的格式進(jìn)行賦值,這里通過java代碼查詢出來的,跟kubernetes看到的不一樣,填寫根據(jù)java代碼查詢出來的結(jié)果

創(chuàng)建CharRepo倉庫

@GetMapping("/create/chartRepo")public String createChartRepo() {CustomObjectsApi customObjectsApi = new CustomObjectsApi(getApiClient());JsonObject jsonObjectBuilder = new JsonObjectBuilder().set("apiVersion", "app.alauda.io/v1alpha1").set("kind", "ChartRepo").set("metadata", new JsonObjectBuilder().set("name", "hl").set("namespace","captain-system").build()).set("spec", new JsonObjectBuilder().set("url", "https://charts.bitnami.com/bitnami")).build();try {customObjectsApi.createNamespacedCustomObject("app.alauda.io", "v1alpha1", "captain-system", "chartrepos", jsonObjectBuilder, "true", null, null);} catch (ApiException e) {e.printStackTrace();}return "ok";}

結(jié)果測試:
這里就是需要等很長時(shí)間才會出現(xiàn)Synced的狀態(tài)

刪除ChartRepo倉庫

@DeleteMapping("/delete/chartRepo")public String deleteChartRepo() {CustomObjectsApi customObjectsApi = new CustomObjectsApi(getApiClient());try {customObjectsApi.deleteNamespacedCustomObject("app.alauda.io","v1alpha1","captain-system","chartrepos","hl",0,null,null,null,new V1DeleteOptions().gracePeriodSeconds(0L).propagationPolicy("Foreground"));} catch (ApiException e) {e.printStackTrace();}return "ok";}

查看結(jié)果:
這里可以看到?jīng)]有名字為hl的倉庫了

注意:

五、java代碼操作helm命令

java代碼操作helm命令,打包成鏡像,這個(gè)時(shí)候,鏡像里面沒有helm客戶端,需要掛載helm客戶端

helm客戶端安裝

手動下載安裝

#從官網(wǎng)下載最新版本的二進(jìn)制安裝包到本地:https://github.com/helm/helm/tags tar -zxvf helm-2.9.0.tar.gz # 解壓壓縮包 # 把 helm 指令放到bin目錄下 mv helm-2.9.0/helm /usr/local/bin/helm helm help # 驗(yàn)證

注意:這里一定需要放到/usr/local/bin/helm目錄下

通過代碼操作helm命令

部署鏡像

FROM java:8 MAINTAINER huanglei ADD helm-cmd.jar helm-middleware.jar CMD java -jar helm-middleware.jar COPY linux-amd64/helm /usr/local/bin/helm

總結(jié)

以上是生活随笔為你收集整理的java api 操作helm的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。