当前位置: 代码网 > it编程>编程语言>Java > 【kubernetes】Java操作k8s-API

【kubernetes】Java操作k8s-API

2024年07月28日 Java 我要评论
在K8s平台上,我们可以使用kubectl命令对Deployment、pod、Service等资源进行增删改查。本文章将提供一些Java代码操作API方式实现与集群交互,来创建、更新、删除和查询资源。


前言

提示:这里可以添加本文要记录的大概内容:

在k8s平台上,我们可以使用kubectl命令对deployment、pod、service等资源进行增删改查。本文章将提供一些java代码操作api方式实现与集群交互,来创建、更新、删除和查询资源。


一、准备工作

1、maven依赖

        <!--k8s集群依赖-->
        <dependency>
            <groupid>io.kubernetes</groupid>
            <artifactid>client-java</artifactid>
            <version>7.0.0</version>
        </dependency>

        <dependency>
            <groupid>io.kubernetes</groupid>
            <artifactid>client-java-api</artifactid>
            <version>7.0.0</version>
        </dependency>

2、配置文件

import io.kubernetes.client.openapi.apiclient;
import io.kubernetes.client.util.clientbuilder;
import io.kubernetes.client.util.credentials.accesstokenauthentication;

import java.io.ioexception;

public class kubernetesconfig {
    // 返回client,默认使用这个方法
    public static apiclient defaultclient() throws ioexception {

        /*
         * 机器配置
         * */

		// ip:默认端口
        string master = "https://192.168.0.200:6443";
        // 会很长
        string oauthtoken = "eyjhbxxx...............xxxxxxxxxxxxxxxxx";

        apiclient apiclient = new clientbuilder()
                //设置 k8s 服务所在 ip地址
                .setbasepath(master)
                //是否开启 ssl 验证
                .setverifyingssl(false)
                //插入访问 连接用的 token
                .setauthentication(new accesstokenauthentication(oauthtoken))
                .build();
        io.kubernetes.client.openapi.configuration.setdefaultapiclient(apiclient);
        return apiclient;
    }
}

2.1、tonken获取

可以借助dashboard用户token,获取同样的结果

# 创建用户
kubectl create serviceaccount dashboard-admin -n kube-system

# 用户授权
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin

# # 获取用户token
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')

在这里插入图片描述

二、deployment

1、创建deployment

import io.kubernetes.client.openapi.apiclient;
import io.kubernetes.client.openapi.apiexception;
import io.kubernetes.client.openapi.configuration;
import io.kubernetes.client.openapi.apis.appsv1api;
import io.kubernetes.client.openapi.models.*;
import io.kubernetes.client.util.config;

import java.io.ioexception;
import java.util.hashmap;
import java.util.map;

public class createnamespaceddeployment {

