IBM Cloud Docs
Setting up snapshots with the Block Storage for VPC cluster add-on

Setting up snapshots with the Block Storage for VPC cluster add-on

Virtual Private Cloud

Block Storage for VPC volume snapshots provide you with a standardized way to copy a volume's contents at a particular point in time without creating an entirely new volume. For more information, see How snapshots work.

Snapshots support is available for cluster version 4.9 and later and with the Block Storage for VPC cluster add-on version 5.0 and later.

Creating an app

Create an example Persistent Volume Claim (PVC) and deploy a pod that references that claim.

  1. Log in to your account. If applicable, target the appropriate resource group. Set the context for your cluster.

  2. Verify that the add-on state is normal and the status is Ready.

    ibmcloud oc cluster addon ls --cluster CLUSTER-ID
    
    Name                   Version                     Health State   Health Status   
    vpc-block-csi-driver   5.2   normal         Addon Ready. For more info: http://ibm.biz/addon-state (H1500)   
    
  3. Verify that the driver pods are deployed and the status is Running.

    kubectl get pods -n kube-system | grep vpc-block-csi
    

    Example output

    ibm-vpc-block-csi-controller-0                        7/7     Running   0          77s
    ibm-vpc-block-csi-node-56c85                          4/4     Running   0          77s
    ibm-vpc-block-csi-node-87j2t                          4/4     Running   0          77s
    ibm-vpc-block-csi-node-cmh2h                          4/4     Running   0          77s
    
  4. Create a PVC.

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: csi-block-pvc
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 10Gi
      storageClassName: ibmc-vpc-block-5iops-tier
    
    kubectl create -f pvc.yaml
    
  5. Verify that the PVC is created and is in a Bound state.

    kubectl get pvc
    
    NAME                   STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS                AGE
    csi-block-pvc   Bound    pvc-0798b499-0b61-4f57-a184-4caeb7b9298d   10Gi       RWO            ibmc-vpc-block-5iops-tier   4m22s
    
  6. Create a YAML configuration file for a deployment that mounts the PVC that you created.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-deployment
      labels:
        app: my-deployment
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: my-deployment
      template:
        metadata:
          labels:
            app: my-deployment
        spec:
          containers:
          - image: nginx # Your containerized app image
            name: container-name 
            volumeMounts:
            - mountPath: /myvolumepath  # Mount path for PVC
              name: my-vol # Volume mount name
          volumes:
          - name: my-vol  # Volume resource name
            persistentVolumeClaim:
              claimName: csi-block-pvc  # The name of the PVC you created earlier
    
    kubectl create -f pod.yaml
    
  7. Verify that the pod is running in your cluster.

    kubectl get pods
    
    NAME                          READY   STATUS    RESTARTS   AGE
    my-deployment-58dd7c89b6-8zdcl   1/1     Running   0          4m50s    
    
  8. Now that you have created the pod, log in to the pod and create a text file to use for the snapshot.

    kubectl exec -it POD_NAME /bin/bash
    

    Example output

    root@my-deployment-58dd7c89b6-8zdcl:/# cd myvolumepath/
    root@my-deployment-58dd7c89b6-8zdcl:/myvolumepath# echo "hi" > new.txt
    root@my-deployment-58dd7c89b6-8zdcl:/myvolumepath# exit
    

Creating a volume snapshot

After you create a deployment and a PVC, you can create the volume snapshot resources.

You can creating snapshots only when a volume is attached to a pod.

  1. Create a volume snapshot resource in your cluster by using the ibmc-vpcblock-snapshot snapshot class that is deployed when you enabled the add-on. Save the following VolumeSnapshot configuration to a file called snapvol.yaml.

    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshot
    metadata:
      name: snapshot-csi-block-pvc
    spec:
      volumeSnapshotClassName: ibmc-vpcblock-snapshot
      source:
        persistentVolumeClaimName: csi-block-pvc
    
    kubectl create -f snapvol.yaml
    
  2. Verify that the snapshot is ready to use.

    kubectl get volumesnapshots
    

    Example output where READYTOUSE is true.

    NAME                            READYTOUSE   SOURCEPVC              SOURCESNAPSHOTCONTENT   RESTORESIZE   SNAPSHOTCLASS SNAPSHOTCONTENT                                    CREATIONTIME   AGE
    ibmc-vpcblock-snapshot   true         csi-block-pvc                           1Gi           ibmc-vpcblock-snapshot   snapcontent-9c374fbf-43a6-48d6-afc5-e76e1ab7c12b   18h            18h
    

Restoring from a volume snapshot

After you deploy the snapshot resources, you can restore data to a new volume by using the snapshot. Creating a PVC dynamically provisions a new volume with snapshot data.

  1. Create a second PVC that references your volume snapshot.

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: restore-pvc
    spec:
      storageClassName: ibmc-vpc-block-5iops-tier
      dataSource:
        name: snapshot-csi-block-pvc
        kind: VolumeSnapshot
        apiGroup: snapshot.storage.k8s.io
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 10Gi
    
  2. Verify that the PVC is created and is in a Bound state.

    kubectl get pvc
    
    NAME                   STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS                AGE
    restore-pvc            Bound    pvc-4ede7630-5a49-4bae-b34d-dc528acfb884   10Gi       RWO            ibmc-vpc-block-5iops-tier   18h
    
  3. Create a second YAML configuration file for a deployment that mounts the PVC that you created.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: podtwo
      labels:
        app: podtwo
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: podtwo
      template:
        metadata:
          labels:
            app: podtwo
        spec:
          containers:
          - image: nginx # Your containerized app image
            name: container-name
            volumeMounts:
            - mountPath: /myvolumepath  # Mount path for pvc from container
              name: my-vol # Volume mount name
          volumes:
          - name: my-vol  # Volume resource name
            persistentVolumeClaim:
              claimName: restore-pvc   # The name of the PVC that you created earlier
    
    kubectl create -f podtwo.yaml
    
  4. Verify that the pod is created.

    kubectl get pods
    
    NAME                          READY   STATUS    RESTARTS   AGE
    POD_NAME                      1/1     Running   0          30m
    POD2_NAME                     1/1     Running   0          46h
    
  5. Log in to the newly created pod and verify that the sample text file you created earlier is saved to the new pod.

    kubectl exec -it POD_NAME /bin/bash
    root@POD_NAME :/# cd myvolumepath/
    root@POD_NAME :/myvolumepath# ls
    lost+found  new.txt
    root@POD_NAME :/myvolumepath# cat new.txt 
    

    Example output

    hi
    

Turning off snapshots

By default, snapshot functionality is enabled when using the Block Storage for VPC. This functionality can be turned off in the configmap addon-vpc-block-csi-driver-configmap in the kube-system namespace by changing the IsSnapshotEnabled to false. Note that with this change in the configmap, any snapshots that are created fail with the message:CreateSnapshot functionality is disabled.

  1. Save the current configmap from your cluster to your local machine.

    kubectl get cm -n kube-system addon-vpc-block-csi-driver-configmap -o yaml >> snapshotconfigmap.yaml
    
  2. Edit the IsSnapshotEnabled parameter to false.

  3. Save the file and apply your changes.

    kubectl apply -f snapshotconfigmap.yaml
    

Next steps

Deploy the snapshot validation webhook to validate user input. For more information, see Deploying the snapshot validation webhook.

Troubleshooting snapshots

Review the following troubleshooting topics.