<?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>File Storage Archives - OVHcloud Blog</title>
	<atom:link href="https://blog.ovhcloud.com/tag/file-storage/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.ovhcloud.com/tag/file-storage/</link>
	<description>Innovation for Freedom</description>
	<lastBuildDate>Thu, 16 Jul 2026 12:26:47 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://blog.ovhcloud.com/wp-content/uploads/2019/07/cropped-cropped-nouveau-logo-ovh-rebranding-32x32.gif</url>
	<title>File Storage Archives - OVHcloud Blog</title>
	<link>https://blog.ovhcloud.com/tag/file-storage/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Navigating OVHcloud  File Storage with Manila CSI (RWX) on Kubernetes clusters (MKS)</title>
		<link>https://blog.ovhcloud.com/manila-csi-ovhcloud-file-storage/</link>
		
		<dc:creator><![CDATA[Aurélie Vache]]></dc:creator>
		<pubDate>Thu, 16 Jul 2026 12:16:24 +0000</pubDate>
				<category><![CDATA[OVHcloud Engineering]]></category>
		<category><![CDATA[Tranches de Tech & Co — Tech bites]]></category>
		<category><![CDATA[File Storage]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[Public Cloud]]></category>
		<guid isPermaLink="false">https://blog.ovhcloud.com/?p=32926</guid>

					<description><![CDATA[If you run stateful applications on Kubernetes, one common challenge is providing shared persistent storage that can be accessed by [&#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%2Fmanila-csi-ovhcloud-file-storage%2F&amp;action_name=Navigating%20OVHcloud%20%20File%20Storage%20with%20Manila%20CSI%20%28RWX%29%20on%20Kubernetes%20clusters%20%28MKS%29&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="1022" src="https://blog.ovhcloud.com/wp-content/uploads/2026/07/hero-manila-csi-file-storage-kubernetes-1-1024x1022.png" alt="Navigating OVHcloud File Storage with Manila CSI (RWX) on Kubernetes clusters (MKS)" class="wp-image-32976" style="aspect-ratio:1.0018478908240174;width:490px;height:auto" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/07/hero-manila-csi-file-storage-kubernetes-1-1024x1022.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2026/07/hero-manila-csi-file-storage-kubernetes-1-300x300.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2026/07/hero-manila-csi-file-storage-kubernetes-1-150x150.png 150w, https://blog.ovhcloud.com/wp-content/uploads/2026/07/hero-manila-csi-file-storage-kubernetes-1-768x767.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/07/hero-manila-csi-file-storage-kubernetes-1-1536x1533.png 1536w, https://blog.ovhcloud.com/wp-content/uploads/2026/07/hero-manila-csi-file-storage-kubernetes-1-70x70.png 70w, https://blog.ovhcloud.com/wp-content/uploads/2026/07/hero-manila-csi-file-storage-kubernetes-1.png 1635w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">If you run stateful applications on Kubernetes, one common challenge is providing shared persistent storage that can be accessed by multiple workloads.</p>



<p class="wp-block-paragraph">While Kubernetes Persistent Volumes usually rely on block storage with <code>ReadWriteOnce</code> access, some applications require shared filesystem access with <code>ReadWriteMany</code> (<code>RWX</code>) capabilities.</p>



<p class="wp-block-paragraph">OVHcloud <strong>File Storage</strong> provides managed <strong>NFS shares</strong> that can be dynamically consumed by Kubernetes workloads through the <strong>Manila CSI </strong>driver.</p>



<p class="wp-block-paragraph">In this blog post, we will see how to integrate <a href="https://www.ovhcloud.com/en/public-cloud/file-storage/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">OVHcloud File Storage</a> with <a href="https://www.ovhcloud.com/en/public-cloud/kubernetes/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">OVHcloud Managed Kubernetes Service (MKS)</a> using Manila CSI and test RWX storage capabilities.</p>



<h3 class="wp-block-heading">OVHcloud File Storage</h3>



<figure class="wp-block-image aligncenter size-full"><img decoding="async" width="100" height="100" src="https://blog.ovhcloud.com/wp-content/uploads/2026/07/Public-Cloud-File-Storage@2x.png" alt="OVHcloud File Storage managed NFS shares for cloud-native Kubernetes workloads." class="wp-image-32967" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/07/Public-Cloud-File-Storage@2x.png 100w, https://blog.ovhcloud.com/wp-content/uploads/2026/07/Public-Cloud-File-Storage@2x-70x70.png 70w" sizes="(max-width: 100px) 100vw, 100px" /></figure>



<p class="wp-block-paragraph"><a href="https://www.ovhcloud.com/en/public-cloud/file-storage/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">OVHcloud Public Cloud File Storage</a> is a fully managed shared file storage service designed for cloud-native workloads running on Public Cloud instances and Kubernetes clusters.</p>



<p class="wp-block-paragraph">Built on <strong>OpenStack Manila</strong>, it provides shared <strong>NFSv3</strong> volumes that can be mounted simultaneously by multiple clients, making it an ideal solution for applications requiring <code>ReadWriteMany</code> (<code>RWX</code>) access. Volumes can be provisioned from <strong>150 GiB up to 10 TiB</strong>, with predictable, linear performance that scales with the allocated capacity.</p>



<p class="wp-block-paragraph">Because the service is fully managed, you don&#8217;t need to deploy or maintain your own NFS server. File Storage integrates with the OVHcloud platform through the Control Panel, API, CLI, Terraform provider, and Kubernetes via the <strong>Manila CSI driver</strong>, allowing shared volumes to be dynamically provisioned directly from your cluster.</p>



<h3 class="wp-block-heading">Why use Manila CSI?</h3>



<p class="wp-block-paragraph">The Kubernetes Container Storage Interface (CSI) provides a standard mechanism for exposing external storage systems to Kubernetes.</p>



<p class="wp-block-paragraph">Instead of manually creating NFS mounts and PersistentVolumes, the Manila CSI driver allows Kubernetes to dynamically create and manage file shares using Kubernetes resources such as StorageClasses (SC), PersistentVolumeClaims (PVC) and PersistentVolumes (PV).</p>



<h3 class="wp-block-heading">Prerequisites</h3>



<p class="wp-block-paragraph">Before starting, you need:</p>



<ul class="wp-block-list">
<li>An OVHcloud Public Cloud project</li>



<li>An OVHcloud Managed Kubernetes Service (MKS) cluster that is connected to a private network</li>



<li><a href="https://developer.hashicorp.com/terraform/install" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Terraform CLI</a> installed</li>



<li><a href="https://kubernetes.io/docs/tasks/tools/#kubectl" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">kubectl CLI </a>installed</li>
</ul>



<h3 class="wp-block-heading">Deploying Manila CSI step by step: let’s do it!</h3>



<p class="wp-block-paragraph">We already have a MKS cluster, in EU-WEST-PAR region, running inside a private network and a subnet. In this blog post we will:</p>



<ul class="wp-block-list">
<li>create a <strong>Public Cloud user</strong> for the Manila CSI driver</li>



<li>install the <strong>CSI NFS driver</strong></li>



<li>install the <strong>Manila CSI driver</strong></li>



<li>deploy a <strong>Secret</strong> for Manila CSI that allows the Manila CSI driver to authenticate against OpenStack and manage Manila resources in your cluster</li>



<li>create a file shared network</li>



<li>deploy a <strong>ConfigMap</strong> to configure the Manila CSI driver</li>



<li>deploy the csi-manila-nfs <strong>StorageClass</strong> to enable the Manila CSI driver to dynamically create Manila shares and use them as Kubernetes volumes</li>
</ul>



<p class="wp-block-paragraph">We will use Terraform to deploy this architecture easily.</p>



<p class="wp-block-paragraph">Create a <strong>provider.tf </strong>file and fill it with the information:</p>



<pre class="wp-block-code"><code class="">terraform {<br>  required_providers {<br>    helm = {<br>      source = "hashicorp/helm"<br>    }<br><br>    kubectl = {<br>      source = "alekc/kubectl"<br>      version = "2.1.6"<br>    }<br><br>    ovh = {<br>      source = "ovh/ovh"<br>    }<br>  }<br>}<br><br>provider "helm" {<br>  kubernetes = {<br>    host                   = data.ovh_cloud_project_kube.mks_cluster.kubeconfig_attributes[0].host<br>    client_certificate     = base64decode(data.ovh_cloud_project_kube.mks_cluster.kubeconfig_attributes[0].client_certificate)<br>    client_key             = base64decode(data.ovh_cloud_project_kube.mks_cluster.kubeconfig_attributes[0].client_key)<br>    cluster_ca_certificate = base64decode(data.ovh_cloud_project_kube.mks_cluster.kubeconfig_attributes[0].cluster_ca_certificate)<br>  }<br>}<br><br>provider "kubectl" {<br>  host                   = data.ovh_cloud_project_kube.mks_cluster.kubeconfig_attributes[0].host<br>  client_certificate     = base64decode(data.ovh_cloud_project_kube.mks_cluster.kubeconfig_attributes[0].client_certificate)<br>  client_key             = base64decode(data.ovh_cloud_project_kube.mks_cluster.kubeconfig_attributes[0].client_key)<br>  cluster_ca_certificate = base64decode(data.ovh_cloud_project_kube.mks_cluster.kubeconfig_attributes[0].cluster_ca_certificate)<br>  load_config_file       = false<br>}</code></pre>



<p class="wp-block-paragraph">Set the environment variables, for the OVHcloud Terraform provider, with your credentials:</p>



<pre class="wp-block-code"><code class=""># OVHcloud provider needed keys<br>export OVH_ENDPOINT="ovh-eu"<br>export OVH_APPLICATION_KEY="xxx"<br>export OVH_APPLICATION_SECRET="xxx"<br>export OVH_CONSUMER_KEY="xxx"<br>export OVH_CLOUD_PROJECT_SERVICE="xxx"</code></pre>



<p class="wp-block-paragraph">Create a <strong>variables.tf.template</strong> file and fill it with these information:</p>



<pre class="wp-block-code"><code class="">variable "service_name" {<br>  default = "$OVH_CLOUD_PROJECT_SERVICE"<br>}<br><br>variable "mks_cluster_id" {<br>  default = "&lt;your_mks_cluster_id&gt;"<br>}</code></pre>



<p class="wp-block-paragraph">⚠️ In the file, replace the MKS ID with your existing MKS cluster ID information.</p>



<p class="wp-block-paragraph">Replace the value of the <strong>OVH_CLOUD_PROJECT_SERVICE</strong> environment variable in the <strong>variables.tf</strong> file:</p>



<pre class="wp-block-code"><code class="">envsubst &lt; variables.tf.template &gt; variables.tf</code></pre>



<p class="wp-block-paragraph">Create a <strong>nfs_share.tf</strong> file and fill it with these information:</p>



<pre class="wp-block-code"><code class="">data "ovh_cloud_project_kube" "mks_cluster" {<br>  service_name = var.service_name<br>  kube_id      = var.mks_cluster_id<br>}<br><br>data "ovh_cloud_network_private_vrack_subnet" "mks_cluster_subnet" {<br>  service_name = var.service_name<br>  network_id   = data.ovh_cloud_project_kube.mks_cluster.private_network_id<br>  id           = data.ovh_cloud_project_kube.mks_cluster.nodes_subnet_id<br>}<br><br># CSI Manila<br><br>module "csi_manila" {<br>  source = "git::https://github.com/ovh/public-cloud-examples.git//containers-orchestration/managed-kubernetes/install-csi-manila/modules/ovhcloud/csi_manila?ref=v1.5.0"<br><br>  service_name       = var.service_name<br>  region             = data.ovh_cloud_project_kube.mks_cluster.region<br>  share_network_name = "${data.ovh_cloud_project_kube.mks_cluster.name}-share-network"<br>  network_id         = data.ovh_cloud_project_kube.mks_cluster.private_network_id<br>  subnet_id          = data.ovh_cloud_project_kube.mks_cluster.nodes_subnet_id<br>  subnet_cidr        = data.ovh_cloud_network_private_vrack_subnet.mks_cluster_subnet.cidr<br>}<br><br>output "manila-user" {<br>  value = module.csi_manila.manila-user<br>}<br></code></pre>



<p class="wp-block-paragraph">💡In this Terraform file we are using an <a href="https://github.com/ovh/public-cloud-examples/tree/main/containers-orchestration/managed-kubernetes/install-csi-manila/modules/ovhcloud/csi_manila" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">existing <strong>csi_manila</strong> Terraform module</a> hosted in the <a href="https://github.com/ovh/public-cloud-examples/blob/main/containers-orchestration/managed-kubernetes/install-csi-manila/modules/ovhcloud/csi_manila/main.tf" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">OVHcloud Public Cloud Examples GitHub repository</a>.</p>



<p class="wp-block-paragraph">The Terraform configuration is ready. Let’s init it:</p>



<pre class="wp-block-code"><code class="">terraform init</code></pre>



<p class="wp-block-paragraph">The output should be like this:</p>



<pre class="wp-block-code"><code class="">$ terraform init<br><br>Initializing the backend...<br>Initializing modules...<br>Downloading git::https://github.com/ovh/public-cloud-examples.git?ref=v1.5.0 for csi_manila...<br>- csi_manila in .terraform/modules/csi_manila/containers-orchestration/managed-kubernetes/install-csi-manila/modules/ovhcloud/csi_manila<br>Initializing provider plugins...<br>- Reusing previous version of hashicorp/helm from the dependency lock file<br>- Reusing previous version of alekc/kubectl from the dependency lock file<br>- Reusing previous version of ovh/ovh from the dependency lock file<br>- Installing hashicorp/helm v3.2.0...<br>- Installed hashicorp/helm v3.2.0 (signed by HashiCorp)<br>- Installing alekc/kubectl v2.1.6...<br>- Installed alekc/kubectl v2.1.6 (self-signed, key ID 772FB27A86DAFCE7)<br>- Installing ovh/ovh v2.16.1...<br>- Installed ovh/ovh v2.16.1 (signed by a HashiCorp partner, key ID F56D1A6CBDAAADA5)<br>Partner and community providers are signed by their developers.<br>If you'd like to know more about provider signing, you can read about it here:<br>https://developer.hashicorp.com/terraform/cli/plugins/signing<br><br>Terraform has been successfully initialized!<br><br>You may now begin working with Terraform. Try running "terraform plan" to see<br>any changes that are required for your infrastructure. All Terraform commands<br>should now work.<br><br>If you ever set or change modules or backend configuration for Terraform,<br>rerun this command to reinitialize your working directory. If you forget, other<br>commands will detect it and remind you to do so if necessary.</code></pre>



<p class="wp-block-paragraph">Apply it:</p>



<pre class="wp-block-code"><code class="">terraform apply</code></pre>



<p class="wp-block-paragraph">The output should be like this:</p>



<pre class="wp-block-code"><code class="">$ terraform apply<br><br>data.ovh_cloud_project_kube.mks_cluster: Reading...<br>data.ovh_cloud_project_kube.mks_cluster: Read complete after 1s [id=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx]<br>data.ovh_cloud_network_private_vrack_subnet.mks_cluster_subnet: Reading...<br>data.ovh_cloud_network_private_vrack_subnet.mks_cluster_subnet: Read complete after 1s [id=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx]<br><br>Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:<br>  + create<br><br>Terraform will perform the following actions:<br><br>  # module.csi_manila.helm_release.csi-driver-nfs will be created<br>  + resource "helm_release" "csi-driver-nfs" {<br>      + atomic                     = false<br>      + chart                      = "csi-driver-nfs"<br>      + cleanup_on_fail            = false<br>      + create_namespace           = false<br>      + dependency_update          = false<br>      + disable_crd_hooks          = false<br>      + disable_openapi_validation = false<br>      + disable_webhooks           = false<br>      + force_update               = false<br>      + id                         = (known after apply)<br>      + lint                       = false<br>      + max_history                = 0<br>      + metadata                   = (known after apply)<br>      + name                       = "csi-driver-nfs"<br>      + namespace                  = "kube-system"<br>      + pass_credentials           = false<br>      + recreate_pods              = false<br>      + render_subchart_notes      = true<br>      + replace                    = false<br>      + repository                 = "https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/master/charts"<br>      + reset_values               = false<br>      + reuse_values               = false<br>      + set_wo                     = (write-only attribute)<br>      + skip_crds                  = false<br>      + status                     = "deployed"<br>      + take_ownership             = false<br>      + timeout                    = 300<br>      + upgrade_install            = false<br>      + verify                     = false<br>      + version                    = "4.13.4"<br>      + wait                       = true<br>      + wait_for_jobs              = false<br>    }<br><br>  # module.csi_manila.helm_release.openstack-manila-csi will be created<br>  + resource "helm_release" "openstack-manila-csi" {<br>      + atomic                     = false<br>      + chart                      = "openstack-manila-csi"<br>      + cleanup_on_fail            = false<br>      + create_namespace           = false<br>      + dependency_update          = false<br>      + disable_crd_hooks          = false<br>      + disable_openapi_validation = false<br>      + disable_webhooks           = false<br>      + force_update               = false<br>      + id                         = (known after apply)<br>      + lint                       = false<br>      + max_history                = 0<br>      + metadata                   = (known after apply)<br>      + name                       = "openstack-manila-csi"<br>      + namespace                  = "kube-system"<br>      + pass_credentials           = false<br>      + recreate_pods              = false<br>      + render_subchart_notes      = true<br>      + replace                    = false<br>      + repository                 = "https://kubernetes.github.io/cloud-provider-openstack"<br>      + reset_values               = false<br>      + reuse_values               = false<br>      + set_wo                     = (write-only attribute)<br>      + skip_crds                  = false<br>      + status                     = "deployed"<br>      + take_ownership             = false<br>      + timeout                    = 300<br>      + upgrade_install            = false<br>      + verify                     = false<br>      + version                    = "2.36.0"<br>      + wait                       = true<br>      + wait_for_jobs              = false<br>    }<br><br>  # module.csi_manila.kubectl_manifest.csi-manila-secrets will be created<br>  + resource "kubectl_manifest" "csi-manila-secrets" {<br>      + api_version             = (known after apply)<br>      + apply_only              = false<br>      + field_manager           = "kubectl"<br>      + force_conflicts         = false<br>      + force_new               = false<br>      + id                      = (known after apply)<br>      + kind                    = (known after apply)<br>      + live_manifest_incluster = (sensitive value)<br>      + live_uid                = (known after apply)<br>      + name                    = (known after apply)<br>      + namespace               = (known after apply)<br>      + server_side_apply       = false<br>      + uid                     = (known after apply)<br>      + validate_schema         = true<br>      + wait_for_rollout        = true<br>      + yaml_body               = (sensitive value)<br>      + yaml_body_parsed        = (known after apply)<br>      + yaml_incluster          = (sensitive value)<br>    }<br><br>  # module.csi_manila.kubectl_manifest.manila-runtime-configmap will be created<br>  + resource "kubectl_manifest" "manila-runtime-configmap" {<br>      + api_version             = "v1"<br>      + apply_only              = false<br>      + field_manager           = "kubectl"<br>      + force_conflicts         = false<br>      + force_new               = false<br>      + id                      = (known after apply)<br>      + kind                    = "ConfigMap"<br>      + live_manifest_incluster = (sensitive value)<br>      + live_uid                = (known after apply)<br>      + name                    = "manila-csi-runtimeconf-cm"<br>      + namespace               = "default"<br>      + server_side_apply       = false<br>      + uid                     = (known after apply)<br>      + validate_schema         = true<br>      + wait_for_rollout        = true<br>      + yaml_body               = (sensitive value)<br>      + yaml_body_parsed        = &lt;&lt;-EOT<br>            apiVersion: v1<br>            data:<br>              runtimeconfig.json: |<br>                {<br>                  "nfs": {<br>                    "matchExportLocationAddress": "10.1.0.0/16"<br>                  }<br>                }<br>            kind: ConfigMap<br>            metadata:<br>              annotations:<br>                meta.helm.sh/release-name: manila-csi<br>                meta.helm.sh/release-namespace: default<br>              labels:<br>                app.kubernetes.io/managed-by: Helm<br>              name: manila-csi-runtimeconf-cm<br>              namespace: default<br>        EOT<br>      + yaml_incluster          = (sensitive value)<br>    }<br><br>  # module.csi_manila.kubectl_manifest.storage-class will be created<br>  + resource "kubectl_manifest" "storage-class" {<br>      + api_version             = (known after apply)<br>      + apply_only              = false<br>      + field_manager           = "kubectl"<br>      + force_conflicts         = false<br>      + force_new               = false<br>      + id                      = (known after apply)<br>      + kind                    = (known after apply)<br>      + live_manifest_incluster = (sensitive value)<br>      + live_uid                = (known after apply)<br>      + name                    = (known after apply)<br>      + namespace               = (known after apply)<br>      + server_side_apply       = false<br>      + uid                     = (known after apply)<br>      + validate_schema         = true<br>      + wait_for_rollout        = true<br>      + yaml_body               = (sensitive value)<br>      + yaml_body_parsed        = (known after apply)<br>      + yaml_incluster          = (sensitive value)<br>    }<br><br>  # module.csi_manila.ovh_cloud_project_user.manila-user will be created<br>  + resource "ovh_cloud_project_user" "manila-user" {<br>      + creation_date = (known after apply)<br>      + description   = "User for the Manila CSI driver"<br>      + id            = (known after apply)<br>      + openstack_rc  = (known after apply)<br>      + password      = (sensitive value)<br>      + role_name     = "share_operator"<br>      + roles         = (known after apply)<br>      + service_name  = "xxxxxxxxxxxxxxxxxxxxx"<br>      + status        = (known after apply)<br>      + username      = (known after apply)<br>    }<br><br>  # module.csi_manila.ovh_cloud_storage_file_share_network.sharenetwork will be created<br>  + resource "ovh_cloud_storage_file_share_network" "sharenetwork" {<br>      + checksum        = (known after apply)<br>      + created_at      = (known after apply)<br>      + current_state   = (known after apply)<br>      + description     = (known after apply)<br>      + id              = (known after apply)<br>      + name            = "mks_standard_3az-share-network"<br>      + network_id      = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx"<br>      + region          = "EU-WEST-PAR"<br>      + resource_status = (known after apply)<br>      + service_name    = "xxxxxxxxxxxxxxxxxxxxx"<br>      + subnet_id       = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx"<br>      + updated_at      = (known after apply)<br>    }<br><br>Plan: 7 to add, 0 to change, 0 to destroy.<br><br>Changes to Outputs:<br>  + manila-user = (known after apply)<br><br>Do you want to perform these actions?<br>  Terraform will perform the actions described above.<br>  Only 'yes' will be accepted to approve.<br><br>  Enter a value: yes<br><br>module.csi_manila.ovh_cloud_storage_file_share_network.sharenetwork: Creating...<br>module.csi_manila.ovh_cloud_project_user.manila-user: Creating...<br>module.csi_manila.kubectl_manifest.manila-runtime-configmap: Creating...<br>module.csi_manila.kubectl_manifest.manila-runtime-configmap: Creation complete after 0s [id=/api/v1/namespaces/default/configmaps/manila-csi-runtimeconf-cm]<br>module.csi_manila.helm_release.csi-driver-nfs: Creating...<br>module.csi_manila.ovh_cloud_storage_file_share_network.sharenetwork: Still creating... [00m10s elapsed]<br>module.csi_manila.ovh_cloud_project_user.manila-user: Still creating... [00m10s elapsed]<br>module.csi_manila.ovh_cloud_storage_file_share_network.sharenetwork: Creation complete after 12s [id=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx]<br>module.csi_manila.kubectl_manifest.storage-class: Creating...<br>module.csi_manila.ovh_cloud_project_user.manila-user: Creation complete after 13s [id=718526]<br>module.csi_manila.kubectl_manifest.csi-manila-secrets: Creating...<br>module.csi_manila.kubectl_manifest.csi-manila-secrets: Creation complete after 1s [id=/api/v1/namespaces/default/secrets/csi-manila-secrets]<br>...</code></pre>



<h3 class="wp-block-heading">Let&#8217;s create dynamically File Storage on Kubernetes</h3>



<p class="wp-block-paragraph">Now, in your Kubernetes cluster, create a <strong>pvc.yaml </strong>file witht this content:</p>



<pre class="wp-block-code"><code class="">apiVersion: v1<br>kind: PersistentVolumeClaim<br>metadata:<br>  name: nfs-share-fs-pvc<br>spec:<br>  accessModes:<br>    - ReadWriteMany<br>  resources:<br>    requests:<br>      storage: 150Gi<br>  storageClassName: csi-manila-nfs</code></pre>



<p class="wp-block-paragraph">Apply this Persistent Volume Claim (PVC), thanks to that Kubernetes users can request shared storage:</p>



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



<p class="wp-block-paragraph">Check the status of the PVC:</p>



<pre class="wp-block-code"><code class="">kubectl get pvc nfs-share-fs-pvc</code></pre>



<p class="wp-block-paragraph">Wait until the status of the PVC changes to <strong>Bound</strong>.</p>



<p class="wp-block-paragraph">You should have an output like this:</p>



<pre class="wp-block-code"><code class="">$ kubectl get pvc nfs-share-fs-pvc<br><br>NAME               STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS     VOLUMEATTRIBUTESCLASS   AGE<br>nfs-share-fs-pvc   Bound    pvc-af1349b7-eb51-43ac-b0f0-94d0e8139c57   150Gi      RWX            csi-manila-nfs   &lt;unset&gt;                 3h48m</code></pre>



<p class="wp-block-paragraph">Create a <strong>deploy.yaml</strong> file and fill it with this content:</p>



<pre class="wp-block-code"><code class="">apiVersion: apps/v1<br>kind: Deployment<br>metadata:<br>  name: nginx-deployment<br>  labels:<br>    app: nginx<br>spec:<br>  replicas: 1<br>  selector:<br>    matchLabels:<br>      app: nginx<br>  template:<br>    metadata:<br>      labels:<br>        app: nginx<br>    spec:<br>      volumes:<br>      - name: nfs-share-fs-pvc<br>        persistentVolumeClaim:<br>          claimName: nfs-share-fs-pvc<br>      containers:<br>      - name: nginx<br>        image: nginx<br>        ports:<br>          - containerPort: 80<br>            name: "http-server"<br>        volumeMounts:<br>          - mountPath: "/usr/share/nginx/html"<br>            name: nfs-share-fs-pvc</code></pre>



<p class="wp-block-paragraph">Apply this deployment with one pod that has a volume attached to nfs-share-fs-pvc:</p>



<pre class="wp-block-code"><code class="">kubectl apply -f deploy.yaml</code></pre>



<p class="wp-block-paragraph">Verify that the pod is running:</p>



<pre class="wp-block-code"><code class="">kubectl get pod</code></pre>



<p class="wp-block-paragraph">You should have an output like this:</p>



<pre class="wp-block-code"><code class="">$ kubectl get pod<br>NAME                                READY   STATUS    RESTARTS   AGE<br>nginx-deployment-6cbf9b898c-svpzf   1/1     Running   0          6m</code></pre>



<p class="wp-block-paragraph">Verify that you can scale the deployment (multi-attach volume):</p>



<pre class="wp-block-code"><code class="">kubectl scale deploy/nginx-deployment --replicas=2</code></pre>



<p class="wp-block-paragraph">Check another pod is running:</p>



<pre class="wp-block-code"><code class="">kubectl get pod</code></pre>



<p class="wp-block-paragraph">You should have an output like this:</p>



<pre class="wp-block-code"><code class="">$ kubectl get pod<br><br>NAME                                READY   STATUS    RESTARTS   AGE<br>nginx-deployment-6cbf9b898c-867bq   1/1     Running   0          3m<br>nginx-deployment-6cbf9b898c-svpzf   1/1     Running   0          9m</code></pre>



<p class="wp-block-paragraph">To verify RWX functionality, connect to one pod and create a file in the mounted directory (e.g., /usr/share/nginx/html).</p>



<pre class="wp-block-code"><code class="">MY_POD=$(kubectl get po -o name | sed -n '1p')<br>echo $MY_POD<br><br>#Create a file in the pod number 1<br>kubectl exec $MY_POD -it -- touch /usr/share/nginx/html/index.html</code></pre>



<p class="wp-block-paragraph">Then connect to the second pod and confirm the file is visible:</p>



<pre class="wp-block-code"><code class="">MY_POD_2=$(kubectl get po -o name | sed -n '2p')<br>echo $MY_POD_2<br><br>#Display it in the pod number two<br>kubectl exec $MY_POD_2 -it -- ls -alrt /usr/share/nginx/html/</code></pre>



<p class="wp-block-paragraph">You should have an output like this:</p>



<pre class="wp-block-code"><code class="">$ kubectl exec $MY_POD_2 -it -- ls -alrt /usr/share/nginx/html/<br><br>total 24<br>drwxr-xr-x 3 root root  4096 Jul 14 01:22 ..<br>drwx------ 2 root root 16384 Jul 15 09:18 lost+found<br>drwxrwxrwx 3 root root  4096 Jul 15 09:32 .<br>-rw-r--r-- 1 root root     0 Jul 15 13:09 index.html</code></pre>



<p class="wp-block-paragraph">Now your Manila share exposed through NFS is functioning the way you want! 🎉</p>



<h3 class="wp-block-heading">Conclusion</h3>



<p class="wp-block-paragraph">In this blog post we showed that using Manila CSI with OVHcloud File Storage makes it possible to provide Kubernetes applications with dynamically provisioned shared storage.</p>



<p class="wp-block-paragraph">We recommend you also take a look at our <a href="https://github.com/orgs/ovh/projects/16" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external">Cloud Roadmap &amp; Changelog</a> for an overview of all the coming features for OVHcloud Public Cloud products.</p>
<img 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%2Fmanila-csi-ovhcloud-file-storage%2F&amp;action_name=Navigating%20OVHcloud%20%20File%20Storage%20with%20Manila%20CSI%20%28RWX%29%20on%20Kubernetes%20clusters%20%28MKS%29&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>