    public static void createnamespaceddeployment() throws ioexception {

        // 连接交互
        apiclient client = config.defaultclient();
        configuration.setdefaultapiclient(client);
        appsv1api apiinstance = new appsv1api(client);

        //命名空间
        string namespace = "default";
        string name = "depdemo";

        // service.spec.selector下的值
        map<string, string> selectlabels = new hashmap<>();
        selectlabels.put("app", name);

        // 构建deployment
        v1deployment body = new v1deploymentbuilder()
                .withmetadata(new v1objectmetabuilder()
                        .withname(name) // 容器名称
                        .withnamespace(namespace)   // 命名空间
                        .withlabels(selectlabels)   // 标签参数
                        .build())
                .withspec(new v1deploymentspecbuilder()
                        .withreplicas(1)    // 设置默认副本数
                        //设置选择器
                        .withselector(new v1labelselectorbuilder()
                                .withmatchlabels(selectlabels)
                                .build())
                        .withtemplate(new v1podtemplatespecbuilder()
                                .withmetadata(new v1objectmetabuilder()
                                        .withlabels(selectlabels)   //选择器
                                        .build())
                                .withspec(new v1podspecbuilder()
                                        .withcontainers(new v1containerbuilder()
                                                .withname("redisdeployment")  //设置docker名
                                                .withimage("redis:latest")    //docker镜像名
                                                .withimagepullpolicy("ifnotpresent")    // 镜像拉取策略
                                                .build())
                                        .build())
                                .build())
                        .build())
                .build();

        //定义返回结果
        map<string, string> messages = new hashmap<>();

        try {
            // 发送请求
            v1deployment result = apiinstance.createnamespaceddeployment(namespace, body, null, null, null);//调用createnamespaceddeployment方法创建容器部署
            system.out.println(result);
        } catch (apiexception e) {

            if (e.getcode() == 409) {
                messages.put("error", "工作负载创建已重复!");
            } else if (e.getcode() == 200) {
                messages.put("success", "工作负载创建成功!");
            } else if (e.getcode() == 201) {
                messages.put("error", "工作负载创建已重复!");
            } else if (e.getcode() == 401) {
                messages.put("error", "无权限操作!");
            } else {
                messages.put("error", "工作负载创建失败!");
            }
        }

        system.out.println("最终结果----" + messages);
    }

2、删除deployment

import io.kubernetes.client.openapi.apiclient;
import io.kubernetes.client.openapi.apiexception;
import io.kubernetes.client.openapi.configuration;
import io.kubernetes.client.openapi.apis.appsv1api;
import io.kubernetes.client.openapi.models.*;
import io.kubernetes.client.util.config;

import java.io.ioexception;
import java.util.hashmap;
import java.util.map;

    /**
     * 删除对应的容器部署
     * 默认命名空间下-default
     *
     */
    public static void deletedeployment(string deployname) {

        apiclient client = null;
        try {
            client = config.defaultclient();
        } catch (ioexception e) {
            system.out.println("集群连接失败!!!");
            throw new runtimeexception(e);
        }
        appsv1api apiinstance = new appsv1api(client);
        map<string, string> messages = new hashmap<>();

        //deployment 名称    命名空间   控制
        try {
            v1status v1status = apiinstance.deletenamespaceddeployment(deployname, "default", null, null, null, null, null, null);
            system.out.println("v1status-->>>" + v1status);
        } catch (apiexception e) {
            system.out.println("e->>>>" + e.getcode());
            if (e.getcode() == 404) {
                messages.put("error", "工作负载删除失败,请检查参数是否正确!");
            } else if (e.getcode() == 409) {
                messages.put("error", "工作负载删除已重复!");
            } else if (e.getcode() == 200) {
                messages.put("success", "工作负载删除成功!");
            } else if (e.getcode() == 201) {
                messages.put("error", "工作负载删除已重复!");
            } else if (e.getcode() == 401) {
                messages.put("error", "无权限操作!");
            } else {
                messages.put("error", "工作负载删除失败!");
            }
        }

    }

3、查询deployment

import io.kubernetes.client.openapi.apiclient;
import io.kubernetes.client.openapi.apiexception;
import io.kubernetes.client.openapi.configuration;
import io.kubernetes.client.openapi.apis.appsv1api;
import io.kubernetes.client.openapi.models.v1deploymentlist;
import io.kubernetes.client.util.config;

import java.io.ioexception;

public class k8sdemo {

    public static void main(string[] args) throws ioexception {
        try {
            // 加载kubeconfig文件
            apiclient client = config.defaultclient();
            configuration.setdefaultapiclient(client);

            // 创建appsv1api实例
            appsv1api api = new appsv1api();

            // 指定命名空间
            string namespace = "default";

            // 查询指定命名空间下的所有deployment
            v1deploymentlist deploymentlist = api.listnamespaceddeployment(namespace, null, null, null, null, null, null, null, null, null);

            // 输出查询结果
            system.out.println("deployments in namespace " + namespace + ":");
            deploymentlist.getitems().foreach(deployment -> system.out.println(deployment.getmetadata().getname()));

        } catch (apiexception e) {
            system.err.println("exception when calling appsv1api#listnamespaceddeployment: " + e.getmessage());
        }
    }
}

三、pod

1、创建pod

package com.k8s.k8s_demo_chained.server.csdn;

import com.k8s.k8s_demo_chained.config.config;
import io.kubernetes.client.custom.quantity;
import io.kubernetes.client.openapi.apiclient;
import io.kubernetes.client.openapi.apiexception;
import io.kubernetes.client.openapi.configuration;
import io.kubernetes.client.openapi.apis.corev1api;
import io.kubernetes.client.openapi.models.*;

import java.io.ioexception;
import java.util.arrays;
import java.util.hashmap;
import java.util.list;
import java.util.map;

public class codepod2 {


