国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Java操作k8s api示例:使用kubeconfig文件認證;獲取所有pod;獲取pod內(nèi)應(yīng)用容器的啟動日志

這篇具有很好參考價值的文章主要介紹了Java操作k8s api示例:使用kubeconfig文件認證;獲取所有pod;獲取pod內(nèi)應(yīng)用容器的啟動日志。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

公司準(zhǔn)備將應(yīng)用容器化部署,先使用了華為云的 Kubernetes 服務(wù),后面又使用阿里云的 Kubernetes 服務(wù)。并短期一個月內(nèi)無法判斷走哪個云商。而作為一個在公司內(nèi)部用于應(yīng)用發(fā)布,部署的應(yīng)用。在對接完華為云的 Kubernetes 服務(wù) Api 后。再對接阿里云發(fā)現(xiàn)阿里云并沒用像華為云一樣對 Kubernetes 的 Api 做簡易的封裝。其兩者的區(qū)別是華為云可以通過 ak , sk 再加 Kubernetes Api 獲取數(shù)據(jù)??梢岳斫鉃槿A為云多了一層代理。

添加依賴

本篇使用的是官方維護的 Kubernetes Java Client 包 。有興趣的可以了解下面的社區(qū)維護版

官方 SDK

官方 JAVA SDK GitHub

建議使用最新版本 maven 中央倉庫 :

<dependency>
    <groupId>io.kubernetes</groupId>
    <artifactId>client-java</artifactId>
    <version>16.0.0</version>
</dependency>

準(zhǔn)備 kubeconfig 文件

用于配置集群訪問的文件稱為 kubeconfig 文件。默認情況下, kubectl 在 $HOME/.kube 目錄下查找名為 config 的文件。什么是 kubeconfig

阿里云

容器服務(wù) - Kubernetes 》 進入集群 》 集群信息 》 連接信息。復(fù)制內(nèi)容

華為云

云容器引擎 》 資源管理 》 集群管理 》 進入集群 》 基本信息右邊 kubectl 》 下載 kubectl 配置文件

可以使用 lens 工具管理 Kubernetes 集群

Java 連接 Kubernetes

首先將這個內(nèi)容文件重命名為 config 。

使用:官方例子獲取所有 NameSpaces 下的 Pod。

package io.kubernetes.client.examples;

import io.kubernetes.client.ApiClient;
import io.kubernetes.client.ApiException;
import io.kubernetes.client.Configuration;
import io.kubernetes.client.apis.CoreV1Api;
import io.kubernetes.client.models.V1Pod;
import io.kubernetes.client.models.V1PodList;
import io.kubernetes.client.util.ClientBuilder;
import io.kubernetes.client.util.KubeConfig;
import java.io.FileReader;
import java.io.IOException;

/**
 * A simple example of how to use the Java API from an application outside a kubernetes cluster
 *
 * <p>Easiest way to run this: mvn exec:java
 * -Dexec.mainClass="io.kubernetes.client.examples.KubeConfigFileClientExample"
 *
 */
public class KubeConfigFileClientExample {
  public static void main(String[] args) throws IOException, ApiException {

    //file path to your KubeConfig (看你自己 config 文件放哪)
    String kubeConfigPath = "~/.kube/config";

    // loading the out-of-cluster config, a kubeconfig from file-system
    ApiClient client =
        ClientBuilder.kubeconfig(KubeConfig.loadKubeConfig(new FileReader(kubeConfigPath))).build();

    // set the global default api-client to the in-cluster one from above
    Configuration.setDefaultApiClient(client);

    // the CoreV1Api loads default api-client from global configuration.
    CoreV1Api api = new CoreV1Api();

    // invokes the CoreV1Api client
    V1PodList list = api.listPodForAllNamespaces(null, null, null, null, null, null, null, null, null);
    System.out.println("Listing all pods: ");
    for (V1Pod item : list.getItems()) {
      System.out.println(item.getMetadata().getName());
    }
  }
}

但我不想使用第三方云存儲如阿里云的 OSS 或者在 Jar 包的相對路徑下放置一份 config 文件。所以我會把這個文件放在 Jar 包內(nèi)。也就是我放在 resources 下的自建目錄 kubernetes 下,所以改動如下。

