CBT populator is a spike effort to build the CSI CBT service using a volume populator. The full description of the CSI CBT service is described under this KEP.
In order to perform changed block tracking, the CBT populator uses the CSI
VolumeSnapshot APIs to snapshot PVCs. Deploy the CSI external-snapshotter
service following the instructions in its documentation.
The example application depends on the CSI hostpath driver to provision its PVC. Follow its documentation for installation.
Deploy the CRD and controller's RBAC:
kubectl apply -f yaml/crd.yaml
kubectl auth reconcile -f yaml/rbac.yaml
kubectl create ns cbt-populatorBuild and deploy the CBT controller and populator to a K8s cluster:
make apply KO_DOCKER_REPO=<your_image_registry>Check the rollout status of the CBT controller:
kubectl -n cbt-populator rollout status deploy/cbt-populator Confirm that it is successfully rolled out:
deployment "cbt-populator" successfully rolled outBy default, the CBT controller runs in the cbt-populator namespace:
kubectl -n cbt-populator get poConfirm that the controller pod is running:
NAME READY STATUS RESTARTS AGE │➜ cbt-populator git:(main) ✗ (
cbt-populator-59764d965b-8pd85 1/1 Running 0 17hDeploy the CSI hostpath driver's storage class:
kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/csi-driver-host-path/ed64506237332cd5c145a9e4cfec32dfae7a97b8/examples/csi-storageclass.yaml
kubectl get sc csi-hostpath-sc Confirm that the csi-hostpath-sc storage class is ready:
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
csi-hostpath-sc hostpath.csi.k8s.io Delete Immediate true 20sDeploy the src-pod pod and its src-pvc PVC to the default namespace:
kubectl apply -f yaml/app/pod-pvc.yamlThis pod attaches the PVC at its /data mount point and prints the current
timestamp to the /data/date.txt file every second:
kubectl exec src-pod -- /bin/sh -c "tail -f /data/date.txt"Take two snapshots of the PVC, ten seconds apart:
kubectl apply -f ./yaml/app/volumesnapshot-from.yaml
sleep 10
kubectl apply -f ./yaml/app/volumesnapshot-to.yamlThese will create 2 VolumeSnapshot resources in the same namespace as the
application:
kubectl get vs,vsc Confirm that the volume snapshots and volume snapshot contents are ready:
NAME READYTOUSE SOURCEPVC SOURCESNAPSHOTCONTENT RESTORESIZE SNAPSHOTCLASS SNAPSHOTCONTENT CREATIONTIME AGE
volumesnapshot.snapshot.storage.k8s.io/cbt-vs-from true src-pvc 10Mi csi-hostpath-snapclass snapcontent-f37fade4-70d8-47db-87d6-89e1f8bc83df 85s 85s
volumesnapshot.snapshot.storage.k8s.io/cbt-vs-to true src-pvc 10Mi csi-hostpath-snapclass snapcontent-975a0133-e606-42f3-aba2-ab0702d214f4 46s 46s
NAME READYTOUSE RESTORESIZE DELETIONPOLICY DRIVER VOLUMESNAPSHOTCLASS VOLUMESNAPSHOT VOLUMESNAPSHOTNAMESPACE AGE
volumesnapshotcontent.snapshot.storage.k8s.io/snapcontent-f37fade4-70d8-47db-87d6-89e1f8bc83df true 10485760 Delete hostpath.csi.k8s.io csi-hostpath-snapclass cbt-vs-from default 85s
volumesnapshotcontent.snapshot.storage.k8s.io/snapcontent-975a0133-e606-42f3-aba2-ab0702d214f4 true 10485760 Delete hostpath.csi.k8s.io csi-hostpath-snapclass cbt-vs-to default 46sCreate the pod and PVC to store the CBT mock data:
kubectl apply -f ./yaml/app/cbt-pvc.yamlkubectl get po,pvc,cbt NAME READY STATUS RESTARTS AGE
pod/src-pod 1/1 Running 0 4m33s
pod/cbt-pod 1/1 Running 0 110s
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/src-pvc Bound pvc-eea33546-930c-4129-9b43-45d4fe2ca854 10Mi RWO csi-hostpath-sc 4m33s
persistentvolumeclaim/cbt-pvc Bound pvc-892646d4-3a13-4621-aead-a2e19c35d98f 10Mi RWO csi-hostpath-sc 110s
NAME AGE
changedblockrange.cbt.storage.k8s.io/cbt-cbr 110sObserve that the populator pod and prime PVC are created in the cbt-populator
namespace:
$ kubectl -n cbt-populator get po,pvc NAME READY STATUS RESTARTS AGE
pod/cbt-populator-5d8b5b769f-ddz42 1/1 Running 0 3m31s
pod/populate-8202ccd0-24d9-40e1-ab5d-1d7dadb09b21 0/1 ContainerCreating 0 2s
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/prime-8202ccd0-24d9-40e1-ab5d-1d7dadb09b21 Bound pvc-56d814e9-1ede-4eca-9aa5-76d140ddd75a 10Mi RWO csi-hostpath-sc 28sConfirm that the mock data is stored in the cbt-pvc volume:
kubectl exec cbt-pod -- ls /data/There should be a data file in the /data folder:
cbt-1681146460Use cat to view the content of the data file:
kubectl exec cbt-pod -- cat /data/cbt-1681146460Expect to see a JSON CBT payload:
{
"ChangedBlocks": [
{
"BlockIndex": 0,
"FirstBlockToken": "AAABAVahm9SO60Dyi0ORySzn2ZjGjW/KN3uygGlS0QOYWesbzBbDnX2dGpmC",
"SecondBlockToken": "AAABAf8o0o6UFi1rDbSZGIRaCEdDyBu9TlvtCQxxoKV8qrUPQP7vcM6iWGSr"
},
{
"BlockIndex": 6000,
"FirstBlockToken": "AAABAbYSiZvJ0/R9tz8suI8dSzecLjN4kkazK8inFXVintPkdaVFLfCMQsKe",
"SecondBlockToken": "AAABAZnqTdzFmKRpsaMAsDxviVqEI/3jJzI2crq2eFDCgHmyNf777elD9oVR"
},
{
"BlockIndex": 6001,
"FirstBlockToken": "AAABASBpSJ2UAD3PLxJnCt6zun4/T4sU25Bnb8jB5Q6FRXHFqAIAqE04hJoR"
},
{
"BlockIndex": 6002,
"FirstBlockToken": "AAABASqX4/NWjvNceoyMUljcRd0DnwbSwNnes1UkoP62CrQXvn47BY5435aw"
},
{
"BlockIndex": 6003,
"FirstBlockToken": "AAABASmJ0O5JxAOce25rF4P1sdRtyIDsX12tFEDunnePYUKOf4PBROuICb2A"
},
],
"ExpiryTime": 1576308931.973,
"VolumeSize": 32212254720,
"BlockSize": 524288,
"NextToken": "AAADARqElNng/sV98CYk/bJDCXeLJmLJHnNSkHvLzVaO0zsPH/QM3Bi3zF//O6Mdi/BbJarBnp8h"
}The Makefile defines a number of targets for developing the CBT controller and
populator, based on ko.
Install ko following the instructions described in its documentation.
Run the test:
make testPerform local build:
make buildBuild and push the images:
make push KO_DOCKER_REPO=<your_image_registry>To re-generate the API Go code:
make codegenSee the LICENSE file.