    public static void main(string[] args) throws ioexception {
        apiclient client = config.defaultclient();
        configuration.setdefaultapiclient(client);

        corev1api apiinstance = new corev1api(client);

        // 构建选择器
        map<string, string> selectlabels = new hashmap<>();
        string name = "162-3";
        selectlabels.put("deploy", name);

        // 容器暴漏端口
        list<v1containerport> portlist = arrays.aslist(
                new v1containerport().containerport(8080).protocol("tcp")
        );

        // 资源限制map,--默认会转换成字节
        hashmap<string, quantity> limitsmap = new hashmap<>();
        limitsmap.put("memory", new quantity("4gi"));
        hashmap<string, quantity> requestsmap = new hashmap<>();
        requestsmap.put("memory", new quantity("4gi"));

        // 构建pod
        v1pod body = new v1pod()
                .metadata(new v1objectmeta()
                        .name(name) // 名称
                        .namespace("default")   //命名空间
                        .labels(selectlabels))
                .spec(new v1podspec()
                        .containers(arrays.aslist(new v1container()
                                .name("nginxpod")   // 容器名称
                                .image("nginx:latest")   // 镜像名称
                                .imagepullpolicy("ifnotpresent")   // 镜像拉取策略
                                .ports(portlist)    //对外暴漏接口
                                .volumemounts(arrays.aslist(new v1volumemount()
                                        .name("声明挂载名称-同下")
                                        .mountpath("挂载到容器内执行目录")))
                                .resources(new v1resourcerequirements()
                                        .limits(limitsmap)  //限制参数,构建在上面
                                        .requests(requestsmap))  //限制参数,构建在上面
                                .livenessprobe(new v1probe()
                                        .exec(new v1execaction()
                                                .command(arrays.aslist("/bin/sh", "-c", "shell执行结果"))   // 存活探针-shell方式
                                        )
                                        .initialdelayseconds(300)   // 启动后等待/秒
                                        .periodseconds(60)         // 探测的时间间隔/秒
                                        .failurethreshold(1)        // 失败次数
                                )
                        ))
                        .restartpolicy("never") // pod重启策略
                        .volumes(arrays.aslist(new v1volume()
                                .name("声明挂载名称-同上")
                                .hostpath(new v1hostpathvolumesource()
                                        .path("宿住机目录"))))   //需挂载宿住机的目录结构
                );


        //定义返回结果
        map<string, string> messages = new hashmap<>();
        try {
            v1pod result = apiinstance.createnamespacedpod("default", body, null, null, null);
        } catch (apiexception e) {
            if (e.getcode() == 409) {
                messages.put("error", "pod创建已重复!");
            } else if (e.getcode() == 200) {
                messages.put("success", "pod创建成功!");
            } else if (e.getcode() == 201) {
                messages.put("error", "pod创建已重复!");
            } else if (e.getcode() == 401) {
                messages.put("error", "无权限操作!");
            } else {
                messages.put("error", "pod创建失败!");
            }
        }

        system.out.println("最终结果----" + messages);
    }

}

2、删除pod

import com.k8s.k8s_demo_chained.config.config;
import io.kubernetes.client.custom.quantity;
import io.kubernetes.client.openapi.apiclient;
import io.kubernetes.client.openapi.apiexception;
import io.kubernetes.client.openapi.configuration;
import io.kubernetes.client.openapi.apis.corev1api;
import io.kubernetes.client.openapi.models.*;
import okhttp3.response;
import okhttp3.responsebody;

import java.io.ioexception;
import java.util.arrays;
import java.util.hashmap;
import java.util.list;
import java.util.map;

public class deletepod {
    public static void main(string[] args) throws ioexception {
        apiclient client = config.defaultclient();
        configuration.setdefaultapiclient(client);
        corev1api apiinstance = new corev1api(client);
        try {
            // 删除pod    pod名称    命名空间
            apiinstance.deletenamespacedpodcall("162-3", "default", null, null, null, null, null, null, null).execute();

        } catch (apiexception e) {
        	system.out.println(e);
        }
    }

}

3、查询pod

import io.kubernetes.client.openapi.apiclient;
import io.kubernetes.client.openapi.apiexception;
import io.kubernetes.client.openapi.configuration;
import io.kubernetes.client.openapi.apis.corev1api;
import io.kubernetes.client.openapi.models.v1podlist;
import io.kubernetes.client.util.config;

import java.io.ioexception;

public class k8sdemo {
    public static void main(string[] args) throws ioexception {
        try {
            // 加载kubeconfig文件
            apiclient client = config.defaultclient();
            configuration.setdefaultapiclient(client);

            // 创建corev1api实例
            corev1api api = new corev1api();

            // 指定命名空间
            string namespace = "default";

            // 查询指定命名空间下的所有pod
            v1podlist podlist = api.listnamespacedpod(namespace, null, null, null, null, null, null, null, null, null);

            // 输出查询结果
            system.out.println("pods in namespace " + namespace + ":");
            podlist.getitems().foreach(pod -> system.out.println(pod.getmetadata().getname()));
        } catch (apiexception e) {
            system.err.println("exception when calling corev1api#listnamespacedpod: " + e.getmessage());
        }
    }
}

四、sevice

1、创建serivce

import com.k8s.k8s_demo_chained.config.config;
import io.kubernetes.client.custom.intorstring;
import io.kubernetes.client.openapi.apiclient;
import io.kubernetes.client.openapi.apiexception;
import io.kubernetes.client.openapi.apis.corev1api;
import io.kubernetes.client.openapi.models.*;

import java.io.ioexception;
import java.util.arraylist;
import java.util.hashmap;
import java.util.list;
import java.util.map;
import java.util.stream.collectors;

public class codeserve {

