1. 程式人生 > >kubernetes api微服務開發--service與rc基本操作

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)服務測試


(4)刪除RC及Service

刪除RC:



刪除Service:


結果查詢:


以上,功能測試完成。