io.fabric8.kubernetes對pv和pvc的增刪查改

一、新建maven項目k8stest,pom.xml以下:java

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.k8s.test</groupId>
  <artifactId>k8stest</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>K8stest</name>
  
  <dependencies>
        <dependency>
            <groupId>io.fabric8</groupId>
            <artifactId>kubernetes-client</artifactId>
            <version>1.4.14</version>
        </dependency>
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.4</version>
        </dependency>
   </dependencies>
</project>

二、新建測試類pvTest.javamysql

 

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonParser;

import io.fabric8.kubernetes.api.model.LabelSelector;
import io.fabric8.kubernetes.api.model.NFSVolumeSource;
import io.fabric8.kubernetes.api.model.ObjectMeta;
import io.fabric8.kubernetes.api.model.PersistentVolume;
import io.fabric8.kubernetes.api.model.PersistentVolumeClaim;
import io.fabric8.kubernetes.api.model.PersistentVolumeClaimList;
import io.fabric8.kubernetes.api.model.PersistentVolumeClaimSpec;
import io.fabric8.kubernetes.api.model.PersistentVolumeList;
import io.fabric8.kubernetes.api.model.PersistentVolumeSpec;
import io.fabric8.kubernetes.api.model.Quantity;
import io.fabric8.kubernetes.api.model.RBDVolumeSource;
import io.fabric8.kubernetes.api.model.ResourceRequirements;
import io.fabric8.kubernetes.client.Config;
import io.fabric8.kubernetes.client.ConfigBuilder;
import io.fabric8.kubernetes.client.DefaultKubernetesClient;
import io.fabric8.kubernetes.client.KubernetesClient;


public class pvTest {
     private static final Logger logger = LoggerFactory.getLogger(pvTest.class);
     
      public static void main(String[] args){
          KubernetesClient kubernetesClient= connectK8s();
          //建立pv
          //testCreatePv_Nfs(kubernetesClient);
          //testCreatePv_Rbd(kubernetesClient);
          //刪除指定的pv          //刪除指定的pv
          //testDeletePv(kubernetesClient, "hzbtestpv");
          //獲取pv列表
          //testPvList(kubernetesClient);
          //更新pv
          //testUpdatePv(kubernetesClient,"hzbtestpv");
          //建立pvc
          testCreatePvc(kubernetesClient);
          //刪除指定的pvc
         // testDeletePvc(kubernetesClient, "hzbtestpvc");
          //獲取pvc列表
         // testPvcList(kubernetesClient);
          //更新指定的PVC
          //testUpdatePvc(kubernetesClient,"hzbtestpvc");
          //System.out.println(System.nanoTime());
          //擴容
          //expanseStorage(kubernetesClient,"hzbtestpv","15Gi");
      }
      
      /**
       * 獲取pv列表
       * @param kubernetesClient
       */
      public static void  testPvList(KubernetesClient kubernetesClient){
          if(kubernetesClient!=null){
              PersistentVolumeList pVolumeList=kubernetesClient.persistentVolumes().list();     
              List<PersistentVolume> pvList=pVolumeList.getItems();
              for( PersistentVolume pv:pvList){    
                    System.out.println("顯示一個pv信息===============================================");    
                    System.out.println("========="+jsonFormatter(pv));        
              }
          }
      }
      
      /**
       * 建立pv信息,掛載nfs存儲
       * @param kubernetesClient
       */
      public static void  testCreatePv_Nfs(KubernetesClient kubernetesClient){
          PersistentVolume pv=new PersistentVolume();
          pv.setApiVersion("v1");
          pv.setKind("PersistentVolume");
         
          ObjectMeta meta=new ObjectMeta();
          meta.setName("hzbtestpv");
          Map<String, String> labelsMap=new HashMap<String, String>();
          labelsMap.put("app", "hzbtestpv-lb");
          meta.setLabels(labelsMap);
          //設置pv的metadata
          pv.setMetadata(meta);
          
          PersistentVolumeSpec pvs=new PersistentVolumeSpec();
          Map<String, Quantity> capacityMap=new HashMap<String, Quantity>();
          Quantity quantity=new Quantity();
          quantity.setAmount("5Gi");
          capacityMap.put("storage", quantity);
          //設置Spec的capacity
          pvs.setCapacity(capacityMap);
          
          List<String> accessModes=new ArrayList<String>();
          accessModes.add("ReadWriteOnce");
        //設置Spec的accessModes
          pvs.setAccessModes(accessModes);
          //設置Spec的回收pvc的回收策略。
          pvs.setPersistentVolumeReclaimPolicy("Recycle");         
          NFSVolumeSource nfsVolumeSource=new NFSVolumeSource();
          nfsVolumeSource.setServer("172.16.101.189");
          nfsVolumeSource.setPath("/srv/nfs/hzb/test");
          //設置Spec的nfs
          pvs.setNfs(nfsVolumeSource);          
          //設置pv的Spec
          pv.setSpec(pvs);
          try {
              //將pv信息存儲到服務端
              kubernetesClient.persistentVolumes().create(pv);
              System.out.println("建立pv成功");
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }                
      }
      
