Java操作k8s api示例:使用kubeconfig文件认证;获取所有pod;获取pod内应用容器的启动日志

这篇具有很好参考价值的文章主要介绍了Java操作k8s api示例:使用kubeconfig文件认证;获取所有pod;获取pod内应用容器的启动日志。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

公司准备将应用容器化部署,先使用了华为云的 Kubernetes 服务,后面又使用阿里云的 Kubernetes 服务。并短期一个月内无法判断走哪个云商。而作为一个在公司内部用于应用发布,部署的应用。在对接完华为云的 Kubernetes 服务 Api 后。再对接阿里云发现阿里云并没用像华为云一样对 Kubernetes 的 Api 做简易的封装。其两者的区别是华为云可以通过 ak , sk 再加 Kubernetes Api 获取数据。可以理解为华为云多了一层代理。

添加依赖

本篇使用的是官方维护的 Kubernetes Java Client 包 。有兴趣的可以了解下面的社区维护版

官方 SDK

官方 JAVA SDK GitHub

建议使用最新版本 maven 中央仓库 :

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

准备 kubeconfig 文件

用于配置集群访问的文件称为 kubeconfig 文件。默认情况下, kubectl 在 $HOME/.kube 目录下查找名为 config 的文件。什么是 kubeconfig

阿里云

容器服务 - Kubernetes 》 进入集群 》 集群信息 》 连接信息。复制内容

华为云

云容器引擎 》 资源管理 》 集群管理 》 进入集群 》 基本信息右边 kubectl 》 下载 kubectl 配置文件

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

Java 连接 Kubernetes

首先将这个内容文件重命名为 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 包内。也就是我放在 resources 下的自建目录 kubernetes 下,所以改动如下。

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

解释:因为当打成 Jar 包后,文件就在包内部了。

而 new FileReader(path) 实例化内部底层会 new File(path) 再获取 InputStream 。而 File 这个路径是相对于包的相对路径,并不是指向包内的文件。如果继续使用会出现 idea 跑项目时没有问题,打包部署时出错

初始化 ApiClient

因为有四个环境,不能像官方例子使用 Configuration.setDefaultApiClient() 设置默认 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 对象用于调用相关接口

这里要提一句: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 对象的实现类。来源是 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 要转换为 MB。 因为获取到的是字节,需要转成 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 的零时区。不是东八区
            jsonObject.putOnce("startTime", p.plusHours(8).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        });
        return jsonObject;
    }).collect(Collectors.toList());
    return jsonObjectList;
}

例:获取 pod 内 Java 启动日志

因为业务要求日志是从上往下看的。所以日志这块 Kubernetes 的参数有点不搭,所以就用 sinceSeconds 。意思是距离现在最近的多少秒日志

接口详情

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));
		// 去除重复日志
        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;
}

总结