    public static void main(string[] args) throws ioexception {
        apiclient client = config.defaultclient();
        corev1api corev1api = new corev1api(client);


        //端口暴露服务的对应的是 service.spec.selector下的值
        map<string, string> selectlabels = new hashmap<>();
        string name = "162-3";
        string servicename = "service-162-3";
        selectlabels.put("deploy", name);

// 创建 v1serviceportbuilder 对象列表
        list<v1serviceportbuilder> portbuilders = new arraylist<>();

        // 添加端口构建器到列表中
        portbuilders.add(new v1serviceportbuilder()
                .withprotocol("tcp")
                .withport(8080)
                .withtargetport(new intorstring(8080))  //目标接口
                .withnodeport(30880));  // 对外网暴漏端口

        // 使用 stream api 将 portbuilders 列表转换为 serviceports 列表
        list<v1serviceport> serviceports = portbuilders.stream()
                .map(v1serviceportbuilder::build)
                .collect(collectors.tolist());


        v1service body = new v1servicebuilder()
                .withmetadata(new v1objectmetabuilder()
                        .withname("网络名称") //dns-1035
                        .withnamespace("default")   //命名空间
                        .build())
                .withspec(new v1servicespecbuilder()
                        .withtype("nodeport") // 设置服务类型为nodeport
                        .withselector(selectlabels) // 设置选择器
                        .withports(serviceports)
                        .build())
                .build();


        //定义返回结果
        map<string, string> messages = new hashmap<>();
        try {
            corev1api.createnamespacedservice("default", body, null, null, null);
            messages.put("success", "网络创建成功!");
        } catch (apiexception e) {
            system.out.println(e);
            if (e.getcode() == 409) {
                messages.put("error", "网络创建已重复!");
            } else if (e.getcode() == 200) {
                messages.put("success", "网络创建成功!");
            } else if (e.getcode() == 201) {
                messages.put("error", "网络创建已重复!");
            } else if (e.getcode() == 401) {
                messages.put("error", "无权限操作!");
            } else {
                messages.put("error", "网络创建失败!");
            }
        }

        system.out.println("最终结果----" + messages);
    }
}

2、删除serivce

package com.k8s.k8s_demo_chained.server.csdn;

import com.k8s.k8s_demo_chained.config.config;
import io.kubernetes.client.openapi.apiclient;
import io.kubernetes.client.openapi.apiexception;
import io.kubernetes.client.openapi.configuration;
import io.kubernetes.client.openapi.apis.corev1api;
import io.kubernetes.client.openapi.models.v1status;

import java.io.ioexception;
import java.util.hashmap;
import java.util.map;

public class deleteservice {