      /**
       * 建立pv信息,掛載Rbd存儲
       * @param kubernetesClient
       */
      public static void  testCreatePv_Rbd(KubernetesClient kubernetesClient){
          PersistentVolume pv=new PersistentVolume();
          pv.setApiVersion("v1");
          pv.setKind("PersistentVolume");
         
          ObjectMeta meta=new ObjectMeta();
          meta.setName("mysql-hzb-pv");
          //設置pv的metadata
          pv.setMetadata(meta);
          
          PersistentVolumeSpec pvs=new PersistentVolumeSpec();
          Map<String, Quantity> capacityMap=new HashMap<String, Quantity>();
          Quantity quantity=new Quantity();
          quantity.setAmount("2Gi");
          capacityMap.put("storage", quantity);
          //設置Spec的capacity
          pvs.setCapacity(capacityMap);
          
          List<String> accessModes=new ArrayList<String>();
          accessModes.add("ReadWriteOnce");
        //設置Spec的accessModes
          pvs.setAccessModes(accessModes);
          //設置Spec的回收pvc的回收策略。
          pvs.setPersistentVolumeReclaimPolicy("Recycle");        
          
          RBDVolumeSource rbdVolumeSource=new RBDVolumeSource();
          //設置ceph的monitors
          rbdVolumeSource.setMonitors(Arrays.asList("172.16.60.41:6789", "172.16.60.42:6789", "172.16.60.43:6789"));
          //設置ceph使用的存儲池,ceph中默認是rbd
          rbdVolumeSource.setPool("rbd");
          //設置該pv要用的ceph的image
          rbdVolumeSource.setImage("hzb-mysql");
          //設置鏈接ceph的用戶
          rbdVolumeSource.setUser("admin");
          //設置admin用戶的認證信息
          rbdVolumeSource.setKeyring("/etc/ceph/ceph.client.admin.keyring");
          //設置要以哪一種格式來格式化image
          rbdVolumeSource.setFsType("xfs");
          //設置image的讀寫權限
          rbdVolumeSource.setReadOnly(false);
          pvs.setRbd(rbdVolumeSource);
          
          //設置pv的Spec
          pv.setSpec(pvs);
          try {
              //將pv信息存儲到服務端
              kubernetesClient.persistentVolumes().create(pv);
              System.out.println("建立掛載rbd的pv成功");
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }                
      }
      
      /**
       * 刪除指定的pv信息
       * @param kubernetesClient
       * @param pvName
       */
      public static void testDeletePv(KubernetesClient kubernetesClient,String pvName){
          try {
              kubernetesClient.persistentVolumes().withName(pvName).delete();
              System.out.println("成功刪除pv========"+pvName);
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }  
      }
      
      /**
       * 更新指定的pv信息
       * @param kubernetesClient
       * @param pvName
       */
      public static void testUpdatePv(KubernetesClient kubernetesClient,String pvName){
          try {
              PersistentVolume pv=kubernetesClient.persistentVolumes().withName(pvName).get();
              System.out.println("更新前的pv信息===============================================");    
              System.out.println("========="+jsonFormatter(pv));    
              
              pv.getMetadata().getLabels().put("app", "hzbtestpv-new2");
              pv.getStatus().setPhase("Available");
              kubernetesClient.persistentVolumes().withName(pvName).update(pv);
              
              PersistentVolume pvnew=kubernetesClient.persistentVolumes().withName(pvName).get();
              System.out.println("更新後的pv信息===============================================");    
              System.out.println("========="+jsonFormatter(pvnew));    
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }  
      }
      
      /**
       * 擴容pv
       * @param kubernetesClient
       * @param pvName 要擴容的pv名字。
       * @param quantityAmount 擴容的規格
       */
      public static void expanseStorage(KubernetesClient kubernetesClient,String pvName,String quantityAmount){
          PersistentVolume pv=kubernetesClient.persistentVolumes().withName(pvName).get();
          System.out.println("擴容前的pv信息===============================================");    
          System.out.println("========="+jsonFormatter(pv));    
          Quantity newquantity=new Quantity();
          newquantity.setAmount(quantityAmount);
          pv.getSpec().getCapacity().put("storage",     newquantity);
          kubernetesClient.persistentVolumes().withName(pvName).update(pv);
          PersistentVolume pvnew=kubernetesClient.persistentVolumes().withName(pvName).get();
          System.out.println("擴容後的pv信息===============================================");    
          System.out.println("========="+jsonFormatter(pvnew));    
      }
      