// 注意導(dǎo)包不要導(dǎo)錯了
// import sun.security.util.Resources;
BufferedReader reader = new BufferedReader(new InputStreamReader(Resources.class.getResourceAsStream("/kubernetes/config")));
ApiClient client = ClientBuilder.kubeconfig(KubeConfig.loadKubeConfig(reader)).build();

解釋:因為當(dāng)打成 Jar 包后,文件就在包內(nèi)部了。

而 new FileReader(path) 實例化內(nèi)部底層會 new File(path) 再獲取 InputStream 。而 File 這個路徑是相對于包的相對路徑,并不是指向包內(nèi)的文件。如果繼續(xù)使用會出現(xiàn) idea 跑項目時沒有問題,打包部署時出錯

初始化 ApiClient

因為有四個環(huán)境,不能像官方例子使用 Configuration.setDefaultApiClient() 設(shè)置默認 client

public class KubernetesUtil {
  public final static Map alyClusterMap = new HashMap(){
    {
      try {
         BufferedReader reader = IoUtil.getReader(new ClassPathResource("kubernetes/aly-dev-config").getInputStream(), "utf-8");
         put("DEV",ClientBuilder.kubeconfig(KubeConfig.loadKubeConfig(reader)).build());
         put("TEST",null);
         put("PRE",null);
         put("PROD",null);
      } catch (IOException e) {
         e.printStackTrace();
      }
    }
  };
}

例:獲取 pod 信息

首先通過 Client 獲取 CoreV1Api 對象用于調(diào)用相關(guān)接口

這里要提一句:Java Kubernetes SKD 操作 Api 不僅只有 CoreV1Api 這個類。如操作 Deployment 時用的是 AppsV1Api . 使用什么我是先到 Kubernetes Api 下找。然后將請求路徑在 SDK 源碼中查。如果有更好的方法,還請多多提點下 (●’?’●)

