<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Block Storage Archives - OVHcloud Blog</title>
	<atom:link href="https://blog.ovhcloud.com/tag/block-storage/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.ovhcloud.com/tag/block-storage/</link>
	<description>Innovation for Freedom</description>
	<lastBuildDate>Thu, 09 Apr 2026 13:27:26 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://blog.ovhcloud.com/wp-content/uploads/2019/07/cropped-cropped-nouveau-logo-ovh-rebranding-32x32.gif</url>
	<title>Block Storage Archives - OVHcloud Blog</title>
	<link>https://blog.ovhcloud.com/tag/block-storage/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Create encrypted Persistent Volumes on OVHcloud Managed Kubernetes clusters with LUKS</title>
		<link>https://blog.ovhcloud.com/create-encrypted-persistent-volumes-on-ovhcloud-managed-kubernetes-clusters-with-luks/</link>
		
		<dc:creator><![CDATA[Aurélie Vache]]></dc:creator>
		<pubDate>Tue, 19 Aug 2025 11:35:41 +0000</pubDate>
				<category><![CDATA[OVHcloud Engineering]]></category>
		<category><![CDATA[Tranches de Tech & co]]></category>
		<category><![CDATA[Block Storage]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[MKS]]></category>
		<category><![CDATA[Public Cloud]]></category>
		<guid isPermaLink="false">https://blog.ovhcloud.com/?p=29532</guid>

					<description><![CDATA[Since this summer, it&#8217;s possible to create encrypted OVHcloud Block Storage with OMK (OVHcloud managed key) in RBX, SBG, Paris &#38; BHS regions. More regions will come in the coming months 💪. And the good news is that you can use encrypted Block Storage using Persistent Volumes in your OVHcloud Managed Kubernetes Service (MKS) clusters [&#8230;]<img src="//blog.ovhcloud.com/wp-content/plugins/matomo/app/matomo.php?idsite=1&amp;rec=1&amp;url=https%3A%2F%2Fblog.ovhcloud.com%2Fcreate-encrypted-persistent-volumes-on-ovhcloud-managed-kubernetes-clusters-with-luks%2F&amp;action_name=Create%20encrypted%20Persistent%20Volumes%20on%20OVHcloud%20Managed%20Kubernetes%20clusters%20with%20LUKS&amp;urlref=https%3A%2F%2Fblog.ovhcloud.com%2Ffeed%2F" style="border:0;width:0;height:0" width="0" height="0" alt="" />]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image aligncenter size-large is-resized"><img fetchpriority="high" decoding="async" width="1024" height="681" src="https://blog.ovhcloud.com/wp-content/uploads/2025/08/Gribouillis-2025-08-19-11.53.11.513-1-1024x681.png" alt="" class="wp-image-29585" style="width:495px;height:auto" srcset="https://blog.ovhcloud.com/wp-content/uploads/2025/08/Gribouillis-2025-08-19-11.53.11.513-1-1024x681.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2025/08/Gribouillis-2025-08-19-11.53.11.513-1-300x200.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2025/08/Gribouillis-2025-08-19-11.53.11.513-1-768x511.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2025/08/Gribouillis-2025-08-19-11.53.11.513-1.png 1533w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>Since this summer, it&#8217;s possible to create <a href="https://github.com/ovh/public-cloud-roadmap/issues/307" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">encrypted OVHcloud Block Storage with OMK (OVHcloud managed key)</a> in RBX, SBG, Paris &amp; BHS regions. More regions will come in the coming months 💪.</p>



<p>And the good news is that you can use encrypted <strong>Block Storage</strong> using <code>Persistent Volumes</code> in your OVHcloud <strong>Managed Kubernetes Service (MKS)</strong> clusters 🎉.</p>



<p>In this post, we’ll show you how to encrypt persistent volumes on an OVHcloud Managed Kubernetes (MKS) cluster using a&nbsp;<code>csi-cinder-high-speed-gen2-luks</code>&nbsp;<code>Storage Class</code>. Leveraging LUKS-based encryption at the storage layer, you’ll learn how to protect your data at rest without sacrificing the performance of NVMe-backed volumes. </p>



<p>We’ll guide you step by step: defining the <code>Storage Class</code>, creating a <code>Persistent Volume Claim</code> (PVC), and deploying a <code>Pod</code> that mounts the encrypted volume.  </p>



<p>This practical walkthrough is designed for developers and platform engineers looking to secure their Kubernetes workloads on OVHcloud in a straightforward way.</p>



<h2 class="wp-block-heading">How to</h2>



<p>You will create a <code>Persistent Volume Claim</code> (PVC), linked to a <code>Storage Class</code>, that will automatically create a <code>Persistent Volume</code> (PV) that will automatically create an associated encrypted Public Cloud <strong>Block Storage</strong> volume.<br>Then you will create a <code>Pod</code> attached to the <code>PVC</code>.</p>



<figure class="wp-block-image aligncenter size-large is-resized"><img decoding="async" width="1024" height="970" src="https://blog.ovhcloud.com/wp-content/uploads/2025/08/image-1024x970.png" alt="" class="wp-image-29539" style="width:560px;height:auto" srcset="https://blog.ovhcloud.com/wp-content/uploads/2025/08/image-1024x970.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2025/08/image-300x284.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2025/08/image-768x728.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2025/08/image.png 1144w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h3 class="wp-block-heading">Let’s create an encrypted Persistent Volume in our OVHcloud MKS cluster</h3>



<p>Prerequisite: Have an OVHcloud MKS cluster.</p>



<p>First, create a <code>csi-cinder-high-speed-gen2-luks.yaml</code> file with the following content:</p>



<p>💡 Note that if you deploy in on a MKS 1AZ cluster (instead of my 3AZ MKS cluster), you should define the <code>volumeBindingMode</code> to <code>Immediate</code> instead.</p>



<pre class="wp-block-code"><code class="">apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: csi-cinder-high-speed-gen2-luks
allowVolumeExpansion: true
parameters:
  fsType: ext4
  type: high-speed-gen2-luks
provisioner: cinder.csi.openstack.org
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer </code></pre>



<p>This StorageClass is using the same configuration as existing <code>csi-cinder-high-speed-gen2</code> but with the <code>high-speed-gen2-luks</code> type.</p>



<p>So the result will be the usage of SSD disks with NVMe interfaces encrypted with LUKS (Linux Unified Key Setup) which is a standard on-disk format for hard disk encryption.</p>



<p>Apply the manifest file:</p>



<pre class="wp-block-code"><code class="">kubectl apply -f csi-cinder-high-speed-gen2-luks.yaml</code></pre>



<p>⚠️ You can&#8217;t modify the <code>volumeBindingMode</code> value for an existing <code>Storage Class</code>, you have to delete it and create a new one.</p>



<p>List the <code>Storage Class</code>es in the cluster:</p>



<pre class="wp-block-code"><code class="">$ kubectl get sc
NAME                              PROVISIONER                RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
csi-cinder-high-speed (default)   cinder.csi.openstack.org   Delete          WaitForFirstConsumer   true                   33d
csi-cinder-high-speed-gen-2       cinder.csi.openstack.org   Delete          WaitForFirstConsumer   true                   33d
csi-cinder-high-speed-gen2-luks   cinder.csi.openstack.org   Delete          WaitForFirstConsumer   true                   4s</code></pre>



<p>Create a <code>pvc-luks.yaml</code> file with the following content:</p>



<pre class="wp-block-code"><code class="">apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-luks
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  storageClassName: csi-cinder-high-speed-gen2-luks</code></pre>



<p>Create a new namespace and apply the manifest file into it:</p>



<pre class="wp-block-code"><code class="">kubectl create ns test-pvc-luks
kubectl apply -f pvc-luks.yaml -n test-pvc-luks</code></pre>



<p>Check the status of our newly created <code>PVC</code>:</p>



<pre class="wp-block-code"><code class="">$ kubectl get pvc -n test-pvc-luks<br>NAME       STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS                      VOLUMEATTRIBUTESCLASS   AGE<br>pvc-luks   Pending                                      csi-cinder-high-speed-gen2-luks   &lt;unset&gt;                 3s<br><br><br>$ kubectl describe pvc pvc-luks -n test-pvc-luks<br>Name:          pvc-luks<br>Namespace:     test-pvc-luks<br>StorageClass:  csi-cinder-high-speed-gen2-luks<br>Status:        Pending<br>Volume:<br>Labels:        &lt;none&gt;<br>Annotations:   &lt;none&gt;<br>Finalizers:    [kubernetes.io/pvc-protection]<br>Capacity:<br>Access Modes:<br>VolumeMode:    Filesystem<br>Used By:       &lt;none&gt;<br>Events:<br>  Type    Reason                Age                From                         Message<br>  ----    ------                ----               ----                         -------<br>  Normal  WaitForFirstConsumer  10s (x2 over 10s)  persistentvolume-controller  waiting for first consumer to be created before binding<br>$ kubectl describe pvc pvc-luks<br>Name:          pvc-luks<br>Namespace:     test-pvc-luks<br>StorageClass:  csi-cinder-high-speed-gen2-luks<br>Status:        Pending<br>Volume:<br>Labels:        &lt;none&gt;<br>Annotations:   &lt;none&gt;<br>Finalizers:    [kubernetes.io/pvc-protection]<br>Capacity:<br>Access Modes:<br>VolumeMode:    Filesystem<br>Used By:       &lt;none&gt;<br>Events:<br>  Type    Reason                Age                From                         Message<br>  ----    ------                ----               ----                         -------<br>  Normal  WaitForFirstConsumer  10s (x2 over 10s)  persistentvolume-controller  waiting for first consumer to be created before binding</code></pre>



<p>As you can see, your <code>PVC</code> have been creating, with the luks <code>Storage Class</code>, and is <em><strong>Pending</strong></em> to be <strong><em>Bound</em></strong>, until the creation of a <code>Pod</code> with a volume (because of the <code>WaitForFirstConsumer</code> value):</p>



<p>Create a <code>pod.yaml</code> file with the following content:</p>



<pre class="wp-block-code"><code class="">apiVersion: v1
kind: Pod
metadata:
  name: pod-with-encrypted-volume
spec:
  containers:
  - name: nginx
    image: nginx
    volumeMounts:
    - mountPath: "/usr/share/nginx/html"
      name: encrypted-volume
  volumes:
  - name: encrypted-volume
    persistentVolumeClaim:
      claimName: pvc-luks</code></pre>



<p>Create a new <code>namespace</code> and apply the manifest file into it:</p>



<pre class="wp-block-code"><code class="">kubectl apply -f pod.yaml -n test-pvc-luks</code></pre>



<p>The <code>PVC</code> should now be <strong><em>Bound</em></strong> and a new <code>PV</code> should be created:</p>



<pre class="wp-block-code"><code class="">$ kubectl get pvc -n test-pvc-luks
NAME       STATUS   VOLUME                                                                     CAPACITY   ACCESS MODES   STORAGECLASS                      VOLUMEATTRIBUTESCLASS   AGE
pvc-luks   Bound    ovh-managed-kubernetes-siti343p-pvc-3a3b1d2e-ebdf-41a2-8f8f-4ee6984b6149   10Gi       RWO            csi-cinder-high-speed-gen2-luks   &lt;unset&gt;                 3m27s

$ kubectl get pv -n test-pvc-luks
NAME                                                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                    STORAGECLASS                      VOLUMEATTRIBUTESCLASS   REASON   AGE
ovh-managed-kubernetes-siti343p-pvc-3a3b1d2e-ebdf-41a2-8f8f-4ee6984b6149   10Gi       RWO            Delete           Bound    test-pvc-luks/pvc-luks   csi-cinder-high-speed-gen2-luks   &lt;unset&gt;                          32s</code></pre>



<p>First the <code>Pod</code> should be in <code><strong><em>ContainerCreating</em></strong></code> state (waiting the creation and the attachment of the volume) and after few seconds it will be <em><strong>Running</strong></em>:</p>



<pre class="wp-block-code"><code class="">$ kubectl get pod pod-with-encrypted-volume -n test-pvc-luks
NAME                        READY   STATUS              RESTARTS   AGE
pod-with-encrypted-volume   0/1     ContainerCreating   0          44s

# Wait a little...

$ kubectl get pod pod-with-encrypted-volume -n test-pvc-luks
NAME                        READY   STATUS    RESTARTS   AGE
pod-with-encrypted-volume   1/1     Running   0          2m10s</code></pre>



<p>The <code>Pod</code> is now created with an attached volume:</p>



<pre class="wp-block-code"><code class="">$ kubectl describe pod pod-with-encrypted-volume -n test-pvc-luks<br>Name:             pod-with-encrypted-volume<br>Namespace:        test-pvc-luks<br>Priority:         0<br>Service Account:  default<br>Node:             my-pool-zone-c-h5xjf-7n7kt/192.168.142.174<br>Start Time:       Tue, 19 Aug 2025 10:10:41 +0200<br>Labels:           &lt;none&gt;<br>Annotations:      &lt;none&gt;<br>Status:           Running<br>IP:               10.240.0.203<br>IPs:<br>  IP:  10.240.0.203<br>Containers:<br>  nginx:<br>    Container ID:   containerd://c38c0a0e19970503ad1bfaa0c74b5cc320cb9df08456c7613b9a9a8c908b9190<br>    Image:          nginx<br>    Image ID:       docker.io/library/nginx@sha256:33e0bbc7ca9ecf108140af6288c7c9d1ecc77548cbfd3952fd8466a75edefe57<br>    Port:           &lt;none&gt;<br>    Host Port:      &lt;none&gt;<br>    State:          Running<br>      Started:      Tue, 19 Aug 2025 10:11:42 +0200<br>    Ready:          True<br>    Restart Count:  0<br>    Environment:    &lt;none&gt;<br>    Mounts:<br>      /usr/share/nginx/html from encrypted-volume (rw)<br>      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-vbcnk (ro)<br>Conditions:<br>  Type                        Status<br>  PodReadyToStartContainers   True<br>  Initialized                 True<br>  Ready                       True<br>  ContainersReady             True<br>  PodScheduled                True<br>Volumes:<br>  encrypted-volume:<br>    Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)<br>    ClaimName:  pvc-luks<br>    ReadOnly:   false<br>  kube-api-access-vbcnk:<br>    Type:                    Projected (a volume that contains injected data from multiple sources)<br>    TokenExpirationSeconds:  3607<br>    ConfigMapName:           kube-root-ca.crt<br>    ConfigMapOptional:       &lt;nil&gt;<br>    DownwardAPI:             true<br>QoS Class:                   BestEffort<br>Node-Selectors:              &lt;none&gt;<br>Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s<br>                             node.kubernetes.io/unreachable:NoExecute op=Exists for 300s<br>Events:<br>  Type     Reason                  Age                    From                     Message<br>  ----     ------                  ----                   ----                     -------<br>  Normal   Scheduled               3m48s                  default-scheduler        Successfully assigned test-pvc-luks/pod-with-encrypted-volume to my-pool-zone-c-xxxx-xxxx<br>  ...<br>  Normal   SuccessfulAttachVolume  3m8s                   attachdetach-controller  AttachVolume.Attach succeeded for volume "ovh-managed-kubernetes-siti343p-pvc-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"<br>  Normal   Pulling                 2m53s                  kubelet                  Pulling image "nginx"<br>  Normal   Pulled                  2m48s                  kubelet                  Successfully pulled image "nginx" in 5.072s (5.072s including waiting). Image size: 72324501 bytes.<br>  Normal   Created                 2m48s                  kubelet                  Created container: nginx<br>  Normal   Started                 2m48s                  kubelet                  Started container nginx</code></pre>



<p>Logging in the OVHcloud Control Panel, you can see that the encrypted volume have been successfully created:</p>



<figure class="wp-block-image aligncenter size-large"><img decoding="async" width="1024" height="310" src="https://blog.ovhcloud.com/wp-content/uploads/2025/08/image-1-1024x310.png" alt="" class="wp-image-29581" srcset="https://blog.ovhcloud.com/wp-content/uploads/2025/08/image-1-1024x310.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2025/08/image-1-300x91.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2025/08/image-1-768x233.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2025/08/image-1-1536x465.png 1536w, https://blog.ovhcloud.com/wp-content/uploads/2025/08/image-1.png 2020w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>Finally, you can use your volume.</p>



<p>Execute a shell in the Nginx <code>Pod</code> and create an <code>index.html</code> file into it:</p>



<pre class="wp-block-code"><code class="">$ kubectl exec -it pod-with-encrypted-volume -n test-pvc-luks -- /bin/bash

root@pod-with-encrypted-volume:/# echo "Hello from OVHcloud encrypted Block Storage!" &gt; /usr/share/nginx/html/index.html</code></pre>



<p>And curl the webserver: </p>



<pre class="wp-block-code"><code class="">root@pod-with-encrypted-volume:/# apt update
root@pod-with-encrypted-volume:/# apt install curl
root@pod-with-encrypted-volume:/# curl http://localhost/
Hello from OVHcloud encrypted Block Storage!</code></pre>



<p>🎉</p>



<h2 class="wp-block-heading">What&#8217;s next?</h2>



<p>In this blog post we saw a basic (but concrete) usage of the encrypted <code>Persistent Volume</code> on OVHcloud Kubernetes clusters that just bee released, don&#8217;t hesitate to think about it for your sensitive data.<br><br>In the coming months, the encrypted <strong>Block Storage</strong> will be available worldwide. Follow the <a href="https://github.com/ovh/public-cloud-roadmap/issues/307" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Encrypted Block Volumes</a> issue on GitHub to stay informed.<br><br>And don&#8217;t hesitate to take a look to our <a href="https://github.com/orgs/ovh/projects/16" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Cloud Roadmap &amp; Changelog</a> to see the state of all of the coming features in OVHcloud Public Cloud products.</p>
<img loading="lazy" decoding="async" src="//blog.ovhcloud.com/wp-content/plugins/matomo/app/matomo.php?idsite=1&amp;rec=1&amp;url=https%3A%2F%2Fblog.ovhcloud.com%2Fcreate-encrypted-persistent-volumes-on-ovhcloud-managed-kubernetes-clusters-with-luks%2F&amp;action_name=Create%20encrypted%20Persistent%20Volumes%20on%20OVHcloud%20Managed%20Kubernetes%20clusters%20with%20LUKS&amp;urlref=https%3A%2F%2Fblog.ovhcloud.com%2Ffeed%2F" style="border:0;width:0;height:0" width="0" height="0" alt="" />]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
