Cloning block volumes
Objective: Clone a Virtual Server block volume between storage classes, or regions.
Overview: This guide details using the clone_block_volume
function from the Kubernetes Cloud repository to clone between two example datacenter regions.
This guide requires kubectl
and a valid access token. View Getting Started for more details.
Volume Cloning
Storage Classes
Storage on CoreWeave Cloud is delineated by storage classes, in the notation of <storage type block|shared>
-<storage medium hdd|nvme>
-<region ord1|las1|etc>
. For example:
block-nvme-ewr1
block-nvme-las1
block-nvme-lga1
block-nvme-ord1
CSI Volume Cloning allows an existing volume to be duplicated:
Cloning via CLI within the same Storage Class
Cloning a block volume within the same storage class is easily done using our PVC cloning script, or with a simple PVC manifest:
apiVersion: v1kind: PersistentVolumeClaimmetadata:name: destination-pvcspec:accessModes:- ReadWriteOncestorageClassName: block-nvme-ord1volumeMode: Blockresources:requests:storage: 1234GidataSource:kind: PersistentVolumeClaimname: source-pvc
Cloning via Web UI within the same Storage Class
Cloning within the same storage class can also be accomplished via the CoreWeave Cloud Storage UI:
Cloning via CLI between Storage Classes
Cloning a block volume between storage classes, as done when cloning between regions, requires data within the volume to be manually duplicated, as it cannot be zero-copied.
To automate the process of cloning a Virtual Server root disk block volume, we provide a block volume cloning script. This script creates a Kubernetes Job along with a new volume in the destination region, and uses dd
to clone between source as destination.
First, we identify the Virtual Server root disk volume we'd like to clone, located on CoreWeave's GitHub.
$kubectl get pvc vs-exampleNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGEvs-example Bound pvc-78d4950a-e1ba-476f-815e-b9c32e9c8b27 40Gi RWO block-nvme-ewr1 3m11s
Ensure it's not running:
$kubectl get vs vs-exampleNAME STATUS REASON STARTED INTERNAL IP EXTERNAL IPvs-example VirtualServerStopped VirtualServerStopped False
Download and source the script:
$curl https://raw.githubusercontent.com/coreweave/kubernetes-cloud/master/virtual-server/clone_block_volume.sh -o ~/clone_block_volume.sh% Total % Received % Xferd Average Speed Time Time Time CurrentDload Upload Total Spent Left Speed100 4109 100 4109 0 0 27211 0 --:--:-- --:--:-- --:--:-- 27211$source ~/clone_block_volume.sh
Initiate a clone:
$clone_block_volume --source vs-example --destination vs-example --region lga1persistentvolumeclaim/vs-example-lga1 createdjob.batch/clone-vs-example-lga1 createdNo resources found in namespace.pod/clone-vs-example-lga1-rn55n condition metjob.batch/clone-vs-example-lga1 condition met42945478656 bytes (43 GB, 40 GiB) copied, 54 s, 795 MB/s40960+0 records in40960+0 records out42949672960 bytes (43 GB, 40 GiB) copied, 54.0091 s, 795 MB/sjob.batch "clone-vs-example-lga1" deleted
Script Workflow
In the clone example above, the following actions were performed:
- A new PVC in the destination namespace was created -
vs-example-lga1
- A cloning job was created -
clone-vs-example-lga1
- The script pauses until a worker pod is spun up -
clone-vs-example-lga1-rn55n
- The script pauses until the job reports a completed status
- Stats from the copy job are printed
- The Job (and its worker pod) are cleaned up and deleted
Script Arguments
--source
- Name of the root disk volume being cloned
--destination
- Desired name of new volume
- Region will always be appended as
-region
, e.gnew-vol-lga1
--region
- Name of destination region
- Storage class is automatically derived as
block-nvme-region