public static List getPodsByAppName(String appName,String env) {
    // 按需獲取所需要的 Client 
    CoreV1Api api = new CoreV1Api(KubernetesUtil.alyClusterMap.get(env));
    V1PodList list = null;
    try {
        list = api.listPodForAllNamespaces(null,null, null, "name="+appName+"-pod", null, null, null, null, null, null);
    } catch (ApiException e) {
        e.printStackTrace();
    }
    // JSONbject 是 Map 對象的實現(xiàn)類。來源是 Hutool 工具
    List jsonObjectList = list.getItems().parallelStream().map(m -> {
        JSONObject jsonObject = new JSONObject();
        jsonObject.putOnce("podName", m.getMetadata().getName());
        jsonObject.putOnce("podIp", m.getStatus().getPodIP());
        V1Container v1Container = m.getSpec().getContainers().get(0);
        String[] images = v1Container.getImage().split(":");
        jsonObject.putOnce("imageVersion", images[images.length - 1]);
        // 1048576 = 1024 * 1024 因為單位為 Byte 要轉(zhuǎn)換為 MB。 因為獲取到的是字節(jié),需要轉(zhuǎn)成 Mb
        jsonObject.putOnce("specification", String.format("CPU:%s | MEM:%s",
			v1Container.getResources().getLimits().get("cpu").getNumber(),
        	v1Container.getResources().getLimits().get("memory").getNumber().divide(new BigDecimal(1048576))));
        jsonObject.putOnce("podStatus", m.getStatus().getPhase());
        Optional.ofNullable(m.getStatus().getStartTime()).ifPresent(p -> {
            // 時間是 UTC 的零時區(qū)。不是東八區(qū)
            jsonObject.putOnce("startTime", p.plusHours(8).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        });
        return jsonObject;
    }).collect(Collectors.toList());
    return jsonObjectList;
}

例:獲取 pod 內(nèi) Java 啟動日志

因為業(yè)務(wù)要求日志是從上往下看的。所以日志這塊 Kubernetes 的參數(shù)有點不搭,所以就用 sinceSeconds 。意思是距離現(xiàn)在最近的多少秒日志

接口詳情

public static StartLogVO getAppServerLogs(int startDate,String env,String podName,String endLog){
    CoreV1Api api = new CoreV1Api(KubernetesUtil.alyClusterMap.get(env));
    StartLogVO startLogVO = new StartLogVO("",0,null);
    try {
        int now = (int)LocalDateTime.now().toEpochSecond(ZoneOffset.of("+8"));
        startLogVO.setStartDate(now +"");
        // 加 5 秒防止日志丟失
        int i =  now - startDate + 5;
        String logs = api.readNamespacedPodLog(podName, "default", null, null, null, null, "true", null, i, null, null);
        startLogVO.setLineNum(logs.substring(logs.length()-20));
		// 去除重復(fù)日志
        if(StrUtil.isNotBlank(endLog)){
            int end = logs.indexOf(endLog);
            if(end!=-1){
                logs = StrUtil.removePrefix(logs.substring(end),endLog);
            }
        }
        startLogVO.setLogs(Optional.ofNullable(logs).orElse(""));
    } catch (ApiException e) {
        e.printStackTrace();
    }
    return startLogVO;
}

總結(jié)

因為華為云通過 ak , sk 再加 Kubernetes Api 請求地址。我這邊僅需發(fā)起 HTTPS 請求就行。以至于對接阿里云還需要使用 Kubernetes 的 SDK 有些抗拒。還要載入 kubeconfig 文件。最后不想學(xué)阿里云例子通過調(diào)用系統(tǒng)命令 curl 。所以還是使用了,結(jié)果第一次使用就報 NoSuchMethodError kotlin.collections.ArraysKt.copyInto([B[BIII)[B 這個錯誤,一看報沒方法錯誤,趕緊看下 Mavne 引入的依賴版本。原來是公司父級定義了舊版本,導(dǎo)致引入的最新 SDK 版本內(nèi)的 Kotlin 版本被覆蓋了。于是在最外層 pom.xml 下重新定義了版本約束。之后就是開發(fā)的小細節(jié)問題了。

感覺 Kubernetes 的 SDK 包還是很厲害的。下次也不知道有沒有機會搞個 WebShell 連下 Pod 。


參考鏈接:https://guicai.work/after-post/java/Java%E6%93%8D%E4%BD%9CKubernetes文章來源地址http://www.zghlxwxcb.cn/news/detail-405809.html

到了這里,關(guān)于Java操作k8s api示例:使用kubeconfig文件認證;獲取所有pod;獲取pod內(nèi)應(yīng)用容器的啟動日志的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Devops系列二(使用helm chart,將java應(yīng)用發(fā)布部署至k8s的示例)

    Devops系列二(使用helm chart,將java應(yīng)用發(fā)布部署至k8s的示例)

    docker鏡像已經(jīng)有了,本文我們將接著演示如何使用helm部署應(yīng)用到k8s。 分為兩大部分: 制作helm chart,推送到私有倉庫nexus helm拉取chart,部署到k8s 要求你先安裝helm,隨便一臺linux機器即可,不要求你要有k8s或者docker環(huán)境。 這里,我刪除了沒用到的一些文件,最后保留的見下:

    2024年02月12日
    瀏覽(25)
  • K8S:Yaml文件詳解及編寫示例

    K8S:Yaml文件詳解及編寫示例

    (1)Kubernetes 支持 YAML 和 JSON 格式管理資源對象 (2)JSON 格式:主要用于 api 接口之間消息的傳遞 (3)YAML 格式:用于配置和管理,YAML 是一種簡潔的非標(biāo)記性語言,內(nèi)容格式人性化,較易讀 (1)大小寫敏感 (2)使用縮進表示層級關(guān)系 (3)不支持Tab鍵制表符縮進,只使用

    2024年02月04日
    瀏覽(23)
  • java 對接 k8s API、K8s基本架構(gòu)、k8s常用命令

    引言: 當(dāng)容器部署涉及到 多個節(jié)點 服務(wù)器,用docker、docker-compose 來部署就不是那么方便了,不能統(tǒng)一控制,不方便伸縮,配置統(tǒng)一管理、版本控制;當(dāng)我們業(yè)務(wù)涉及到集群容器部署時,就考慮K8s、K3s 來實現(xiàn)。 k8s 架構(gòu)組成: (一)Master :apiserver、scheduler、controller-manager 以

    2024年02月16日
    瀏覽(28)
  • 輕松掌握K8S使用kubectl操作配置文件掛載ConfigMap和密鑰Secret知識點05

    輕松掌握K8S使用kubectl操作配置文件掛載ConfigMap和密鑰Secret知識點05

    1、掛載應(yīng)用配置文件配置集ConfigMap 當(dāng)有許多應(yīng)用如redis、mysql,希望將它的配置文件掛載出去,以便隨時修改,可以用ConfigMap配置集 具體用法查看使用命令行操作里的 3、ConfigMap配置集實戰(zhàn) 2、掛載應(yīng)用配置文件的敏感信息Secret Secret 對象類型用來保存敏感信息,例如使用ya

    2024年02月16日
    瀏覽(26)
  • Kind創(chuàng)建k8s - JAVA操作控制

    Kind創(chuàng)建k8s - JAVA操作控制

    kind 是 Kubernetes in Docker 的簡寫,是一個使用 Docker 容器作為 Nodes,在本地創(chuàng)建和運行 Kubernetes 群集的工具。適用于在本機創(chuàng)建 Kubernetes 群集環(huán)境進行開發(fā)和測試。 官網(wǎng):https://kind.sigs.k8s.io/ kind 由以下組件構(gòu)成: Go packages implementing cluster creation, image build, etc. A command line interfac

    2024年02月03日
    瀏覽(22)
  • 【Kubernetes】使用Kubeshark監(jiān)控K8s集群的API流量

    ????????Kubeshark 是一款針對?Kubernetes 的 API 流量分析器,提供對 Kubernetes 內(nèi)部網(wǎng)絡(luò)的實時協(xié)議級可見性,捕獲和監(jiān)控進出容器、Pod、節(jié)點和集群的所有流量和有效負載。 ? ? ? ? Kubeshark 的安裝和運行很簡單,安裝之前,我們需要先聯(lián)網(wǎng)下載一個二進制文件(當(dāng)前最新版:

    2024年02月11日
    瀏覽(33)
  • 【kubernetes】Java操作k8s-API

    【kubernetes】Java操作k8s-API

    提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 提示:這里可以添加本文要記錄的大概內(nèi)容: 在K8s平臺上,我們可以使用kubectl命令對Deployment、pod、Service等資源進行增刪改查。本文章將提供一些Java代碼操作API方式實現(xiàn)與集群交互,來創(chuàng)建、更新、刪

    2024年04月13日
    瀏覽(22)
  • k8s系列-kuboard 該操作平臺的使用操作

    k8s系列-kuboard 該操作平臺的使用操作

    鏡像打包服務(wù)器 賬號ip地址 用戶 密碼 端口 docker倉庫鏡像存儲目錄(命名空間) 倉庫地址 賬戶 密碼 K8s平臺 賬號: 密碼: 網(wǎng)絡(luò)配置:DNS 平臺地址: 數(shù)據(jù)庫mysql 賬號: 密碼: 數(shù)據(jù)庫地址: 1.集群導(dǎo)入 集群導(dǎo)入中的基本信息查看集群當(dāng)前健康狀態(tài) 套件是導(dǎo)入K8S集群的信息文件

    2024年04月18日
    瀏覽(26)
  • K8S之kubectl命令詳解及示例

    目錄 1、查看類命令 2、操作類命令 3、進階命令操作 4、kubectl replace 重啟pod的四種方法 5、kubectl語法 # 獲取節(jié)點和服務(wù)版本信息 kubectl get nodes # 獲取節(jié)點和服務(wù)版本信息,并查看附加信息 kubectl get nodes -o wide # 獲取pod信息,默認是default名稱空間 kubectl get pod # 獲取pod信息,默認

    2024年02月01日
    瀏覽(44)
  • k8s rancher開源平臺(概念,部署示例,)

    目錄 一、概念 Rancher 與 Kubernetes 的區(qū)別 Rancher 的關(guān)鍵特性 二、Rancher 安裝及配置 實驗環(huán)境 安裝 Rancher 登錄 Rancher 平臺 管理已存在的 Kubernetes 集群 導(dǎo)入 Kubernetes 集群到 Rancher 驗證 Kubernetes 集群狀態(tài) 部署監(jiān)控系統(tǒng) 部署監(jiān)控系統(tǒng)到 Rancher 啟用監(jiān)控: 使用 Rancher 儀表盤管理 Kuber

    2024年04月09日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包