springboot调用k8s-api以io.fabric8方式创建容器删除命名空间

    上一篇博客讲的是client-java方式来调用k8s客户端接口进行操作https://blog.csdn.net/dfBeautifulLive/article/details/103084362

    这一篇就用io.fabric8方式来调用k8s客户端接口进行操作把!

1.初始化连接

    public KubernetesClient fabric8Connection() {
        Config config = new ConfigBuilder().withMasterUrl("http://192.168.7.115:8008")
                .build();
        KubernetesClient client = new DefaultKubernetesClient(config);
        return client;
    }

2. 删除命名空间

 public Map<String, String> deleteNamespace(String namespace) {
        Map<String, String> message = new HashMap<>();
        //ApiClient client = k8sInit.getConnection();
        //CoreV1Api apiInstance = new CoreV1Api(client);
        // 由于client-java方式删除报错,所以采用io.fabric8
        V1DeleteOptions body = new V1DeleteOptions();
        KubernetesClient k8sClient = k8sInit.fabric8Connection();
        try {
            Boolean isOk = k8sClient.namespaces().withName(namespace).delete();
            if (isOk) {
                message.put("success", "应用命名空间删除成功!");
            } else {
                message.put("error", "应用命名空间删除失败!");
            }
        } catch (Exception e) {
            e.printStackTrace();
            message.put("error", "应用命名空间删除失败!");
        }
        return message;
    }

参数是String类型的命名空间的名称,返回值删除成功

3.创建pod容器接口

public Map<String, String> createDeployments(DeploymentDTO bodyDto) {
        String nameStr = bodyDto.getLabels_workLayer() + "-" + bodyDto.getMetadata_name();
        Map<String, String> messages = new HashMap<>();
        // 赋值操作
        V1Deployment body = new V1Deployment();
        body.setApiVersion("apps/v1");
        body.kind("Deployment");
        // 赋值metadata
        V1ObjectMeta objectMeta = new V1ObjectMeta();
        if (bodyDto.getLabels_workLayer() != null &&
                !bodyDto.getLabels_workLayer().equals("")) {
            objectMeta.setName(nameStr);
        }else{
            objectMeta.setName(bodyDto.getMetadata_name());
        }
        objectMeta.setNamespace(bodyDto.getMetadata_namespace());
        Map<String, String> annotation = new HashMap<>();
        annotation.put("k8s.eip.work/displayName", bodyDto.getRemark());
        annotation.put("k8s.eip.work/ingress", "false");
        annotation.put("k8s.eip.work/service", "ClusterIP");
        annotation.put("k8s.eip.work/workload", nameStr);
        // 默认不分层
        if (bodyDto.getLabels_workLayer() != null &&
                !bodyDto.getLabels_workLayer().equals("")) {
            objectMeta.setAnnotations(annotation);
        }

        // 赋值spec
        V1DeploymentSpec deploymentSpec = new V1DeploymentSpec();
        deploymentSpec.setReplicas(bodyDto.getSpec_replicas());

        // templete
        Map Labels = new HashMap();
        //Labels.put("app", "test-bs");
        if (bodyDto.getLabels_workLayer() != null &&
                !bodyDto.getLabels_workLayer().equals("")) {
            Labels.put("k8s.eip.work/layer", bodyDto.getLabels_workLayer());
            Labels.put("k8s.eip.work/name", nameStr);
        } else {
            Labels.put("app", bodyDto.getMetadata_name());
        }
        objectMeta.setLabels(Labels);
        V1PodTemplateSpec templateSpec = new V1PodTemplateSpec();
        templateSpec.setMetadata(objectMeta);

        // spec-Template下的Spec
        V1PodSpec podSpec = new V1PodSpec();
        // spec-Template-spec-container
        List<V1Container> listContainer = new ArrayList<>();
        V1Container container = new V1Container();
        container.setName(bodyDto.getContainers_name());
        container.setImage(bodyDto.getContainers_image());
        container.setImagePullPolicy(bodyDto.getContainers_imagePullPolicy());
        listContainer.add(container);
        podSpec.setContainers(listContainer);
        templateSpec.setSpec(podSpec);

        // spec-selector
        Map<String, String> matchLabels = new HashMap<>();
        if (bodyDto.getLabels_workLayer() != null &&
                !bodyDto.getLabels_workLayer().equals("")) {
            matchLabels.put("k8s.eip.work/layer", bodyDto.getLabels_workLayer());
            matchLabels.put("k8s.eip.work/name", bodyDto.getLabels_workLayer() + "-" + bodyDto.getMetadata_name());
        } else {
            matchLabels.put("app", bodyDto.getMetadata_name());
        }
        V1LabelSelector selector = new V1LabelSelector();
        selector.setMatchLabels(matchLabels);

        deploymentSpec.setTemplate(templateSpec);
        deploymentSpec.setSelector(selector);
        body.setMetadata(objectMeta);
        body.setSpec(deploymentSpec);
        //body.getSpec().getTemplate().getMetadata().setAnnotations(null);
        ApiClient client = k8sInit.getConnection();
        AppsV1Api apiInstance = new AppsV1Api(client);
        try {
            V1Deployment result = apiInstance.createNamespacedDeployment(objectMeta.getNamespace(), body, null, null, null);
            messages.put("success", "工作负载创建成功!");
        } 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", "工作负载创建失败!");
            }
            log.error("Exception when calling AppsV1Api#createNamespacedDeployment");
            log.error("Status code: {}", e.getCode());
            log.error("Reason: {}", e.getResponseBody());
            log.error("Response headers: {}", e.getResponseHeaders());
        }
        return messages;
    }

