• 最好的Kubernetes客户端Java库fabric8io,快来自定义你的操作


    我最新最全的文章都在 南瓜慢说 www.pkslow.com ,欢迎大家来喝茶!

    1 Kubernetes Java客户端

    对于Kubernetes集群的操作,官方提供了命令行工具kubectl,这也是我们最常用且必须掌握的方式。通过kubectl来实现增删改查操作,方便而直接。但总有一些更复杂的场景难以满足,比如我希望在数据库的某个值达到10万后就触发一个Kubernetes Job去处理某项任务。即使shell编程似乎也可以解决,但为了项目维护,如果能整合到现有代码里,岂不是更好?

    Kubernetes的架构图可以看出,我们只要和API server做好交互就可以了,实际上kubectl也是如此的。那我们就可以使用任何语言来操作Kubernetes

    本文将介绍Java方面最好用的客户端库fabric8io/kubernetes-client,它支持KubernetesOpenShift,并被许多项目引用,如Spring CloudSparkIstio Java API等,可见它的优秀之处。

    2 如何使用

    本文将通过代码演示一些常用操作。

    2.1 引入依赖

    目前的最新版本为5.0.0,通过maven引入最新依赖如下:

    <dependency>
      <groupId>io.fabric8</groupId>
      <artifactId>kubernetes-client</artifactId>
      <version>5.0.0</version>
    </dependency>
    

    这个依赖包含了相关的核心类、模型类、Jsonokhttp3等。

    看它的依赖就可以学习优秀的项目是如何组织和管理的。

    2.2 创建客户端

    创建客户端最简单的方式是使用默认配置:

    KubernetesClient client = new DefaultKubernetesClient();
    

    它会从目录~/.kube/config中读取配置文件。如果想要修改配置,可以通过配置以下设置:

    • 系统属性(System Properties)
    • 环境变量(Enviroment Variables)
    • Kube配置文件
    • ServiceAccount的Token和加载的CA证书

    系统属性和环境变量列表可查看官网。

    当然,还可以通过Java来自定义配置:

    Config config = new ConfigBuilder()
      .withMasterUrl("https://localhost:6443")
      .build();
    KubernetesClient client = new DefaultKubernetesClient(config);
    

    2.3 创建资源

    这个Java库使用了大量的Builder模式来创建对象,创建命令空间如下:

    Namespace namespace = new NamespaceBuilder()
      .withNewMetadata()
      .withName("pkslow")
      .addToLabels("reason", "pkslow-sample")
      .endMetadata()
      .build();
    client.namespaces().createOrReplace(namespace);
    

    非常灵活,上面例子添加了名字和标签,最后通过createOrReplace方法可新建,如果存在可替换。

    对于Pod也是类似的:

    Pod pod = new PodBuilder()
      .withNewMetadata()
      .withName("nginx")
      .addToLabels("app", "nginx")
      .endMetadata()
      .withNewSpec()
      .addNewContainer()
      .withName("nginx")
      .withImage("nginx:1.19.5")
      .endContainer()
      .endSpec()
      .build();
    client.pods().inNamespace("pkslow").createOrReplace(pod);
    

    指定名字、标签和镜像后就可以创建了。

    2.4 查看资源

    查看资源可以查询所有,或者通过条件options来过滤,具体代码如下:

    // 查看命名空间
    NamespaceList namespaceList = client.namespaces().list();
    namespaceList.getItems()
      .forEach(namespace ->
               System.out.println(namespace.getMetadata().getName() + ":" + namespace.getStatus().getPhase()));
    
    // 查看Pod
    ListOptions options = new ListOptions();
    options.setLabelSelector("app=nginx");
    Pod nginx = client.pods().inNamespace("pkslow")
      .list(options)
      .getItems()
      .get(0);
    System.out.println(nginx);
    

    2.5 修改资源

    修改资源是通过edit方法来实现的,可通过命名空间和名字来定位到资源,然后进行修改,示例代码如下:

    // 修改命名空间
    client.namespaces().withName("pkslow")
      .edit(n -> new NamespaceBuilder(n)
            .editMetadata()
            .addToLabels("project", "pkslow")
            .endMetadata()
            .build()
           );
    
    // 修改Pod
    client.pods().inNamespace("pkslow").withName("nginx")
      .edit(p -> new PodBuilder(p)
            .editMetadata()
            .addToLabels("app-version", "1.0.1")
            .endMetadata()
            .build()
           );
    

    2.6 删除资源

    删除资源也是类似的,先定位再操作:

    client.pods().inNamespace("pkslow")
      .withName("nginx")
      .delete();
    

    2.7 通过yaml文件操作

    我们还可以直接通过yaml文件来描述资源,而不用Java来定义,这样可以更直观和方便。完成yaml文件的编写后,Load成对应的对象,再进行各种增删改查操作,示例如下:

    yaml文件定义了一个Deployment

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
      labels:
        myapp: nginx
    spec:
      replicas: 1
      selector:
        matchLabels:
          myapp: nginx
      template:
        metadata:
          labels:
            myapp: nginx
        spec:
          containers:
            - name: nginx
              image: nginx:1.7.9
              ports:
                - containerPort: 80
    

    Java代码如下:

    Deployment deployment = client.apps().deployments()
      .load(Fabric8KubernetesClientSamples.class.getResourceAsStream("/deployment.yaml"))
      .get();
    client.apps().deployments().inNamespace("pkslow")
      .createOrReplace(deployment);
    

    2.8 监听事件

    我们还可以通过监听资源的事件,来进行对应的反应,比如有人删除了Pod就记录日志到数据库等,这个功能还是非常有用的。示例代码如下:

    client.pods().inAnyNamespace().watch(new Watcher<Pod>() {
      @Override
      public void eventReceived(Action action, Pod pod) {
        System.out.println("event " + action.name() + " " + pod.toString());
      }
    
      @Override
      public void onClose(WatcherException e) {
        System.out.println("Watcher close due to " + e);
    
      }
    });
    

    通过一个Watcher监听了Pod的所有动作事件,然后打印动作名和对应的Pod。输出后的日志如下:

    event ADDED Pod(apiVersion=v1, kind=Pod, metadata=ObjectMeta(
    event MODIFIED Pod(apiVersion=v1, kind=Pod, metadata=ObjectMeta(
    event DELETED Pod(apiVersion=v1, kind=Pod, metadata=ObjectMeta(
    event MODIFIED Pod(apiVersion=v1, kind=Pod, metadata=ObjectMeta(
    

    日志太长,就不完全显示。

    3 总结

    这个Kubernetes的Java客户端实在是好用,API简单易用,即使不用文档也能通过方法名判断。最让人惊喜的是,官方还提供了许多绝佳的示例,简直不要太友好。

    使用这个API,在项目中可以更灵活地管理和使用Kubernetes应用了。

    代码请查看:https://github.com/LarryDpk/pkslow-samples


    欢迎关注微信公众号<南瓜慢说>,将持续为你更新...

    多读书,多分享;多写作,多整理。

  • 相关阅读:
    php数据缓存到文件类设计
    php静态文件缓存示例
    php array_merge和“+”的区别和使用《细说php2》
    kafka环境安装及简单使用(单机版)
    Protobuf的上手使用
    Java8新特性概览
    Mock测试框架(Mockito为例)
    Java序列化与反序列化
    系统/项目环境搭建
    关于Tomcat服务器中的协议及请求过程
  • 原文地址:https://www.cnblogs.com/larrydpk/p/14928606.html
Copyright © 2020-2023  润新知