kubernetes api微服务开发--service与rc基本操作

目标:完成Service与Replication Controller服务基本功能(CRUD)的开发,并且基于fabric8类方法优化pod服务代码

环境: IntelliJ IDEA

步骤:基本概念->Pod代码优化→Replication Controller服务基本功能开发->Service服务基本功能开发->运行测试

1.基本概念

Replication Controller:定义了一个模板,设定了pod副本数,持续监控使pod数始终维持在期望值。

Service:定义了一种特定的服务,创建后在Kubernetes中拥有固定的通信地址,在其生命周期内不会改变,并且能够对外服务,转发外部请求至pod。

2.Pod代码优化

上一篇博文中使用fabric8框架,采取分别创建对象的方式传入参数,不够简洁,本文使用各资源对象类的创建方法进行代码优化:

DevK8sApiService.java

PodBuilder方法深入

//创建Pod
    public static Pod createPod(String nsName, String podName, String labelkey, String labelvalue, String containerName, String imageName, int cnPort){
        Pod pod = new PodBuilder()
                .withApiVersion("v1")
                .withKind("Pod")
                .withNewMetadata()
                    .withName(podName)
                    .withNamespace(nsName)
                    .addToLabels(labelkey, labelvalue)
                .endMetadata()
                .withNewSpec()
                    .addNewContainer()
                        .withName(containerName)
                        .withImage(imageName)
                        .addNewPort()
                            .withContainerPort(cnPort)
                        .endPort()
                    .endContainer()
                .endSpec()
                .build();
        try {
            //Pod 创建
            kubernetesClient.pods().create(pod);
            System.out.println("pod create success");
        }catch (Exception e) {
            System.out.println("pod create failed");
        }
        return pod;
    }
 
    //删除pod
    public static Pod deletePod(String namespaceName, String podName){
        Pod pod = new Pod();
        try {
            //获取要删除的pod
            pod = kubernetesClient.pods().inNamespace(namespaceName).withName(podName).get();
            //Pod 删除
            kubernetesClient.pods().inNamespace(namespaceName).withName(podName).delete();
            System.out.println("pod delete success");
        }catch (Exception e){
            System.out.println("pod create failed");
        }
        return pod;
    }
 
    //查询pod
    public static Pod readPod(String namespaceName, String podName){
        Pod pod = new Pod();
        try {
            //获取要查询的pod
            pod = kubernetesClient.pods().inNamespace(namespaceName).withName(podName).get();
            System.out.println("pod read success");
        }catch (Exception e){
            System.out.println("pod read failed");
        }
        return pod;
    }

3.Replication Controller服务基本功能开发

与pod服务开发类似,使用资源对象类的基本方法实现rc服务的CRUD功能

(1)DevK8sApiService.java

//创建Replication Controller
public static ReplicationController createRC(String rcName, String nsName, String lbkey, String lbvalue, int replicas, String ctName, String imName, int cnPort){
    ReplicationController rc = new ReplicationControllerBuilder()
            .withApiVersion("v1")
            .withKind("ReplicationController")
            .withNewMetadata()
                .withName(rcName)
                .withNamespace(nsName)
                .addToLabels(lbkey, lbvalue)
            .endMetadata()
            .withNewSpec()
                .withReplicas(replicas)
                .addToSelector(lbkey, lbvalue)
                .withNewTemplate()
                    .withNewMetadata()
                        .addToLabels(lbkey, lbvalue)
                    .endMetadata()
                    .withNewSpec()
                        .addNewContainer()
                            .withName(ctName)
                            .withImage(imName)
                            .addNewPort()
                                .withContainerPort(cnPort)
                            .endPort()
                        .endContainer()
                    .endSpec()
                .endTemplate()
            .endSpec()
            .build();
    try {
        kubernetesClient.replicationControllers().create(rc);
        System.out.println("replication controller create success");
    }catch (Exception e) {
        System.out.println("replication controller create failed");
    }
    return rc;
}
 
//删除Replication Controller
public static ReplicationController deleteRC(String nsName, String rcName){
    ReplicationController rc = new ReplicationController();
    try {
        rc = kubernetesClient.replicationControllers().inNamespace(nsName).withName(rcName).get();
        kubernetesClient.replicationControllers().inNamespace(nsName).withName(rcName).delete();
        System.out.println("replication controller delete success");
    }catch (Exception e){
        System.out.println("replication controller delete failed");
    }
    return rc;
}
 
//查询Replication Controller
public static ReplicationController readRC(String nsName, String rcName){
    ReplicationController rc = new ReplicationController();
    try {
        rc = kubernetesClient.replicationControllers().inNamespace(nsName).withName(rcName).get();
        System.out.println("replication controller read success");
    }catch (Exception e){
        System.out.println("replication controller read failed");
    }
    return rc;
}

(2)DevK8sApiController.java

配置swagger访问方法:

//k8s rc create
@ApiOperation(value = "CreateReplicationController", notes = "CreateReplicationController")
@RequestMapping(value = "/createrc", method = RequestMethod.POST)
public ReplicationController createk8src(@RequestParam(value = "ReplicationControllerName") String rcName,
                                         @RequestParam(value = "NamespaceName") String nsName,
                                         @RequestParam(value = "LabelKey") String lbkey,
                                         @RequestParam(value = "LabelValue") String lbvalue,
                                         @RequestParam(value = "Replicas") int replicas,
                                         @RequestParam(value = "ContainerName") String ctName,
                                         @RequestParam(value = "ImageName") String imName,
                                         @RequestParam(value = "ContainerPort") int cnPort){
    return devK8sApiService.createRC(rcName, nsName, lbkey, lbvalue, replicas, ctName,imName, cnPort);
}
 
//k8s rc delete
@ApiOperation(value = "DeleteReplicationController", notes = "DeleteReplicationController")
@RequestMapping(value = "/deleterc", method = RequestMethod.DELETE)
public ReplicationController deletek8src(@RequestParam(value = "NamespaceName") String nsName,
                                         @RequestParam(value = "ReplicationControllerName") String rcName){
    return devK8sApiService.deleteRC(nsName, rcName);
}
 
//k8s rc read
@ApiOperation(value = "ReadReplicationController", notes = "ReadReplicationController")
@RequestMapping(value = "/readrc", method = RequestMethod.GET)
public ReplicationController readk8src(@RequestParam(value = "NamespaceName") String nsName,
                              @RequestParam(value = "ReplicationControllerName") String rcName){
    return devK8sApiService.readRC(nsName, rcName);
}

4.Service服务基本功能开发

(1)DevK8sApiService.java

//创建Service
    public static Service createService(String seriveName, String nsName, String labelkey, String labelvalue, int cnPort, int nodePort){
        Service service = new ServiceBuilder()
                .withApiVersion("v1")
                .withKind("Service")
                .withNewMetadata()
                    .withName(seriveName)
                    .withNamespace(nsName)
                    .addToLabels(labelkey, labelvalue)
                .endMetadata()
                .withNewSpec()
                    .addNewPort()
                        .withPort(cnPort)
                        .withNodePort(nodePort)
                    .endPort()
                    .withType("NodePort")
                    .addToSelector(labelkey,labelvalue)
                .endSpec()
                .build();
        try {
            kubernetesClient.services().create(service);
            System.out.println("service create success");
        }catch (Exception e){
            System.out.println("service create failed");
        }
        return service;
    }
 
    //删除Service
    public static Service deleteService(String namespaceName, String serviceName){
        Service service = new Service();
        try {
            service = kubernetesClient.services().inNamespace(namespaceName).withName(serviceName).get();
            kubernetesClient.services().inNamespace(namespaceName).withName(serviceName).delete();
            System.out.println("service delete success");
        }catch (Exception e){
            System.out.println("service delete failed");
        }
        return service;
    }
 
    //查询Service
    public static Service readService(String namespaceName, String serviceName){
        Service service = new Service();
        try {
            service = kubernetesClient.services().inNamespace(namespaceName).withName(serviceName).get();
            System.out.println("service read success");
        }catch (Exception e){
            System.out.println("service read failed");
        }
        return service;
    }
(2)DevK8sApiController.java
//k8s service create
@ApiOperation(value = "CreateService", notes = "CreateService")
@RequestMapping(value = "/createservice", method = RequestMethod.POST)
public Service createk8sservice(@RequestParam(value = "ServiceName") String srName,
                                @RequestParam(value = "NameSpaceName") String nsName,
                                @RequestParam(value = "LabelKey") String lbkey,
                                @RequestParam(value = "LabelValue") String lbvalue,
                                @RequestParam(value = "ContainerPort") int cnPort,
                                @RequestParam(value = "NodePort") int ndPort){
    return devK8sApiService.createService(srName, nsName, lbkey, lbvalue, cnPort, ndPort);
}
 
//k8s service delete
@ApiOperation(value = "DeleteService", notes = "DeleteService")
@RequestMapping(value = "/deleteservice", method = RequestMethod.DELETE)
public Service deletek8sservice(@RequestParam(value = "NamespaceName") String nsName,
                                @RequestParam(value = "ServiceName") String srName){
    return devK8sApiService.deleteService(nsName, srName);
}
 
//k8s service read
@ApiOperation(value = "ReadService", notes = "ReadService")
@RequestMapping(value = "/readservice", method = RequestMethod.GET)
public Service readk8sservice(@RequestParam(value = "NamespaceName") String nsName,
                              @RequestParam(value = "ServiceName") String srName){
    return devK8sApiService.readService(nsName, srName);
}

5.运行测试

测试:使用nginx镜像定义一个3副本RC,并定义一个Service以NodePort方式对接pods

(1)RC创建

传入参数


返回信息


结果查询



(2)Service创建

传入参数


返回信息


结果查询


(3)服务测试

访问http://NodeIP:30033,其中NodeIP可以是任意一个集群节点的IP


(4)删除RC及Service

删除RC:



删除Service:


结果查询:


以上,功能测试完成。



猜你喜欢

转载自blog.csdn.net/xingyuzhe/article/details/80666906