项目实用 java调用k8s

如果操作k8s找对应的api太难 就试试我这万能的方法吧

可以解决k8s外部相关框架接口 如 tfjob,padd,pytchon等 一个万能api

maven安装依赖

  <!--        调用k8s-->
        <dependency>
            <groupId>io.kubernetes</groupId>
            <artifactId>client-java</artifactId>
            <version>5.0.0</version>
        </dependency>

相关配置文件

1.加载yml文件

import com.ruoyi.web.fzzn.k8s.controller.K8sServiceController;
import io.kubernetes.client.ApiClient;
import io.kubernetes.client.Configuration;
import io.kubernetes.client.util.ClientBuilder;
import io.kubernetes.client.util.Config;
import io.kubernetes.client.util.KubeConfig;
import lombok.SneakyThrows;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.io.FileReader;

@Component
public class K8sConfig {
    @Value("${spring.profiles.active}")
    private String code;
    @Value("${k8s.path}")
    private String k8Path;
    @SneakyThrows
    public ApiClient getApi() {
            //更改自己的k8s的yml地址  
            String path = K8sServiceController.class.getClassLoader().getResource("kubeconfig-108.yml").getPath();
            //加载k8s,confg
            ApiClient client = ClientBuilder.kubeconfig(KubeConfig.loadKubeConfig(new FileReader(path))).build();
            System.out.println("*****************************************druid----------------------------------------************************");
            //将加载confi的client设置为默认的client
            Configuration.setDefaultApiClient(client);
            return client;
       
    }
}

1. 创建命名空间

 /**
     * 创建命名空间
     */
    @PostMapping("createNamespace")
    public R createNamespace(@RequestBody K8sEntity k8sEntity) throws IOException {
// 实体可以自己定义
        ApiClient client = k8sConfig.getApi();
        CoreV1Api api = new CoreV1Api(client);
         V1Namespace body = new V1Namespace();
        Boolean includeUninitialized = null;
        String pretty = null;
        String dryRun = null;
        body.setApiVersion("v1");
        body.setKind("Namespace");
        V1ObjectMeta metadata = new V1ObjectMeta();
        metadata.setName(k8sEntity.getNamespace());
        Map<String, String> labelMap = new HashMap<>();
        labelMap.put("app", "ccb");
        metadata.setLabels(labelMap);
        body.setMetadata(metadata);
        try {
            V1Namespace v1Namespace = api.createNamespace(body, includeUninitialized, pretty, dryRun);
        return R.ok();
    }

2.万能api 可以创建任何想创建的

 public void yyds(String name) throws ApiException {
        ApiClient client = k8sConfig.getApi();
// 自定义发送路径
        CustomObjectsApi customObjectsApi = new CustomObjectsApi(client);
        V1DeleteOptions deleteOptions = new V1DeleteOptions();
//        deleteOptions.setPropagationPolicy("Foreground");
//        /apis/kubeflow.org/v1/namespaces/{namespace}/tfjobs/{name}
        try {
// /api/{group}/{version}/namespaces/{namespace}/{plural}/{name} 一一对应
            Object response = customObjectsApi.deleteNamespacedCustomObject("kubeflow.org", "v1", "fz-" + SecurityUtils.getUserId(), "tfjobs", name, deleteOptions, 0, null, null);
            System.out.println("TFJob删除成功");
        } catch (ApiException e) {
            System.out.println("TFJob删除失败: " + e.getMessage());
        }
    }

原理:

在工具包最终发送请求时 是拼接路径  例 其中的删除CustomObject方法

源码: 我将重要方法重写  就能随心所遇的更改任何的路径  就不用考虑请求发送认证的关系(为了展示 这就是我没有改动)

 @Override
        public com.squareup.okhttp.Call deleteNamespacedCustomObjectCall(String group, String version, String namespace, String plural,
                                                                         String name, V1DeleteOptions body, Integer gracePeriodSeconds, Boolean orphanDependents,
                                                                         String propagationPolicy, final ProgressResponseBody.ProgressListener progressListener,
                                                                         final ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException {
            Object localVarPostBody = body;

            // create path and map variables
            String localVarPath = "/api/{group}/{version}/namespaces/{namespace}/{plural}/{name}"
                    .replaceAll("\\{" + "group" + "\\}", super.getApiClient().escapeString(group.toString()))
                    .replaceAll("\\{" + "version" + "\\}", super.getApiClient().escapeString(version.toString()))
                    .replaceAll("\\{" + "namespace" + "\\}", super.getApiClient().escapeString(namespace.toString()))
                    .replaceAll("\\{" + "plural" + "\\}", super.getApiClient().escapeString(plural.toString()))
                    .replaceAll("\\{" + "name" + "\\}", super.getApiClient().escapeString(name.toString()));

            List<Pair> localVarQueryParams = new ArrayList<Pair>();
            List<Pair> localVarCollectionQueryParams = new ArrayList<Pair>();
            if (gracePeriodSeconds != null)
                localVarQueryParams.addAll(super.getApiClient().parameterToPair("gracePeriodSeconds", gracePeriodSeconds));
            if (orphanDependents != null)
                localVarQueryParams.addAll(super.getApiClient().parameterToPair("orphanDependents", orphanDependents));
            if (propagationPolicy != null)
                localVarQueryParams.addAll(super.getApiClient().parameterToPair("propagationPolicy", propagationPolicy));

            Map<String, String> localVarHeaderParams = new HashMap<String, String>();

            Map<String, Object> localVarFormParams = new HashMap<String, Object>();

            final String[] localVarAccepts = {
                    "application/json"
            };
            final String localVarAccept = super.getApiClient().selectHeaderAccept(localVarAccepts);
            if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept);

            final String[] localVarContentTypes = {
                    "*/*"
            };
            final String localVarContentType = super.getApiClient().selectHeaderContentType(localVarContentTypes);
            localVarHeaderParams.put("Content-Type", localVarContentType);

            if (progressListener != null) {
                super.getApiClient().getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() {
                    @Override
                    public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException {
                        com.squareup.okhttp.Response originalResponse = chain.proceed(chain.request());
                        return originalResponse.newBuilder()
                                .body(new ProgressResponseBody(originalResponse.body(), progressListener))
                                .build();
                    }
                });
            }

            String[] localVarAuthNames = new String[]{"BearerToken"};
            return super.getApiClient().buildCall(localVarPath, "DELETE", localVarQueryParams, localVarCollectionQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarAuthNames, progressRequestListener);
        }
    }