参数

{
	"kind":"Pod",
	"namespace":"test",
	"podName":"test-demo",
	"containerName":"test-demo",
	"containerPort":8990,
	"hostPort":8990,
	"image":"gsa-service-registration:v1.3"
}

返回值

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
要将 io.fabric8 kubernetes-client 集成到 Spring Boot 应用程序中,需要进行以下步骤: 1. 在 pom.xml 文件中添加以下依赖: ```xml <dependency> <groupId>io.fabric8</groupId> <artifactId>kubernetes-client</artifactId> <version>5.7.0</version> </dependency> ``` 2. 在 Spring Boot 应用程序的配置文件中,添加 Kubernetes 的配置信息。例如,可以在 application.yml 文件中添加以下信息: ```yaml kubernetes: masterUrl: https://your-kubernetes-master-url.com namespace: your-namespace authToken: your-auth-token ``` 其中,masterUrl 指定了 Kubernetes API Server 的地址,namespace 指定了要操作的 Kubernetes 命名空间,authToken 指定了访问 Kubernetes API Server 的认证令牌。 3. 在 Spring Boot 应用程序中,注入 KubernetesClient 对象。例如,可以在一个自定义的 Spring Bean 中注入 KubernetesClient 对象,然后在该 Bean 中实现对 Kubernetes 资源的操作。例如: ```java @Component public class KubernetesService { @Autowired private KubernetesClient kubernetesClient; public void createDeployment(Deployment deployment) { kubernetesClient.apps().deployments().inNamespace("default").create(deployment); } public void deleteDeployment(String name) { kubernetesClient.apps().deployments().inNamespace("default").withName(name).delete(); } } ``` 在上面的代码中,KubernetesService 是一个自定义的 Spring Bean,其中注入了 KubernetesClient 对象。然后,可以在该 Bean 中实现对 Kubernetes Deployment 的创建删除操作。 4. 最后,可以在 Spring Boot 应用程序的控制器或其他组件中使用 KubernetesService Bean 中的方法,以实现对 Kubernetes 资源的操作。例如: ```java @RestController public class KubernetesController { @Autowired private KubernetesService kubernetesService; @PostMapping("/deployments") public void createDeployment(@RequestBody Deployment deployment) { kubernetesService.createDeployment(deployment); } @DeleteMapping("/deployments/{name}") public void deleteDeployment(@PathVariable String name) { kubernetesService.deleteDeployment(name); } } ``` 在上面的代码中,KubernetesController 是一个 Spring MVC 控制器,其中注入了 KubernetesService Bean,可以通过该 Bean 中的方法实现对 Kubernetes Deployment 的创建删除操作。然后,可以通过 Spring MVC 的注解将这些方法映射到 REST API 中,以供外部调用。 通过以上步骤,就可以将 io.fabric8 kubernetes-client 集成到 Spring Boot 应用程序中,实现对 Kubernetes 资源的操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值