Rok Snapshots¶
Rok snapshots allow you to instantly snapshot your Rok volumes to create a point-in-time copy of your data for local and offsite backups. Rok takes immutable, group consistent snapshots of your applications and stores these snapshots in a backup store, for example, Amazon S3.
Combine this with Rok's instant cloning, and you can recover from hardware failure in minutes, regardless of the volume's capacity.
To take a volume snapshot, use the rok
volume snapshot class:
apiVersion: snapshot.storage.k8s.io/v1alpha1
kind: VolumeSnapshotClass
metadata:
name: rok
parameters:
# NOTE: Increase this in case of heavy I/O during snapshots
rok/snapshot-cow-size: 1GiB
snapshotter: rok.arrikto.com
Parameters¶
If the pre-defined volume snapshot class doesn't meet your requirements, you can create your own customized volume snapshot class, based on the pre-defined one.
Rok supports the following volume snapshot class parameters to further customize Rok snapshots:
rok/snapshot-chunk-size
- Type: string
- Values: size string
- Default: "128KiB"
The chunk size for snapshots. It defines the unit of Copy On Write for snapshots. The value must be a power of 2 between 4KiB and 512KiB.
rok/snapshot-cow-size
- Type: string
- Values: size string
- Default: "10GiB"
The size of the snapshot Copy On Write space. Increase this in case of heavy I/O during snapshots.
rok/pre-snapshot-verification
- Type: string
- Values: "true" | "false"
- Default: "true"
Verify the integrity of the filesystem on the volume, before taking a snapshot. If the filesystem has errors, Rok refuses to snapshot the volume.
rok/post-snapshot-verification
- Type: string
- Values: "true" | "false"
- Default: "false"
Verify the integrity of the filesystem in the snapshot, after creating it. This is an expensive operation that runs a full filesystem check, and may induce additional costs, since it access the snapshot data in the snapshot store, for example, S3.
Note
To affect only a specific Rok snapshot you can specify any of the volume snapshot class parameters as a VolumeSnapshot annotation.
Snapshot PVC Backed by Rok¶
Create a VolumeSnapshot object and set the VolumeSnapshotClass
to rok
:
apiVersion: snapshot.storage.k8s.io/v1alpha1
kind: VolumeSnapshot
metadata:
name: mysnap
spec:
snapshotClassName: rok
source:
name: mypvc
kind: PersistentVolumeClaim
Create Volume from a Kubernetes Snapshot¶
You can create a PVC from a Kubernetes VolumeSnapshot object. You need to have
created this object using the rok
volume snapshot class.
Create a PVC object and set dataSource
to point to the Rok snapshot:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysnap-pvc
spec:
storageClassName: rok
dataSource:
name: mysnap
kind: VolumeSnapshot
apiGroup: snapshot.storage.k8s.io
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
Create PVC from a Rok Resource¶
Create a new PVC and set the rok/origin
PVC annotation to the URL of the Rok
object:
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: mypvc
annotations:
rok/origin: https://example.com/swift/v1/<object-url>
spec:
storageClassName: rok
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
Create StatefulSet from a Rok Group Resource¶
Rok supports passing a group resource as a rok/origin
for a PVC. This is
useful when you want to create a StatefulSet with a volumeClaimTemplate
and assign a unique disk from a group resource to each Pod.
An example StatefulSet looks like this:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
serviceName: "nginx"
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: k8s.gcr.io/nginx-slim:0.8
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
annotations:
rok/origin: https://example.com/swift/v1/<group-object-url>
spec:
storageClassName: rok
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
The order of the resources within the group is important, as each Pod will get
the corresponding disk (e.g., web-0
will get the first object from the
group, web-1
the second one, etc.).
If the number of replicas of the StatefulSet exceeds the number of the objects in the group, the extra Pods will get an empty disk.