### Kubernetes 项目 示例 和 实践 #### Kubernetes Java 示例项目 Kubernetes 提供了一个名为 `kubernetes-java-sample` 的示例项目[^1],这是一个用于展示如何通过 Java 编程语言Kubernetes API 进行交互的入门级项目。此项目的目的是帮助开发者理解 Kubernetes 中的核心概念以及如何利用其 API 来实现自动化任务。 以下是该示例项目的一些核心功能: - **API 调用**:展示了如何使用 Kubernetes 官方提供的 Java SDK 来调用 Kubernetes API。 - **Pod 管理**:提供了创建、删除和监控 Pod 的代码示例。 - **服务发现**:演示了如何在 Kubernetes 集群中进行服务注册和服务发现。 可以通过以下链接访问该项目源码并参与贡献: ```plaintext https://gitcode.com/gh_mirrors/ku/kubernetes-java-sample ``` --- #### Kubernetes CRD 示例项目 另一个值得推荐的是 `kubernetes-crd-example` 项目[^2],它专注于自定义资源定义 (Custom Resource Definition, CRD) 的开发和应用。CRD 是 Kubernetes 扩展能力的重要组成部分,允许用户定义自己的资源类型并与现有生态系统无缝集成。 这个项目的关键特性包括: - **CRD 注册**:提供了一套完整的流程来定义和注册新的自定义资源。 - **控制器模式**:实现了 Operator 模式的典型例子,即监听特定类型的事件并对这些事件做出反应。 - **动态扩展**:支持灵活地调整集群行为而无需修改底层基础设施。 同样可以在此处找到更多详情及其源代码仓库地址: ```plaintext https://gitcode.com/gh_mirrors/ku/kubernetes-crd-example ``` --- #### Kubernetes 实践课程开源项目 对于希望深入学习 Kubernetes 并将其应用于实际场景的学习者来说,“Kubernetes 实践课程” 开源项目无疑是非常有价值的参考资料之一[^3]。该项目不仅涵盖了理论知识讲解还包含了大量动手实验环节,适合不同层次的技术人员参考借鉴。 主要内容涉及但不限于以下几个方面: - **基础架构搭建**:指导使用者完成从零开始构建生产环境就绪型 K8s 集群的过程。 - **高级主题探讨**:如 RBAC 访问控制策略设置、持久存储卷配置等复杂议题均有覆盖。 - **多种技术栈融合实例分析**:采用 HashiCorp Terraform 自动化部署脚本编写;借助 Prometheus/Grafana 构建全方位性能指标监测体系等等。 查看具体资料可通过如下 URL 获取: ```plaintext https://github.com/vallard/kubernetes-practice-course-materials ``` --- #### 参考书籍《Kubernetes权威指南》中的实践经验分享 如果更倾向于系统化的阅读,《Kubernetes权威指南:从 Docker 到 Kubernetes 实践全接触(第5版)》一书也是一份不可多得的好教材[^4]。书中详尽记录了许多实用技巧和技术细节,特别是针对初学者友好度较高的章节安排使得整个学习曲线变得平缓许多。 部分亮点摘录如下所示: - **快速启动指引**:介绍了几种主流方法论下的集群初始化步骤,比如基于 kubeadm 工具链的操作手册。 - **运维最佳实践总结**:围绕安全性加固措施展开讨论的同时也不忘提及日常维护工作中常见的痛点解决方案。 - **工具集全面解析**:除了常规命令外还有诸如 Helm Chart 包管理器这样的第三方补充选项被纳入考量范围之内。 --- ### 总结 无论是希望通过官方样例熟悉基本操作还是挑战更高难度的任务去探索未知领域,在上述提到的各种资源里总能找到适合自己需求的那一款。积极参与社区活动不仅能加速个人成长还能为整体生态建设添砖加瓦!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值