      /**
       * 獲取pvc列表
       * @param kubernetesClient
       */
      public static void  testPvcList(KubernetesClient kubernetesClient){
          if(kubernetesClient!=null){
              PersistentVolumeClaimList pVolumeClaimList=kubernetesClient.persistentVolumeClaims().list();     
              List<PersistentVolumeClaim> pvcList=pVolumeClaimList.getItems();
              for( PersistentVolumeClaim pvc:pvcList){    
                    System.out.println("顯示一個pvc信息===============================================");    
                    System.out.println("========="+jsonFormatter(pvc));        
              }
          }
      }
      
      /**
       * 建立pvc信息
       * @param kubernetesClient
       */
      public static void testCreatePvc(KubernetesClient kubernetesClient){
          PersistentVolumeClaim pvc=new PersistentVolumeClaim();
          pvc.setApiVersion("v1");
          pvc.setKind("PersistentVolumeClaim");
         
          ObjectMeta meta=new ObjectMeta();
          meta.setName("mysql-hzb-pvc");
          //設置pvc的metadata
          pvc.setMetadata(meta);
          
          PersistentVolumeClaimSpec pvcs=new PersistentVolumeClaimSpec();
  
          List<String> accessModes=new ArrayList<String>();
          accessModes.add("ReadWriteOnce");
        //設置Spec的accessModes
          pvcs.setAccessModes(accessModes);
          //設置Spec綁定的pv
          pvcs.setVolumeName("mysql-hzb-pv");
          
          ResourceRequirements resources=new ResourceRequirements();
          Map<String, Quantity> requests=new HashMap<String, Quantity>();
          Quantity quantity=new Quantity();
          quantity.setAmount("2Gi");
          requests.put("storage", quantity);
          resources.setRequests(requests);
          //設置Spec的Resources
          pvcs.setResources(resources);
          
          LabelSelector labelSelector=new LabelSelector();
          Map<String,String> matchLabels=new HashMap<String, String>();
          matchLabels.put("app", "mysql-hzb-pvc-lbl");
          labelSelector.setMatchLabels(matchLabels);
          //設置Spec的Selector
          pvcs.setSelector(labelSelector);
          
          //設置pvc的Spec
          pvc.setSpec(pvcs);
          try {
              //將pvc信息存儲到服務端
              kubernetesClient.persistentVolumeClaims().create(pvc);
              System.out.println("建立pvc成功");
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }                
      }
        
      /**
       * 刪除指定的pvc信息
       * @param kubernetesClient
       * @param pvcName
       */
      public static void testDeletePvc(KubernetesClient kubernetesClient,String pvcName){
          try {
              kubernetesClient.persistentVolumeClaims().withName(pvcName).delete();
              System.out.println("成功刪除pvc========"+pvcName);
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }  
      }
      
      /**
       * 更新指定的pvc信息
       * @param kubernetesClient
       * @param pvcName
       */
      public static void testUpdatePvc(KubernetesClient kubernetesClient,String pvcName){
          try {
              PersistentVolumeClaim pvc=kubernetesClient.persistentVolumeClaims().withName(pvcName).get();
              System.out.println("更新前的pvc信息===============================================");    
              System.out.println("========="+jsonFormatter(pvc));    
              
             //pvc.getSpec().getAdditionalProperties().put("appName", "寵物商店");
              pvc.getSpec().getSelector().getMatchLabels().put("appName", "pet-shop");
              kubernetesClient.persistentVolumeClaims().withName(pvcName).update(pvc);
              
              PersistentVolumeClaim pvcnew=kubernetesClient.persistentVolumeClaims().withName(pvcName).get();
              System.out.println("更新後的pvc信息===============================================");    
              System.out.println("========="+jsonFormatter(pvcnew));    
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }  
      }
      
      /**
       * 鏈接k8s master服務器
       * @return
       */
      public static KubernetesClient connectK8s(){
            String namespace = "default";
            String master = "http://172.16.70.73:8080/";
            KubernetesClient client=null;
            Config config = new ConfigBuilder().withMasterUrl(master)
                    .withTrustCerts(true)
                    .withNamespace(namespace).build();
            try {
                    client = new DefaultKubernetesClient(config);
                
            }catch (Exception e) {
                   logger.error(e.getMessage(), e);
            }
            return client;
      }
      
         /**
          * 格式化json
          * @param uglyJSONString
          * @return
          */
         public static String jsonFormatter(Object uglyJSON){
             if(uglyJSON == null ){
                 return "";
             }
             Gson gson = new GsonBuilder().setPrettyPrinting().create();
             JsonParser jp = new JsonParser();
             String prettyJsonString = gson.toJson(uglyJSON);
             return prettyJsonString;
         }
      
}
相關文章
相關標籤/搜索