因为华为云通过 ak , sk 再加 Kubernetes Api 请求地址。我这边仅需发起 HTTPS 请求就行。以至于对接阿里云还需要使用 Kubernetes 的 SDK 有些抗拒。还要载入 kubeconfig 文件。最后不想学阿里云例子通过调用系统命令 curl 。所以还是使用了,结果第一次使用就报 NoSuchMethodError kotlin.collections.ArraysKt.copyInto([B[BIII)[B 这个错误,一看报没方法错误,赶紧看下 Mavne 引入的依赖版本。原来是公司父级定义了旧版本,导致引入的最新 SDK 版本内的 Kotlin 版本被覆盖了。于是在最外层 pom.xml 下重新定义了版本约束。之后就是开发的小细节问题了。

感觉 Kubernetes 的 SDK 包还是很厉害的。下次也不知道有没有机会搞个 WebShell 连下 Pod 。


参考链接:https://guicai.work/after-post/java/Java%E6%93%8D%E4%BD%9CKubernetes文章来源地址https://www.toymoban.com/news/detail-405809.html

到了这里,关于Java操作k8s api示例:使用kubeconfig文件认证;获取所有pod;获取pod内应用容器的启动日志的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Devops系列二(使用helm chart,将java应用发布部署至k8s的示例)

    Devops系列二(使用helm chart,将java应用发布部署至k8s的示例)

    docker镜像已经有了,本文我们将接着演示如何使用helm部署应用到k8s。 分为两大部分: 制作helm chart,推送到私有仓库nexus helm拉取chart,部署到k8s 要求你先安装helm,随便一台linux机器即可,不要求你要有k8s或者docker环境。 这里,我删除了没用到的一些文件,最后保留的见下:

    2024年02月12日
    浏览(14)
  • K8S:Yaml文件详解及编写示例

    K8S:Yaml文件详解及编写示例

    (1)Kubernetes 支持 YAML 和 JSON 格式管理资源对象 (2)JSON 格式:主要用于 api 接口之间消息的传递 (3)YAML 格式:用于配置和管理,YAML 是一种简洁的非标记性语言,内容格式人性化,较易读 (1)大小写敏感 (2)使用缩进表示层级关系 (3)不支持Tab键制表符缩进,只使用

    2024年02月04日
    浏览(8)
  • java 对接 k8s API、K8s基本架构、k8s常用命令

    引言: 当容器部署涉及到 多个节点 服务器,用docker、docker-compose 来部署就不是那么方便了,不能统一控制,不方便伸缩,配置统一管理、版本控制;当我们业务涉及到集群容器部署时,就考虑K8s、K3s 来实现。 k8s 架构组成: (一)Master :apiserver、scheduler、controller-manager 以

    2024年02月16日
    浏览(9)
  • 轻松掌握K8S使用kubectl操作配置文件挂载ConfigMap和密钥Secret知识点05

    轻松掌握K8S使用kubectl操作配置文件挂载ConfigMap和密钥Secret知识点05

    1、挂载应用配置文件配置集ConfigMap 当有许多应用如redis、mysql,希望将它的配置文件挂载出去,以便随时修改,可以用ConfigMap配置集 具体用法查看使用命令行操作里的 3、ConfigMap配置集实战 2、挂载应用配置文件的敏感信息Secret Secret 对象类型用来保存敏感信息,例如使用ya

    2024年02月16日
    浏览(10)
  • Kind创建k8s - JAVA操作控制

    Kind创建k8s - JAVA操作控制

    kind 是 Kubernetes in Docker 的简写,是一个使用 Docker 容器作为 Nodes,在本地创建和运行 Kubernetes 群集的工具。适用于在本机创建 Kubernetes 群集环境进行开发和测试。 官网:https://kind.sigs.k8s.io/ kind 由以下组件构成: Go packages implementing cluster creation, image build, etc. A command line interfac

    2024年02月03日
    浏览(9)
  • 【Kubernetes】使用Kubeshark监控K8s集群的API流量

            Kubeshark 是一款针对 Kubernetes 的 API 流量分析器,提供对 Kubernetes 内部网络的实时协议级可见性,捕获和监控进出容器、Pod、节点和集群的所有流量和有效负载。         Kubeshark 的安装和运行很简单,安装之前,我们需要先联网下载一个二进制文件(当前最新版:

    2024年02月11日
    浏览(11)
  • 【kubernetes】Java操作k8s-API

    【kubernetes】Java操作k8s-API

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 提示:这里可以添加本文要记录的大概内容: 在K8s平台上,我们可以使用kubectl命令对Deployment、pod、Service等资源进行增删改查。本文章将提供一些Java代码操作API方式实现与集群交互,来创建、更新、删

    2024年04月13日
    浏览(12)
  • k8s系列-kuboard 该操作平台的使用操作

    k8s系列-kuboard 该操作平台的使用操作

    镜像打包服务器 账号ip地址 用户 密码 端口 docker仓库镜像存储目录(命名空间) 仓库地址 账户 密码 K8s平台 账号: 密码: 网络配置:DNS 平台地址: 数据库mysql 账号: 密码: 数据库地址: 1.集群导入 集群导入中的基本信息查看集群当前健康状态 套件是导入K8S集群的信息文件

    2024年04月18日
    浏览(11)
  • k8s rancher开源平台(概念,部署示例,)

    目录 一、概念 Rancher 与 Kubernetes 的区别 Rancher 的关键特性 二、Rancher 安装及配置 实验环境 安装 Rancher 登录 Rancher 平台 管理已存在的 Kubernetes 集群 导入 Kubernetes 集群到 Rancher 验证 Kubernetes 集群状态 部署监控系统 部署监控系统到 Rancher 启用监控: 使用 Rancher 仪表盘管理 Kuber

    2024年04月09日
    浏览(9)
  • K8S之kubectl命令详解及示例

    目录 1、查看类命令 2、操作类命令 3、进阶命令操作 4、kubectl replace 重启pod的四种方法 5、kubectl语法 # 获取节点和服务版本信息 kubectl get nodes # 获取节点和服务版本信息,并查看附加信息 kubectl get nodes -o wide # 获取pod信息,默认是default名称空间 kubectl get pod # 获取pod信息,默认

    2024年02月01日
    浏览(14)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包