    public static void main(string[] args) throws ioexception {
        apiclient client = config.defaultclient();
        configuration.setdefaultapiclient(client);
        corev1api apiinstance = new corev1api(client);

        map<string, string> selectlabels = new hashmap<>();
        string name = "162-3";
        selectlabels.put("deploy", name);
        
        try {
            v1status v1status = apiinstance.deletenamespacedservice("service-162-3", "default", null, null, null, null, null, null);
        } catch (apiexception e) {
         system.out.println(e)
        }
    }

}

3、查询serivce

package com.k8s.k8s_demo_chained.server.csdn;

import io.kubernetes.client.openapi.apiclient;
import io.kubernetes.client.openapi.apiexception;
import io.kubernetes.client.openapi.configuration;
import io.kubernetes.client.openapi.apis.corev1api;
import io.kubernetes.client.openapi.models.v1servicelist;
import io.kubernetes.client.util.config;

import java.io.ioexception;

public class k8sdemo {
    public static void main(string[] args) throws ioexception {
        try {
            // 加载kubeconfig文件
            apiclient client = config.defaultclient();
            configuration.setdefaultapiclient(client);

            // 创建corev1api实例
            corev1api api = new corev1api();

            // 指定命名空间
            string namespace = "default";

            // 查询指定命名空间下的所有service
            v1servicelist servicelist = api.listnamespacedservice(namespace, null, null, null, null, null, null, null, null, null);

            // 输出查询结果
            system.out.println("services in namespace " + namespace + ":");
            servicelist.getitems().foreach(service -> system.out.println(service.getmetadata().getname()));
        } catch (apiexception e) {
            system.err.println("exception when calling corev1api#listnamespacedservice: " + e.getmessage());
        }
    }
}

四、注意事项

在每次的代码操作之前,都会使用默认的apiclient对象,并将其设置为全局默认的apiclient。
具体来说,config.defaultclient()方法返回一个默认的apiclient对象,该对象已经配置了与kubernetes api服务器通信所需的所有参数,例如api版本、认证信息等。然后,通过调用configuration.setdefaultapiclient(client)方法将这个apiclient对象设置为全局默认的apiclient,这样在后续的操作中就不需要每次都创建一个新的apiclient对象了。
用于初始化kubernetes java客户端库,以便在后续的操作中使用它来与kubernetes api服务器进行交互。
那么,都需要区分开不同操作,构建不同的api,区别如下:

  • appsv1api:用于管理 kubernetes 应用程序的 api 对象,如 deployment、statefulset、daemonset 和 replicaset 等
  • batchv1api:用于管理 kubernetes 批处理作业的 api 对象,如 job 和 cronjob 等。
  • corev1api:用于管理 kubernetes 核心 api 对象,如 pod、service、namespace、node 和 persistentvolume 等。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com