-
Notifications
You must be signed in to change notification settings - Fork 58
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[Feat] Multi region support (Topology Aware Provisioning) (#280)
--------- Co-authored-by: Khaja Omer <komer@akamai.com>
- Loading branch information
Showing
13 changed files
with
471 additions
and
73 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,88 @@ | ||
## 🌐 Topology-Aware Provisioning | ||
|
||
This CSI driver supports topology-aware provisioning, optimizing volume placement based on the physical infrastructure layout. | ||
|
||
**Notes:** | ||
|
||
1. **Volume Cloning**: Cloning only works within the same region, not across regions. | ||
2. **Volume Migration**: We can't move volumes across regions. | ||
3. **Remote Provisioning**: Volume provisioning is supported in remote regions (nodes or clusters outside of the region where the controller server is deployed). | ||
|
||
> [!IMPORTANT] | ||
> Make sure you are using the latest release v0.8.6+ to utilize the remote provisioning feature. | ||
#### 📝 Example StorageClass and PVC | ||
|
||
```yaml | ||
allowVolumeExpansion: true | ||
apiVersion: storage.k8s.io/v1 | ||
kind: StorageClass | ||
metadata: | ||
name: linode-block-storage-wait-for-consumer | ||
provisioner: linodebs.csi.linode.com | ||
reclaimPolicy: Delete | ||
volumeBindingMode: WaitForFirstConsumer | ||
--- | ||
apiVersion: v1 | ||
kind: PersistentVolumeClaim | ||
metadata: | ||
name: pvc-filesystem | ||
spec: | ||
accessModes: | ||
- ReadWriteOnce | ||
resources: | ||
requests: | ||
storage: 10Gi | ||
storageClassName: linode-block-storage-wait-for-consumer | ||
``` | ||
> **Important**: The `volumeBindingMode: WaitForFirstConsumer` setting is crucial for topology-aware provisioning. It delays volume binding and creation until a pod using the PVC is created. This allows the system to consider the pod's scheduling requirements and node assignment when selecting the most appropriate storage location, ensuring optimal data locality and performance. | ||
|
||
#### 🖥️ Example Pod | ||
|
||
```yaml | ||
apiVersion: v1 | ||
kind: Pod | ||
metadata: | ||
name: e2e-pod | ||
spec: | ||
nodeSelector: | ||
topology.linode.com/region: us-ord | ||
tolerations: | ||
- key: "node-role.kubernetes.io/control-plane" | ||
operator: "Exists" | ||
effect: "NoSchedule" | ||
containers: | ||
- name: e2e-pod | ||
image: ubuntu | ||
command: | ||
- sleep | ||
- "1000000" | ||
volumeMounts: | ||
- mountPath: /data | ||
name: csi-volume | ||
volumes: | ||
- name: csi-volume | ||
persistentVolumeClaim: | ||
claimName: pvc-filesystem | ||
``` | ||
|
||
This example demonstrates how to set up topology-aware provisioning using the Linode Block Storage CSI Driver. The StorageClass defines the provisioner and reclaim policy, while the PersistentVolumeClaim requests storage from this class. The Pod specification shows how to use the PVC and includes a node selector for region-specific deployment. | ||
|
||
> [!IMPORTANT] | ||
> To enable topology-aware provisioning, make sure to pass the following argument to the csi-provisioner sidecar: | ||
> ``` | ||
> --feature-gates=CSINodeInfo=true | ||
> ``` | ||
> This enables the CSINodeInfo feature gate, which is required for topology-aware provisioning to function correctly. | ||
> | ||
> Note: This feature is enabled by default in release v0.8.6 and later versions. | ||
|
||
#### Provisioning Process | ||
|
||
1. CO (Kubernetes) determines required topology based on application needs (pod scheduled region) and cluster layout. | ||
2. external-provisioner gathers topology requirements from CO and includes `TopologyRequirement` in `CreateVolume` call. | ||
3. CSI driver creates volume satisfying topology requirements. | ||
4. Driver returns actual topology of created volume. | ||
|
||
By leveraging topology-aware provisioning, CSI drivers ensure optimal volume placement within the infrastructure, improving performance, availability, and data locality. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
17 changes: 17 additions & 0 deletions
17
helm-chart/csi-driver/templates/linode-block-storage-topology-aware-retain.yaml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
apiVersion: storage.k8s.io/v1 | ||
kind: StorageClass | ||
metadata: | ||
name: linode-block-storage-wait-for-consumer-retain | ||
namespace: {{ required ".Values.namespace required" .Values.namespace }} | ||
{{- if eq .Values.defaultStorageClass "linode-block-storage-wait-for-consumer-retain" }} | ||
annotations: | ||
storageclass.kubernetes.io/is-default-class: "true" | ||
{{- end }} | ||
{{- if .Values.volumeTags }} | ||
parameters: | ||
linodebs.csi.linode.com/volumeTags: {{ join "," .Values.volumeTags }} | ||
{{- end}} | ||
allowVolumeExpansion: true | ||
provisioner: linodebs.csi.linode.com | ||
reclaimPolicy: Retain | ||
volumeBindingMode: WaitForFirstConsumer |
17 changes: 17 additions & 0 deletions
17
helm-chart/csi-driver/templates/linode-block-storage-topology-aware.yaml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
apiVersion: storage.k8s.io/v1 | ||
kind: StorageClass | ||
metadata: | ||
name: linode-block-storage-wait-for-consumer | ||
namespace: {{ required ".Values.namespace required" .Values.namespace }} | ||
{{- if eq .Values.defaultStorageClass "linode-block-storage-wait-for-consumer" }} | ||
annotations: | ||
storageclass.kubernetes.io/is-default-class: "true" | ||
{{- end }} | ||
{{- if .Values.volumeTags }} | ||
parameters: | ||
linodebs.csi.linode.com/volumeTags: {{ join "," .Values.volumeTags }} | ||
{{- end}} | ||
allowVolumeExpansion: true | ||
provisioner: linodebs.csi.linode.com | ||
reclaimPolicy: Delete | ||
volumeBindingMode: WaitForFirstConsumer |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.