<?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>Public Cloud Archives - OVHcloud Blog</title>
	<atom:link href="https://blog.ovhcloud.com/tag/public-cloud/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.ovhcloud.com/tag/public-cloud/</link>
	<description>Innovation for Freedom</description>
	<lastBuildDate>Tue, 30 Jun 2026 12:40:23 +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>Public Cloud Archives - OVHcloud Blog</title>
	<link>https://blog.ovhcloud.com/tag/public-cloud/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Landing Zone: how to accelerate the adoption of public cloud with OVHcloud</title>
		<link>https://blog.ovhcloud.com/landing-zone-ovhcloud-adoption-public-cloud/</link>
		
		<dc:creator><![CDATA[Rémy Vandepoel]]></dc:creator>
		<pubDate>Mon, 29 Jun 2026 12:29:14 +0000</pubDate>
				<category><![CDATA[Accelerating with OVHcloud]]></category>
		<category><![CDATA[OVHcloud]]></category>
		<category><![CDATA[Public Cloud]]></category>
		<guid isPermaLink="false">https://blog.ovhcloud.com/?p=32502</guid>

					<description><![CDATA[Introduction As part of a project of mutual interest between OVHcloud and Sopra Steria, the technical teams of each company [&#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%2Flanding-zone-ovhcloud-adoption-public-cloud%2F&amp;action_name=Landing%20Zone%3A%20how%20to%20accelerate%20the%20adoption%20of%20public%20cloud%20with%20OVHcloud&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"><img fetchpriority="high" decoding="async" width="1024" height="512" src="https://blog.ovhcloud.com/wp-content/uploads/2026/06/ovhcloud_landing_zone_header-1024x512.png" alt="ovhcloud landing zone" class="wp-image-32498" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/06/ovhcloud_landing_zone_header-1024x512.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2026/06/ovhcloud_landing_zone_header-300x150.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2026/06/ovhcloud_landing_zone_header-768x384.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/06/ovhcloud_landing_zone_header-1536x768.png 1536w, https://blog.ovhcloud.com/wp-content/uploads/2026/06/ovhcloud_landing_zone_header-2048x1024.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading">Introduction</h2>



<p class="wp-block-paragraph">As part of a project of mutual interest between OVHcloud and Sopra Steria, the technical teams of each company joined forces to design the deployment of a <strong>Landing Zone</strong>. Initially, the project was designed and adapted to the needs of the public sector, to be later expanded to other markets and use cases.</p>



<h2 class="wp-block-heading">Why a Landing Zone?</h2>



<h3 class="wp-block-heading">Compliance and regulatory requirements</h3>



<p class="wp-block-paragraph">The starting point of the project was very specific: <strong>from day one, the Canadian government required a cloud environment that meets very strict sovereignty and security standards</strong>. Without a ready-to-use solution, each public client had to spend weeks, if not months, setting up their architecture, drafting procedures, and validating each component with the authorities. This created a <strong>bottleneck</strong> when projects were initiated.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><em><em>“The lack of a process to deploy a Landing Zone that was compliant with the requirements of the Canadian public sector was a real roadblock.”</em></em></p>
</blockquote>



<p class="wp-block-paragraph">The Landing Zone was designed as <strong>a deployment that complies with a regulatory framework</strong>: the created infrastructure automatically meets the segmentation, encryption, logging, and access control requirements imposed by authorities. Clients no longer have to worry about how to prove that their environment is compliant; the compliance report is generated simultaneously with the deployment. In fact, this is the whole idea behind the solution.</p>



<h3 class="wp-block-heading">Accelerating cloud adoption</h3>



<p class="wp-block-paragraph">Once the compliance issue is resolved, the Landing Zone proves to be <strong>a true adoption accelerator</strong> for all types of clients: startups, SMEs, large accounts, and, of course, governments.</p>



<ul class="wp-block-list">
<li><strong>Automation of best practices</strong>: the tools automatically deploy private networks, subnets, firewalls, service accounts, and IAM policies.</li>



<li><strong>Standardisation</strong>: each environment follows the same architectural model, which facilitates maintenance, monitoring, and upgrades.</li>



<li><strong>Time-to-market</strong>: where a manual deployment could take several weeks of work (reading documentation, manually creating resources, compliance testing), the Landing Zone allows for an <strong>operational (and compliant) environment in less than an hour</strong>.</li>
</ul>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><em><em>“In half an hour, you have something ready to use: 30 to 40% of security requirements are already automatically deployed.”</em></em></p>
</blockquote>



<h2 class="wp-block-heading">The concrete benefits for technical teams</h2>



<h3 class="wp-block-heading">Time saving and reproducibility</h3>



<p class="wp-block-paragraph">At the core of automating a Landing Zone is <strong>Infrastructure as Code (IaC)</strong>. Terraform (or its fork OpenTofu) orchestrates all OVHcloud services.<br>Thanks to this model:</p>



<ul class="wp-block-list">
<li><strong>a single script</strong> can be executed multiple times, across different accounts or regions, without changing the outcome</li>



<li><strong>human errors</strong> that occur when manually creating resources (typographical errors, configuration oversights, incorrect role assignments) are nearly eliminated</li>



<li><strong>teams</strong> move from tedious configuration to deployment validation, freeing up several days of work for each project</li>
</ul>



<h3 class="wp-block-heading">Governance and access management</h3>



<p class="wp-block-paragraph">In addition to the infrastructure, the Landing Zone incorporates a <strong>governance model</strong>: roles, policies, and safeguards are preconfigured, simplifying access management and revoking rights when someone leaves the company. This layer of abstraction addresses one of the main challenges for IT departments: visibility and control over cloud resources.</p>



<h3 class="wp-block-heading">Modularity and adaptability to different profiles</h3>



<p class="wp-block-paragraph">The code has been designed to be <strong>modular</strong>. Three basic profiles are available: “<em>small business”, “medium” </em>and<em> “government”</em>. Each profile activates a tailored set of services in terms of cost, scalability, and compliance requirements.&nbsp;</p>



<p class="wp-block-paragraph">The same code base can be <strong>extended</strong>: if a client from the financial sector requires an HSM encryption module or a certified payment gateway, it is simply a matter of adding the corresponding module and rerunning the script. This flexibility allows you to <strong>reuse</strong> the same foundation for very different projects, while ensuring compliance and performance guarantees.</p>



<h2 class="wp-block-heading">A solution that makes a difference</h2>



<p class="wp-block-paragraph"><strong>Landing Zone</strong> is more than just scripts that create networks and accounts.</p>



<p class="wp-block-paragraph">It is a <strong>comprehensive set of services</strong> that covers the entire lifecycle of a cloud project: from strategic reflection to production deployment, and then to daily management administered by the client.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong><strong>OVHcloud Infrastructure</strong></strong></td><td><strong><strong>Professional Services &amp; OVHcloud Partners</strong></strong></td></tr></thead><tbody><tr><td>• Provides the physical (or virtual in the case of Public Cloud) infrastructure.<br><br>• Provides the Public Cloud services (e.g. instances, databases, storage, private networks).</td><td>• Bring industry expertise: security audits, compliance studies, sharing of best &nbsp;cloud practices.<br><br>• Support the development of target governance rules for implementation (IAM policies, incident management, continuity plan).<br><br>• Integration of the client’s teams (workshops, labs, ongoing training).<br><br>• Provide assistance while building the Landing Zone.&nbsp;</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">This dual expertise provides coverage for the entire lifecycle: <strong>strategy → deployment → operation</strong>.</p>



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



<p class="wp-block-paragraph">The Landing Zone deployed on OVHcloud infrastructures addresses two major challenges: <strong>compliance </strong>&nbsp;for many regulated sectors (particularly public, finance and health) and <strong>speed of adoption </strong>&nbsp;for all cloud customers. By automating part of the security requirements, offering ready-to-use governance, and remaining highly modular, it frees up technical teams to focus on their business value.</p>



<p class="wp-block-paragraph">Are you responsible for a cloud project and looking to reduce your production timelines while ensuring compliance? <a href="https://www.ovhcloud.com/en-gb/professional-services/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Contact OVHcloud</a> to find out how a Landing Zone can become the foundation of your digital transformation.</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%2Flanding-zone-ovhcloud-adoption-public-cloud%2F&amp;action_name=Landing%20Zone%3A%20how%20to%20accelerate%20the%20adoption%20of%20public%20cloud%20with%20OVHcloud&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>
		<item>
		<title>Landing Zone : comment accélérer l’adoption du cloud public avec OVHcloud</title>
		<link>https://blog.ovhcloud.com/landing-zone-ovhcloud-adoption-cloud-public/</link>
		
		<dc:creator><![CDATA[Rémy Vandepoel]]></dc:creator>
		<pubDate>Mon, 29 Jun 2026 12:29:00 +0000</pubDate>
				<category><![CDATA[OVHcloud en Français]]></category>
		<category><![CDATA[OVHcloud]]></category>
		<category><![CDATA[Public Cloud]]></category>
		<guid isPermaLink="false">https://blog.ovhcloud.com/?p=32492</guid>

					<description><![CDATA[Introduction Dans le cadre d’un projet d’intérêt commun entre OVHcloud et Sopra Steria, les équipes techniques ont réuni leurs expertises pour [&#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%2Flanding-zone-ovhcloud-adoption-cloud-public%2F&amp;action_name=Landing%20Zone%C2%A0%3A%20comment%20acc%C3%A9l%C3%A9rer%20l%E2%80%99adoption%20du%20cloud%20public%20avec%20OVHcloud&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"><img decoding="async" width="1024" height="512" src="https://blog.ovhcloud.com/wp-content/uploads/2026/06/ovhcloud_landing_zone_header-1024x512.png" alt="ovhcloud landing zone" class="wp-image-32498" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/06/ovhcloud_landing_zone_header-1024x512.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2026/06/ovhcloud_landing_zone_header-300x150.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2026/06/ovhcloud_landing_zone_header-768x384.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/06/ovhcloud_landing_zone_header-1536x768.png 1536w, https://blog.ovhcloud.com/wp-content/uploads/2026/06/ovhcloud_landing_zone_header-2048x1024.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading">Introduction</h2>



<p class="wp-block-paragraph">Dans le cadre d’un projet d’intérêt commun entre OVHcloud et Sopra Steria, les équipes techniques ont réuni leurs expertises pour concevoir le déploiement d’une Landing Zone (ou « zone d’accueil »). Dans un premier temps, le projet a été conçu et adapté aux exigences du secteur public et pourra ensuite être étendu à d’autres marchés/cas d’usage.</p>



<h2 class="wp-block-heading">Pourquoi une Landing Zone&nbsp;?</h2>



<h3 class="wp-block-heading">Conformité et exigences réglementaires</h3>



<p class="wp-block-paragraph">Le point de départ du projet était très concret&nbsp;: <strong>le gouvernement canadien exigeait, dès le premier jour, un environnement cloud qui respecte des standards de souveraineté et de sécurité très stricts</strong>.<br><br>Sans une solution prête à l’emploi, chaque cliente ou client public devait passer des semaines, voire des mois, à mettre en place son architecture, à rédiger des procédures et à valider chaque composant auprès des autorités. Cela engendrait un&nbsp;<strong>goulot d’étranglement</strong> lors de l’initialisation de projets.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><em>«&nbsp;Le fait de ne pas disposer d’un processus pour déployer une Landing Zone conforme aux exigences du secteur public du Canada était un véritable bloqueur.&nbsp;»</em></p>
</blockquote>



<p class="wp-block-paragraph">La Landing Zone a été conçue comme&nbsp;<strong>un déploiement respectant le cadre réglementaire&nbsp;</strong>: l’infrastructure créée répond automatiquement aux exigences de segmentation, de chiffrement, de journalisation et de contrôle d’accès imposées par les autorités. La clientèle n’a donc plus à se soucier de la façon de prouver que son environnement est conforme. Le rapport de conformité est en effet généré en même temps que le déploiement. C’est d’ailleurs là tout l’intérêt de cette solution.</p>



<h3 class="wp-block-heading">Accélération de l’adoption du cloud</h3>



<p class="wp-block-paragraph">Une fois le problème de conformité résolu, la Landing Zone se révèle <strong>un véritable accélérateur d’adoption</strong> pour tous types de clientes et clients&nbsp;: startups, PME, grands comptes et, bien sûr, les administrations.</p>



<ul class="wp-block-list">
<li><strong>Automatisation des bonnes pratiques&nbsp;</strong>: les outils déploient automatiquement les réseaux privés, les sous-réseaux, les pare-feux, les comptes de service et les politiques IAM.</li>



<li><strong>Standardisation&nbsp;</strong>: chaque environnement suit le même modèle d’architecture, ce qui facilite la maintenance, le monitoring et la montée en charge.</li>



<li><strong>Time-to-market </strong>&nbsp;: là où un déploiement manuel pouvait prendre plusieurs semaines de travail (lecture de la documentation, création manuelle des ressources, tests de conformité), la Landing Zone permet d’obtenir un <strong>environnement opérationnel (et conforme) en moins d’une heure</strong>.</li>
</ul>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><em>«&nbsp;En une demi-heure, vous avez quelque chose de prêt à l’emploi&nbsp;: 30 à 40&nbsp;% des exigences de sécurité sont déjà déployées automatiquement.&nbsp;»</em></p>
</blockquote>



<h2 class="wp-block-heading">Les bénéfices concrets pour les équipes techniques</h2>



<h3 class="wp-block-heading">Gain de temps et reproductibilité</h3>



<p class="wp-block-paragraph">Le cœur de l’automatisation d’une Landing Zone repose sur de <strong>l&#8217;Infrastructure as Code (IaC)</strong>. Terraform (ou son fork OpenTofu) orchestre l’ensemble des services OVHcloud.<br>Grâce à ce modèle :</p>



<ul class="wp-block-list">
<li><strong>un même script</strong> peut être exécuté plusieurs fois, dans différents comptes ou régions, sans que le résultat change&nbsp;;</li>



<li><strong>les erreurs humaines</strong> liées à la création manuelle de ressources (erreurs de typographie, oublis de configuration, mauvaise attribution de rôle) sont quasiment éliminées&nbsp;;</li>



<li><strong>les équipes</strong> passent de la configuration fastidieuse à la validation du déploiement, libérant ainsi plusieurs jours de travail par projet.</li>
</ul>



<h3 class="wp-block-heading">Gouvernance et gestion des accès</h3>



<p class="wp-block-paragraph">Outre l’infrastructure, la Landing Zone intègre un <strong>modèle de gouvernance&nbsp;</strong>: rôles, politiques et garde-fous sont préconfigurés, ce qui simplifie la gestion des accès et la révocation des droits lorsqu’une personne quitte l’entreprise. Cette couche d’abstraction répond à l’une des principales difficultés des DSI&nbsp;: la visibilité et le contrôle sur les ressources cloud.</p>



<h3 class="wp-block-heading">Modularité et adaptabilité aux différents profils</h3>



<p class="wp-block-paragraph">Le code a été pensé pour être <strong>modulaire</strong>. Trois profils de base sont proposés&nbsp;: «&nbsp;<em>small business&nbsp;», «&nbsp;medium&nbsp;»</em>et<em> «&nbsp;government&nbsp;»</em>. Chaque profil active un jeu de services adapté (coût, évolutivité, exigences de conformité).&nbsp;</p>



<p class="wp-block-paragraph">Le même socle de code peut être <strong>étendu&nbsp;</strong>: si un client ou une cliente du secteur financier a besoin d’un module de chiffrement HSM ou d’une passerelle de paiement certifiée, il suffit d’ajouter le module correspondant et de relancer le script. Cette flexibilité permet de <strong>réutiliser</strong> la même base pour des projets très différents, tout en conservant la garantie de conformité et de performance.</p>



<h2 class="wp-block-heading">Une solution qui fait la différence</h2>



<p class="wp-block-paragraph">Lorsque l’on parle de <strong>Landing Zone</strong>, on ne parle pas seulement de scripts qui créent des réseaux et des comptes.</p>



<p class="wp-block-paragraph">Il s’agit d’un&nbsp;<strong>ensemble complet de services</strong> qui couvre tout le cycle de vie d’un projet cloud&nbsp;: de la réflexion stratégique à la mise en production, puis à la gestion quotidienne opérée par le ou la cliente.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong>Infrastructure OVHcloud</strong><strong></strong></td><td><strong>Professional Services &amp;</strong><strong> Partenaires </strong><strong>OVHcloud</strong><strong></strong></td></tr></thead><tbody><tr><td>• Fournit l’infrastructure physique (ou virtuelle dans le cas de Public Cloud).<br><br> • Met à disposition les services Public Cloud (ex. instances, bases de données, stockage, réseaux privés).</td><td>• Apporte une expertise métier : audits de sécurité, études de conformité, partage des bonnes pratiques cloud.<br><br> • Accompagnement dans l’élaboration des règles de gouvernance cible en vue d’implémentation (politiques IAM, gestion des incidents, plan de continuité). <br><br>• Intégration des équipes du client (workshops, labs, formation continue).<br> <br>• Fournit une assistance pour la construction de la Landing Zone.</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Cette double expertise permet de couvrir l’ensemble du cycle de vie&nbsp;: <strong>stratégie → déploiement → exploitation</strong>.</p>



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



<p class="wp-block-paragraph">La Landing Zone déployée sur les infrastructures OVHcloud répond à deux enjeux majeurs : la <strong>conformité </strong>pour de nombreux secteurs réglementés (notamment public, financier et de santé) et la <strong>rapidité d’adoption</strong> pour l’ensemble des clientes et clients du cloud. En automatisant une partie des exigences de sécurité, en offrant une gouvernance prête à l’emploi et en restant hautement modulaire, elle libère les équipes techniques pour leur permettre de se concentrer sur leur valeur métier.</p>



<p class="wp-block-paragraph">Vous êtes responsable d’un projet cloud et vous cherchez à réduire vos délais de mise en production tout en garantissant la conformité ? <a href="https://www.ovhcloud.com/fr/professional-services" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Contactez OVHcloud</a> pour découvrir comment la Landing Zone peut devenir le socle de votre transformation numérique.</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%2Flanding-zone-ovhcloud-adoption-cloud-public%2F&amp;action_name=Landing%20Zone%C2%A0%3A%20comment%20acc%C3%A9l%C3%A9rer%20l%E2%80%99adoption%20du%20cloud%20public%20avec%20OVHcloud&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>
		<item>
		<title>From a source of truth to a source of insight</title>
		<link>https://blog.ovhcloud.com/real-time-data-pipeline/</link>
		
		<dc:creator><![CDATA[Jonathan Clarke&nbsp;and&nbsp;Elena Luoto]]></dc:creator>
		<pubDate>Mon, 22 Jun 2026 21:59:00 +0000</pubDate>
				<category><![CDATA[Accelerating with OVHcloud]]></category>
		<category><![CDATA[OVHcloud]]></category>
		<category><![CDATA[Public Cloud]]></category>
		<guid isPermaLink="false">https://blog.ovhcloud.com/?p=32376</guid>

					<description><![CDATA[Building a real-time data pipeline used to mean months of infrastructure work. Here is what the modern stack looks like [&#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%2Freal-time-data-pipeline%2F&amp;action_name=From%20a%20source%20of%20truth%20to%20a%20source%20of%20insight&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 size-large"><img loading="lazy" decoding="async" width="1024" height="512" src="https://blog.ovhcloud.com/wp-content/uploads/2026/06/pipeline-1-1024x512.png" alt="Real-time data pipeline connecting PostgreSQL, Kafka, ClickHouse, OpenSearch and Grafana on OVHcloud" class="wp-image-32387" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/06/pipeline-1-1024x512.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2026/06/pipeline-1-300x150.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2026/06/pipeline-1-768x384.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/06/pipeline-1-1536x768.png 1536w, https://blog.ovhcloud.com/wp-content/uploads/2026/06/pipeline-1-2048x1024.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph"><em>Building a real-time data pipeline used to mean months of infrastructure work. Here is what the modern stack looks like in 2026.</em></p>



<p class="wp-block-paragraph">Your database is doing its job. It records every transaction, every event, every state change your application produces. The data is reliable, consistent, and safely stored.</p>



<p class="wp-block-paragraph">But a database is a starting point, not a destination. The question is what happens after the write. Does that data stay in storage, answering application queries, while the insights it could generate stay locked in place? Or does it flow downstream, in real time, to the systems built to make sense of it?</p>



<p class="wp-block-paragraph">Building that downstream pipeline used to be a serious infrastructure project. Kafka clusters to provision and tune, ZooKeeper ensembles to manage, connectors to configure, sinks to wire up, and a schema registry to operate. A team could spend weeks on the scaffolding before the first event reached an analytics engine.</p>



<p class="wp-block-paragraph">In 2026, the pipeline architecture has not changed. But the operational weight has. <a href="https://www.ovhcloud.com/en/public-cloud/databases/" type="link" id="https://www.ovhcloud.com/en/public-cloud/databases/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Managed services</a> handle provisioning, replication, failover, and upgrades. What used to take a dedicated platform team now takes an afternoon. This article walks through what a complete real-time data pipeline looks like, how each layer connects, and what it takes to build one without building the infrastructure underneath it.</p>



<h2 class="wp-block-heading">The four layers</h2>



<p class="wp-block-paragraph">A modern real-time data pipeline has four layers. Each has a distinct job, and none of them are optional if you want data to move continuously from storage to insight.</p>



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



<p class="wp-block-paragraph">Where your data originates. A relational database like PostgreSQL handles transactions, enforces consistency, and serves your application. It is your source of truth. Every insert, update, and delete is recorded with precision. That write log is also the starting point for everything downstream.</p>



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



<p class="wp-block-paragraph">How data moves. <a href="https://www.ovhcloud.com/en/public-cloud/apache-kafka/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Apache Kafka </a>captures changes from your database the moment they happen and distributes them to downstream consumers as events. Every row-level modification becomes a structured message that other systems can act on in real time. Kafka’s core design principle is decoupling: producers write events without knowing who will consume them, and consumers read events without touching the source system. This means you can add new downstream use cases – a new analytics engine, a new alerting system, a new data warehouse – without modifying the database or the application above it.</p>



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



<p class="wp-block-paragraph">Where data becomes answers. Two distinct engines cover the two main post-storage use cases. ClickHouse handles OLAP workloads: fast columnar queries, real-time aggregations, time-series analysis, and dashboards over millions of rows per second. OpenSearch handles full-text search, log analytics, and observability: complex queries across weeks of event data, anomaly detection, distributed tracing, and alert rules over live event streams. Both engines are designed for reads at scale, not for transactional consistency: this is exactly the trade-off you want after Kafka.</p>



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



<p class="wp-block-paragraph">How the answers reach people. Grafana connects to both ClickHouse and OpenSearch, pulling from live data to power dashboards, alert panels, and operational monitors. It is the layer that makes the pipeline visible across the organisation – to the product team checking feature adoption, to the security team watching for anomalies, and the platform team tracking infrastructure health.</p>



<h2 class="wp-block-heading">Two paths through the same architecture</h2>



<p class="wp-block-paragraph">The topology is consistent regardless of your use case: source database, Kafka as the streaming backbone, one or both analytics engines, and Grafana on top. How you build it depends on what your team needs first.</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="996" height="1024" src="https://blog.ovhcloud.com/wp-content/uploads/2026/06/Infographic-2A-with-grafana-996x1024.png" alt="Same stack. Two jobs" class="wp-image-32533" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/06/Infographic-2A-with-grafana-996x1024.png 996w, https://blog.ovhcloud.com/wp-content/uploads/2026/06/Infographic-2A-with-grafana-292x300.png 292w, https://blog.ovhcloud.com/wp-content/uploads/2026/06/Infographic-2A-with-grafana-768x789.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/06/Infographic-2A-with-grafana-1494x1536.png 1494w, https://blog.ovhcloud.com/wp-content/uploads/2026/06/Infographic-2A-with-grafana-1993x2048.png 1993w" sizes="auto, (max-width: 996px) 100vw, 996px" /></figure>



<h3 class="wp-block-heading">The real-time analytics path</h3>



<p class="wp-block-paragraph">PostgreSQL + Kafka + ClickHouse + Grafana is the right starting point when the primary need is fast, flexible querying. Product analytics, business intelligence, time-series reporting, funnel analysis, A/B test results in real time: these all call for ClickHouse. It ingests directly from Kafka topics, materialises views that dashboards query in milliseconds, and handles aggregations over hundreds of millions of rows without breaking a sweat. The SaaS company that needs to see feature adoption as it happens, the fintech tracking transaction volumes by the minute, the e-commerce platform running live inventory analytics – these all follow this same path.</p>



<h3 class="wp-block-heading">The search and observability path</h3>



<p class="wp-block-paragraph">PostgreSQL + Kafka + OpenSearch + Grafana is the right starting point when the primary need is full-text search, log aggregation, or system-wide observability. OpenSearch indexes events as they arrive, enabling complex searches across months of structured and semi-structured data with sub-second response times. The security team correlating events across distributed services, the platform team centralising logs from dozens of microservices, the SRE team building alerts on top of live event streams – these all follow this path.</p>



<h2 class="wp-block-heading">How the data moves</h2>



<p class="wp-block-paragraph">The connection between your database and Kafka starts with change data capture. CDC is the mechanism that reads your database’s internal write log and turns each modification into a stream of structured events.</p>



<p class="wp-block-paragraph">In PostgreSQL, this works through logical replication. The write-ahead log records every change made to the database, at the row level. With logical replication enabled, a connector can read that log and emit each change as a structured event with the full before and after state of the row. Kafka Connect is the integration layer that runs these connectors. Debezium, configured as a source connector within Kafka Connect, reads the PostgreSQL WAL and publishes each change to a dedicated Kafka topic. From there, sink connectors route events to <a href="https://www.ovhcloud.com/en/public-cloud/clickhouse/" type="link" id="https://www.ovhcloud.com/en/public-cloud/clickhouse/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">ClickHouse</a>, OpenSearch, or both.</p>



<p class="wp-block-paragraph">One technical development worth understanding for anyone building on Kafka in 2026: Kafka 4.0 removes ZooKeeper entirely. ZooKeeper was the external service Kafka relied on to manage cluster metadata, leader election, and coordination. It was a separate system to deploy, configure, monitor, and upgrade alongside the Kafka brokers. Kafka 4.0 replaces it with KRaft, Kafka’s native Raft-based consensus protocol. Cluster metadata is now managed internally by Kafka itself. The result is a single, self-contained system with fewer components, fewer failure modes, and faster recovery. For anyone who operated a Kafka cluster under the ZooKeeper model, this is a material simplification. For anyone running Kafka as a managed service, the transition is mostly invisible: what you get is a faster, more resilient cluster with one less operational surface.</p>



<p class="wp-block-paragraph">OpenSearch 3.0 is also a meaningful release for anyone building observability pipelines. The upgrade to Apache Lucene 10 delivers up to 60 per cent lower search latency, with the largest gains on vector search, KNN, and neural search workloads. Star-tree indexing reduces query work for heavy aggregations by up to 100 times. And OpenSearch 3.0 adds native MCP protocol support, which means it integrates directly with AI agents and LLM-based tooling. For teams building observability pipelines that feed into AI-driven incident investigation or alerting workflows, this is a capability that was unavailable even twelve months ago.</p>



<h2 class="wp-block-heading">Why managed matters</h2>



<p class="wp-block-paragraph">The first thing most teams underestimate about this stack is not the initial setup: it is the ongoing operational surface.</p>



<p class="wp-block-paragraph">On Kafka, the harder work starts after launch. Partition leader rebalancing when a broker restarts under load. KRaft controller quorum recovery after a node failure. Consumer group offset management when a sink connector falls behind and you need to replay events without duplicating records downstream. JVM heap tuning as throughput grows. Connector worker restart policies that do not lose in-flight events. On OpenSearch, add shard allocation decisions during cluster scaling, index lifecycle management policies to control storage costs as event volumes grow, and JVM tuning for the ML nodes that power vector and neural search. On ClickHouse, merge tree settings and partition pruning strategy matter from day one: getting these wrong early means rewriting table schemas under load.</p>



<p class="wp-block-paragraph"><a href="https://www.ovhcloud.com/en/public-cloud/databases/" type="link" id="https://www.ovhcloud.com/en/public-cloud/databases/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Managed services</a> absorb this operational surface. Rolling upgrades run without downtime because the service handles leader migration before taking a node offline. Connector workers are monitored and restarted automatically. Failover is handled at the infrastructure level across availability zones. Index lifecycle policies are configurable through the console rather than through manually applied configuration files. Analytics engineers already spend up to 40 per cent of their time on infrastructure maintenance rather than delivering insights. The managed services model moves that complexity to a layer you do not have to own.</p>



<p class="wp-block-paragraph">For teams in Europe, there is a second dimension. Hyperscaler deployments in EU regions run on infrastructure governed by U.S. law, which means the legal framework around who can access your data, and under what circumstances, is not straightforward. Running on OVHcloud means the infrastructure is European, operational control is European, and the jurisdiction governing data access is unambiguous. For teams in regulated industries, or for any team that fields GDPR compliance questions from customers or auditors, that is a material difference from a cloud region that happens to be located in Europe.</p>



<p class="wp-block-paragraph">Pricing is the third dimension. Hyperscaler bills can be opaque: data transfer costs between services, storage billed separately from compute, egress fees that compound as event volumes grow. OVHcloud pricing includes IOPS, traffic, and backups. You see the cost before you provision. There are no surprises when your Kafka throughput increases.</p>



<h2 class="wp-block-heading">Building it on OVHcloud</h2>



<p class="wp-block-paragraph">OVHcloud runs all four layers as managed services, deployed and monitored from a single console.</p>



<p class="wp-block-paragraph">Provision Managed Kafka, pick your region, and your cluster is ready in minutes. Kafka 4.0 with KRaft means no ZooKeeper to configure or monitor. Add Managed Kafka Connect and configure your <a href="https://www.ovhcloud.com/en/public-cloud/postgresql/" type="link" id="https://www.ovhcloud.com/en/public-cloud/postgresql/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">PostgreSQL</a> source connector, with optional Debezium CDC for full row-level change capture. Then provision Managed ClickHouse and add a sink connector to start routing events from your Kafka topics into ClickHouse tables, or provision Managed OpenSearch and route events there instead. Add Managed <a href="https://www.ovhcloud.com/en/public-cloud/grafana/" type="link" id="https://www.ovhcloud.com/en/public-cloud/grafana/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Grafana</a> to connect to both engines and begin building dashboards on live data.</p>



<p class="wp-block-paragraph">The full stack is five managed services on one platform: PostgreSQL, Kafka, ClickHouse or OpenSearch (or both), and Grafana. One console for provisioning and monitoring. One bill. One support team that understands the full pipeline, not just individual components in isolation.</p>



<h2 class="wp-block-heading">Start with one layer</h2>



<p class="wp-block-paragraph">You do not have to build the whole pipeline on day one. The most common starting point is Kafka: get your data flowing before you decide where it is going. Once events are moving through Kafka topics, adding ClickHouse or OpenSearch is a connector configuration, not a re-architecture.</p>



<p class="wp-block-paragraph">The pipeline you build this way is modular by design. Each layer adds independent value. The team that starts with Kafka and adds ClickHouse six months later has not wasted anything in between. The Kafka layer was already doing its job. The pipeline grew without disrupting what was already working.</p>



<p class="wp-block-paragraph">The infrastructure is managed. The data stays in your hands. The pricing is transparent. The pipeline you need already exists on one stack.</p>



<p class="wp-block-paragraph"><strong><a href="https://www.ovhcloud.com/en/public-cloud/apache-kafka/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Explore the OVHcloud managed data pipeline</a></strong></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%2Freal-time-data-pipeline%2F&amp;action_name=From%20a%20source%20of%20truth%20to%20a%20source%20of%20insight&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>
		<item>
		<title>Secure Image Signing with Cosign and OVHcloud KMS</title>
		<link>https://blog.ovhcloud.com/secure-image-signing-cosign-ovhcloud-kms/</link>
		
		<dc:creator><![CDATA[Aurélie Vache]]></dc:creator>
		<pubDate>Mon, 22 Jun 2026 06:52:50 +0000</pubDate>
				<category><![CDATA[OVHcloud Engineering]]></category>
		<category><![CDATA[Cosign OVHcloud KMS]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[OVHcloud]]></category>
		<category><![CDATA[Public Cloud]]></category>
		<category><![CDATA[Security]]></category>
		<guid isPermaLink="false">https://blog.ovhcloud.com/?p=31702</guid>

					<description><![CDATA[Software supply chains have become more complex and increasingly targeted, making container image security a fundamental requirement for building trust [&#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%2Fsecure-image-signing-cosign-ovhcloud-kms%2F&amp;action_name=Secure%20Image%20Signing%20with%20Cosign%20and%20OVHcloud%20KMS&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 loading="lazy" decoding="async" width="1018" height="1024" src="https://blog.ovhcloud.com/wp-content/uploads/2026/05/Gribouillis-2026-05-07-14.00.13.759-1018x1024.png" alt="" class="wp-image-31768" style="aspect-ratio:0.9941455602881566;width:456px;height:auto" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/05/Gribouillis-2026-05-07-14.00.13.759-1018x1024.png 1018w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/Gribouillis-2026-05-07-14.00.13.759-298x300.png 298w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/Gribouillis-2026-05-07-14.00.13.759-150x150.png 150w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/Gribouillis-2026-05-07-14.00.13.759-768x772.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/Gribouillis-2026-05-07-14.00.13.759-70x70.png 70w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/Gribouillis-2026-05-07-14.00.13.759.png 1244w" sizes="auto, (max-width: 1018px) 100vw, 1018px" /></figure>



<p class="wp-block-paragraph">Software supply chains have become more complex and increasingly targeted, making container image security a fundamental requirement for building trust in modern delivery pipelines.</p>



<p class="wp-block-paragraph">By signing images with Cosign and protecting signing keys in OVHcloud KMS, teams can keep cryptographic material out of local environments and CI/CD variables, all while making image signing easier to control, audit and integrate into delivery pipelines.</p>



<p class="wp-block-paragraph">In this blog post, you will learn how to use the OVHcloud KMS plugin for Cosign to generate a key, sign a container image with this key and verify that the OCI image has been correctly signed.</p>



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



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="399" height="126" src="https://blog.ovhcloud.com/wp-content/uploads/2026/05/image-5.png" alt="" class="wp-image-31741" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/05/image-5.png 399w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/image-5-300x95.png 300w" sizes="auto, (max-width: 399px) 100vw, 399px" /></figure>



<p class="wp-block-paragraph"><a href="https://github.com/sigstore/cosign" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Cosign</a> is a tool from the <strong>Sigstore</strong> project used to <strong>sign, verify, and attest</strong> OCI container images and software artifacts.</p>



<p class="wp-block-paragraph">Cosign supports several signing modes, including <strong>keyless</strong> signing through Sigstore, where short-lived certificates are generated at signing time based on your identity (via GitHub, Google or another OIDC provider), as well as ephemeral key generation, hardware and <strong>KMS</strong>-backed signing and custom PKI integration.</p>



<p class="wp-block-paragraph"><code>Cosign</code> supports <a href="https://docs.sigstore.dev/cosign/key_management/overview/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">multiple KMS providers</a> to generate and sign keys. Several external KMS providers are supported, including HashiCorp Vault, AWS KMS, GCP KMS and Azure Key Vault.<br>Cosign can now also be integrated with OVHcloud KMS through the <a href="https://github.com/ovh/sigstore-kms-ovhcloud" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Sigstore Cosign OVHcloud KMS plugin</a> 💪.</p>



<h3 class="wp-block-heading">OVHcloud Key Management Service (KMS)</h3>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="100" height="101" src="https://blog.ovhcloud.com/wp-content/uploads/2026/05/Key-Management-Service-KMS@2x.png" alt="" class="wp-image-31711" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/05/Key-Management-Service-KMS@2x.png 100w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/Key-Management-Service-KMS@2x-70x70.png 70w" sizes="auto, (max-width: 100px) 100vw, 100px" /></figure>



<p class="wp-block-paragraph"><a href="https://www.ovhcloud.com/en/identity-security-operations/key-management-service/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">OVHcloud KMS</a>, often called <strong>OKMS</strong>, is a managed service that centralizes the creation, storage, and management of encryption keys. Its main goal is to help businesses secure data and control cryptographic operations from a single platform.</p>



<p class="wp-block-paragraph">Each KMS is associated with a region, so the keys stored in that region are guaranteed to stay in that region. You can order multiple KMSs, either in different regions or in the same region.</p>



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



<p class="wp-block-paragraph">To be able to use the Sigstore KMS OVHcloud provider, you need to follow some prerequisites:</p>



<ul class="wp-block-list">
<li>Have an OVHcloud account</li>



<li>Have created an <a href="https://www.ovhcloud.com/en/identity-security-operations/key-management-service/" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external">OKMS</a> domain (“<em><code class="">305db938-1234-5678-9012-3a0a29291661</code></em>” for example in this blog post)</li>



<li><a href="https://github.com/ovh/public-cloud-examples/tree/main/iam/create-user-and-generate-pat-token-with-cli" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external">Have created an IAM local user</a> (“<em>cosign-</em><code class="">305db938-1234-5678-9012-3a0a29291661</code>” for example in this blog post)</li>



<li>Have installed the <a href="https://github.com/ovh/ovhcloud-cli/?tab=readme-ov-file#installation" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external">OVHcloud CLI</a></li>



<li>Have <a href="https://man7.org/linux/man-pages/man1/uuidgen.1.html" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">uuidgen</a> CLI installed</li>
</ul>



<p class="wp-block-paragraph">💡The cosign OVHcloud plugin supports both <code>token</code> and <code>mTLS</code> authentication. For the purposes of this blog post, we will use the token authentication mode. Please follow the <a href="https://external-secrets.io/latest/provider/ovhcloud/" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external">Sigstore Cosign KMS plugin for OVHcloud</a> guide if you wish to use mTLS authentication mode.</p>



<h4 class="wp-block-heading">Generate a PAT token (for token authentication only)</h4>



<p class="wp-block-paragraph">List the OKMS domains:</p>



<pre class="wp-block-code"><code class="">$ ovhcloud okms list<br>┌──────────────────────────────────────┬─────────────┐<br>│                  id                  │   region    │<br>├──────────────────────────────────────┼─────────────┤<br>│ 305db938-1234-5678-9012-3a0a29291661 │ eu-west-par │<br>│ xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx │ eu-west-par │<br>└──────────────────────────────────────┴─────────────┘</code></pre>



<p class="wp-block-paragraph">Save the OKMS ID in an environment variable:</p>



<pre class="wp-block-code"><code class="">export KMS_RESTAPI_OKMSID="305db938-1234-5678-9012-3a0a29291661"</code></pre>



<p class="wp-block-paragraph">The cosign OVHcloud plugin needs the permission to create and fetch keys from the OVHcloud KMS.</p>



<p class="wp-block-paragraph">If you want to use token autentication, you’ll need a token (PAT). You can use the <strong>ovhcloud CLI </strong>to do that:</p>



<pre class="wp-block-code"><code class="">PAT_TOKEN=$(ovhcloud iam user token create &lt;iam-local-user-name&gt; --name pat-&lt;iam-local-user-name&gt; --description "PAT cosign for domain $KMS_RESTAPI_OKMSID" -o json  | jq .details.token |  tr -d '"')<br><br>echo $PAT_TOKEN</code></pre>



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



<pre class="wp-block-code"><code class="">$ PAT_TOKEN=$(ovhcloud iam user token create cosign-305db938-1234-5678-9012-3a0a29291661 --name pat-cosign-305db938-1234-5678-9012-3a0a29291661 --description "PAT cosign for domain 305db938-1234-5678-9012-3a0a29291661" -o json  | jq .details.token |  tr -d '"')<br>2026/05/07 08:48:34 Final parameters:<br>{<br> "description": "PAT cosign for domain 305db938-1234-5678-9012-3a0a29291661",<br> "name": "pat-cosign-305db938-1234-5678-9012-3a0a29291661"<br>}<br><br>$ echo $PAT_TOKEN<br>eyJhbGciOiJFZE...ASgXy55_DDFHdy4Z5uSq8lww-Bw</code></pre>



<h4 class="wp-block-heading">Save the KMS information</h4>



<p class="wp-block-paragraph">Save the KMS information in environment variables. For example:</p>



<pre class="wp-block-code"><code class="">export KMS_RESTAPI_ENDPOINT=$(ovhcloud okms get $KMS_RESTAPI_OKMSID -o json | jq .restEndpoint | xargs)<br>export KMS_RESTAPI_TYPE="token"<br>export KMS_RESTAPI_TOKEN=$PAT_TOKEN</code></pre>



<p class="wp-block-paragraph">Display the saved information:</p>



<pre class="wp-block-code"><code class="">$ echo $KMS_RESTAPI_ENDPOINT<br>https://eu-west-par.okms.ovh.net<br><br>$ echo $KMS_RESTAPI_OKMSID<br>305db938-1234-5678-9012-3a0a29291661<br><br>$ echo $KMS_RESTAPI_TYPE<br>token<br><br>$ echo $KMS_RESTAPI_TOKEN<br>eyJ...BIoHCA</code></pre>



<h4 class="wp-block-heading">Cosign KMS plugin installation</h4>



<p class="wp-block-paragraph">Install the plugin locally:</p>



<pre class="wp-block-code"><code class="">curl -fsSL https://raw.githubusercontent.com/ovh/sigstore-kms-ovhcloud/main/install.sh | sh</code></pre>



<p class="wp-block-paragraph">⚠️ The binary is installed in <code>$HOME/.local/bin</code> by default (created if it does not exist). Make sure this directory is in your <code>PATH</code>.</p>



<p class="wp-block-paragraph">Or follow the other <a href="https://github.com/ovh/sigstore-kms-ovhcloud#installation" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">installation methods.</a></p>



<p class="wp-block-paragraph">Now you can use the OVHcloud KMS plugin directly in the cosign command 🎉.</p>



<h3 class="wp-block-heading">Let&#8217;s use Cosign with the OVHcloud KMS!</h3>



<h4 class="wp-block-heading">Generate a key</h4>



<p class="wp-block-paragraph">First, to sign an image, we need to generate a key pair. To do that we need to generate a UUID and use it in the <code>cosign generate-key-pair</code> command.</p>



<pre class="wp-block-code"><code class="">export KEY_ID=$(uuidgen)<br>cosign generate-key-pair --kms ovhcloud://$KEY_ID</code></pre>



<p class="wp-block-paragraph">The signing key is created in OVHcloud KMS, and the public key is written locally.</p>



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



<pre class="wp-block-code"><code class="">$ export KEY_ID=$(uuidgen)<br>$ cosign generate-key-pair --kms ovhcloud://$KEY_ID<br><br>Public key written to cosign.pub</code></pre>



<p class="wp-block-paragraph">The command generates a key pair using the ECDSA algorithm and writes the public key to <code>cosign.pub</code>.</p>



<p class="wp-block-paragraph">Check the keys have been created:</p>



<pre class="wp-block-code"><code class="">$ ls -l cosign.pub<br>-rw-------  1 avache  staff  178 18 juin  16:06 cosign.pub<br><br>$ cat cosign.pub<br><br>-----BEGIN PUBLIC KEY-----<br>MFkw...QgwA==<br>-----END PUBLIC KEY-----<br></code></pre>



<p class="wp-block-paragraph"><br>Once the key pair has been generated, use the corresponding OVHcloud KMS key ID in the <code>ovhcloud://$KEY_ID</code> URI when signing and verifying images.</p>



<h4 class="wp-block-heading">Or get an existing public key (optional)</h4>



<p class="wp-block-paragraph">Instead of creating a new public key, you can retrieve an existing one with the following command:</p>



<pre class="wp-block-code"><code class="">cosign public-key --key ovhcloud://$KEY_ID --outfile cosign-ovhcloud.pub</code></pre>



<h4 class="wp-block-heading">Sign an image</h4>



<p class="wp-block-paragraph">Replace the <code>$IMAGE@sha256:$HASH</code> parameter with the URI to your image and the hash to your image and execute this command:</p>



<pre class="wp-block-code"><code class="">cosign sign --key ovhcloud://$KEY_ID $IMAGE@sha256:$HASH</code></pre>



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



<pre class="wp-block-code"><code class="">$ cosign sign --key ovhcloud://$KEY_ID 12345678.c1.de1.container-registry.ovh.net/my-project/my-image@sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxx</code></pre>



<figure class="wp-block-image aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="278" height="282" src="https://blog.ovhcloud.com/wp-content/uploads/2026/05/image-6.png" alt="" class="wp-image-31773" style="width:114px;height:auto" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/05/image-6.png 278w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/image-6-70x70.png 70w" sizes="auto, (max-width: 278px) 100vw, 278px" /></figure>



<h4 class="wp-block-heading">Verify the image has been signed</h4>



<pre class="wp-block-code"><code class="">cosign verify --key ovhcloud://$KEY_ID $IMAGE@sha256:$HASH</code></pre>



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



<pre class="wp-block-code"><code class="">$ cosign verify --key ovhcloud://$KEY_ID 12345678.c1.de1.container-registry.ovh.net/my-project/my-image@sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxx<br><br>Verification for 12345678.c1.de1.container-registry.ovh.net/my-project/my-image@sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxx --<br>The following checks were performed on each of these signatures:<br>  - The cosign claims were validated<br>  - Existence of the claims in the transparency log was verified offline<br>  - The signatures were verified against the specified public key<br><br>[{"critical":{"identity":{"docker-reference":"12345678.c1.de1.container-registry.ovh.net/my-project/my-image@sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"},"image":{"docker-manifest-digest":"sha256:b1202...2334e2"},"type":"https://sigstore.dev/cosign/sign/v1"},"optional":{}}]</code></pre>



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



<p class="wp-block-paragraph">In this blog post, we have shown how to use Cosign with the OVHcloud KMS plugin to generate a key pair, sign a container image and verify its signature.</p>



<p class="wp-block-paragraph">By keeping signing keys in a managed KMS, teams can reduce secret sprawl, protect sensitive cryptographic material and make image signing easier to integrate into secure CI/CD workflows.</p>



<p class="wp-block-paragraph">Feel free to 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> to follow the latest features coming to 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%2Fsecure-image-signing-cosign-ovhcloud-kms%2F&amp;action_name=Secure%20Image%20Signing%20with%20Cosign%20and%20OVHcloud%20KMS&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>
		<item>
		<title>The missing half of your managed database</title>
		<link>https://blog.ovhcloud.com/the-missing-half-of-your-managed-database/</link>
		
		<dc:creator><![CDATA[Jonathan Clarke&nbsp;and&nbsp;Elena Luoto]]></dc:creator>
		<pubDate>Tue, 16 Jun 2026 11:33:32 +0000</pubDate>
				<category><![CDATA[Accelerating with OVHcloud]]></category>
		<category><![CDATA[OVHcloud]]></category>
		<category><![CDATA[Public Cloud]]></category>
		<guid isPermaLink="false">https://blog.ovhcloud.com/?p=32367</guid>

					<description><![CDATA[Most managed database users stop at storage. Here&#8217;s how to complete the pipeline with streaming and analytics, all from one [&#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%2Fthe-missing-half-of-your-managed-database%2F&amp;action_name=The%20missing%20half%20of%20your%20managed%20database&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"><img loading="lazy" decoding="async" width="1024" height="683" src="https://blog.ovhcloud.com/wp-content/uploads/2026/06/missing-half-1024x683.png" alt="" class="wp-image-32371" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/06/missing-half-1024x683.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2026/06/missing-half-300x200.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2026/06/missing-half-768x512.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/06/missing-half.png 1536w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph"><em>Most managed database users stop at storage. Here&#8217;s how to complete the pipeline with streaming and analytics, all from one console.</em></p>



<p class="wp-block-paragraph">You picked a <a href="https://www.ovhcloud.com/en/public-cloud/databases/" type="link" id="https://www.ovhcloud.com/en/public-cloud/databases/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">managed database</a> for the right reasons. No patching, no replication headaches, no 3 a.m. pages about a failed backup. Your <a href="https://www.ovhcloud.com/en/public-cloud/postgresql/" type="link" id="https://www.ovhcloud.com/en/public-cloud/postgresql/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">PostgreSQL</a>, <a href="https://www.ovhcloud.com/en/public-cloud/mysql/" type="link" id="https://www.ovhcloud.com/en/public-cloud/mysql/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">MySQL</a> or <a href="https://www.ovhcloud.com/en/public-cloud/mongodb/" type="link" id="https://www.ovhcloud.com/en/public-cloud/mongodb/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">MongoDB</a> cluster runs, stores, and serves. It does exactly what you asked.</p>



<p class="wp-block-paragraph">But here is the thing: storing data and understanding data are two different jobs. And right now, roughly nine out of ten managed database customers at OVHcloud stop at storage. They run rock-solid operational databases yet never connect them to a streaming or analytics layer. The data sits there, doing its job, answering application queries, serving the API, while the insights it could generate stay locked inside. No streaming. No real-time analytics. No search across logs or events. Just storage.</p>



<p class="wp-block-paragraph"><strong>That is the missing half.</strong></p>



<h2 class="wp-block-heading">The gap between storage and insight</h2>



<p class="wp-block-paragraph">Most teams hit this wall at some point. The application database handles transactions, serves the API, keeps the frontend alive. Then someone asks a question the database was never designed to answer. “What are customers doing right now?” “Which features are driving retention this week?” “Can we detect anomalies before they become incidents?”</p>



<p class="wp-block-paragraph">The reflex is to run analytical queries directly on the production database. It works, briefly, until those queries start competing with the application for resources. Response times creep up, the ops team starts throttling reports, and the data team ends up with a spreadsheet export and a frustrated expression.</p>



<p class="wp-block-paragraph">The real problem is not the database. It is the absence of everything after it: a streaming layer to move data in real time, and an analytical engine purpose-built for fast, flexible queries. Without those two pieces, the pipeline stops at storage.</p>



<h2 class="wp-block-heading">What a complete pipeline looks like</h2>



<p class="wp-block-paragraph">A modern data pipeline has three layers, each doing what it does best.</p>



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



<p class="wp-block-paragraph">What you already have. Your managed PostgreSQL, MySQL, or MongoDB handles transactions, enforces consistency, and serves your application. It is your source of truth.</p>



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



<p class="wp-block-paragraph">The bridge. Apache Kafka captures changes from your database the moment they happen and distributes them to downstream consumers. For teams that need a full change data capture, Debezium can be configured through Kafka Connect, a process we will cover later. Instead of batch exports or nightly ETL jobs, your data flows continuously. Every insert, update, and delete becomes an event that other systems can act on in real time. Kafka is not just a transport layer: it decouples your producers from your consumers, which means you can add new downstream use cases without touching anything upstream.</p>



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



<p class="wp-block-paragraph">Where data becomes answers. <a href="https://www.ovhcloud.com/en/public-cloud/clickhouse/" type="link" id="https://www.ovhcloud.com/en/public-cloud/clickhouse/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">ClickHouse</a> processes millions of rows per second for OLAP workloads: dashboards, aggregations, time-series analysis. <a href="https://www.ovhcloud.com/en/public-cloud/opensearch/" type="link" id="https://www.ovhcloud.com/en/public-cloud/opensearch/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">OpenSearch</a> handles full-text search, log analytics, and observability. Together, they cover the two big post-storage use cases: structured analytics and unstructured search.</p>



<p class="wp-block-paragraph">Each layer is independent but connected. Your production database stays lean because it is not fielding analytical queries. The analytics engines are optimised for reads at scale, not for transactional consistency, which is exactly the trade-off you want.</p>



<p class="wp-block-paragraph">This architecture scales in stages. You do not have to build the entire pipeline on day one. Start with Kafka to get your data flowing, then add ClickHouse or OpenSearch when the use case demands it. Each layer adds value without disrupting what came before. That modularity matters, because most teams do not need everything at once. They need the next piece.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="576" src="https://blog.ovhcloud.com/wp-content/uploads/2026/06/Infographic-1-the-missing-half-1024x576.png" alt="Complete data pipeline" class="wp-image-32531" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/06/Infographic-1-the-missing-half-1024x576.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2026/06/Infographic-1-the-missing-half-300x169.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2026/06/Infographic-1-the-missing-half-768x432.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/06/Infographic-1-the-missing-half-1536x864.png 1536w, https://blog.ovhcloud.com/wp-content/uploads/2026/06/Infographic-1-the-missing-half-2048x1152.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading">How the pieces connect on OVHcloud</h2>



<p class="wp-block-paragraph">OVHcloud offers all three layers as managed services, deployed and operated from the same console.</p>



<p class="wp-block-paragraph">Start with your existing managed database. Connect <a href="https://www.ovhcloud.com/en/public-cloud/apache-kafka/" type="link" id="https://www.ovhcloud.com/en/public-cloud/apache-kafka/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Managed Kafka</a> through the OVHcloud console in a few clicks, then add Managed Kafka Connect as the integration layer. Kafka Connect handles the mechanics of pulling change events out of your database and pushing them into Kafka topics. From there, you route events to Managed ClickHouse for analytical queries, Managed OpenSearch for search and observability, or both.</p>



<p class="wp-block-paragraph">For teams that want to go further, Debezium can be configured on top of Kafka Connect to implement full change data capture (CDC). This means every row-level change in your database is captured as a structured event, preserving the complete history of modifications. Debezium runs as a connector within Kafka Connect, so the infrastructure is already in place.</p>



<p class="wp-block-paragraph">What you get at the end is a complete pipeline: source of truth, real-time streaming, and fast analytics. All managed. One console for provisioning and monitoring. One bill. One support team that understands the full stack.</p>



<p class="wp-block-paragraph">When your database, streaming layer, and analytics engines are scattered across different providers, debugging a broken pipeline means opening three dashboards, contacting three support teams, and reconciling three billing cycles. With OVHcloud, the whole chain lives in one place.</p>



<h2 class="wp-block-heading">What this looks like in practice</h2>



<h3 class="wp-block-heading">Product analytics at a SaaS scaleup</h3>



<p class="wp-block-paragraph">A B2B SaaS company needs to understand how customers use their product in real time. Their managed PostgreSQL database records every user action, but running analytical queries on it directly means competing with the application for resources. Whenever the data team runs a report, response times start spiking.</p>



<p class="wp-block-paragraph">They add Managed Kafka to capture database change events as they happen, then configure Kafka Connect to route them to Managed ClickHouse. ClickHouse ingests the stream and pre-aggregates it into the materialised views their dashboards need. The product team now sees feature adoption, session lengths, and funnel conversions updated in seconds, not hours, without any additional load on the production database.</p>



<p class="wp-block-paragraph">New analytical use cases &#8211; such as cohort analysis or A/B test reporting &#8211; are added as new Kafka consumers without any changes to the application or the source database. The implemented architecture enables the pipeline to grow without touching what already works.</p>



<h3 class="wp-block-heading">Observability at a cybersecurity scaleup</h3>



<p class="wp-block-paragraph">A cybersecurity company analyses millions of events per day across its platform. Detecting anomalies means searching across weeks of structured and semi-structured data with sub-second response times. Their PostgreSQL operational database stores event metadata reliably, but it was never designed for full-text search at this volume.</p>



<p class="wp-block-paragraph">Managed Kafka streams event data as it is written to the database, routing it to Managed OpenSearch. OpenSearch indexes everything in real time. The security team can now run complex searches across months of data in milliseconds, set alerts on anomaly patterns, and correlate events across distributed services from a single dashboard.</p>



<p class="wp-block-paragraph">No separate log management vendor. No data egress fees between services. And because the data never leaves OVHcloud infrastructure, there is no question about where it sits or who can access it.</p>



<h2 class="wp-block-heading">Why it matters that it is managed (and European)</h2>



<p class="wp-block-paragraph">You chose a managed database because you did not want to babysit infrastructure. The same logic applies to streaming and analytics. Self-hosting Kafka is notoriously complex: broker management, partition rebalancing, schema registries, monitoring, upgrades. ClickHouse and OpenSearch have their own operational weight.</p>



<p class="wp-block-paragraph">Analytics engineers already spend up to 40% of their time maintaining infrastructure<a href="#_ftn1" id="_ftnref1">[1]</a> instead of delivering insights. Managed services flip that ratio. With OVHcloud, rolling upgrades run with zero downtime. Automated failover covers availability zones. End-to-end encryption, ISO 27001 and SOC 2 compliance, and a 99.99% SLA are included, not extras.</p>



<p class="wp-block-paragraph">And because this is OVHcloud, your data remains your data. No extraterritorial exposure, no ambiguity about which jurisdiction governs your data. For teams operating under GDPR or working in regulated industries, this is not a nice-to-have. It is a requirement.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph">Pricing is transparent and predictable. No data-transfer surcharges between services, no opaque consumption-based billing that spikes when your analytics workload grows. IOPS, traffic and backups are included.</p>



<p class="wp-block-paragraph">There is also the question of open-source compatibility. Every engine in the OVHcloud managed pipeline runs the real open-source project: Apache Kafka, ClickHouse, OpenSearch. No proprietary forks, no API incompatibilities, no vendor lock-in. Your code, your connectors, and your tooling all work the same way they would against a self-hosted cluster.</p>



<h2 class="wp-block-heading">Getting started</h2>



<p class="wp-block-paragraph">If you already have a managed database on OVHcloud, the fastest path to a complete pipeline is:</p>



<ol class="wp-block-list">
<li><strong>Provision Managed Kafka </strong>from the OVHcloud console. Choose your plan, pick your region, and your cluster is ready in minutes.</li>



<li><strong>Add Managed Kafka Connect </strong>and configure a source connector pointing to your database. This is where your change events start flowing.</li>



<li><strong>Spin up Managed ClickHouse </strong>(for analytics) or Managed OpenSearch (for search and observability), or both, depending on your use case.</li>



<li><strong>Configure sink connectors </strong>in Kafka Connect to route events from your Kafka topics into your analytics engines.</li>



<li><strong>Query your data. </strong>ClickHouse speaks SQL, so your existing BI tools and dashboards plug right in. OpenSearch provides its own dashboards for log exploration and search.</li>
</ol>



<p class="wp-block-paragraph">The entire setup can be done from the console, with each service connected through the same management interface. No VPN tunnels to configure between providers, no credential juggling across platforms. For teams comfortable with infrastructure as code, Terraform and the OVHcloud API cover the same ground programmatically.</p>



<p class="wp-block-paragraph">If you want to explore CDC with Debezium, the Kafka Connect foundation is already there. You configure Debezium as a source connector, and it starts capturing row-level changes from your database into Kafka topics. The managed Kafka Connect infrastructure handles running and scaling the connector itself.</p>



<p class="wp-block-paragraph"><strong>Your database is doing its job. Now to complete the picture.</strong></p>



<p class="wp-block-paragraph">Nine out of ten managed database customers have not connected their data to streaming or analytics. The operational half works. The insight half is waiting.</p>



<p class="wp-block-paragraph">The tools are managed, the console is unified, and the pipeline pattern is proven. If you are ready to see what your data can tell you, the missing half is a few clicks away.</p>



<p class="wp-block-paragraph"><strong><a href="https://www.ovhcloud.com/en/public-cloud/apache-kafka/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Get started with Managed Kafka on OVHcloud</a></strong></p>



<p class="wp-block-paragraph"><a href="#_ftnref1" id="_ftn1">[1]</a> Source: McKinsey: https://www.mckinsey.com/capabilities/tech-and-ai/our-insights/tech-debt-reclaiming-tech-equity</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%2Fthe-missing-half-of-your-managed-database%2F&amp;action_name=The%20missing%20half%20of%20your%20managed%20database&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>
		<item>
		<title>Navigating OVHcloud Enterprise File Storage (EFS) with Trident CSI On Kubernetes clusters (MKS)</title>
		<link>https://blog.ovhcloud.com/navigating-ovhcloud-enterprise-file-storage-efs-with-trident-csi-on-kubernetes-clusters-mks/</link>
		
		<dc:creator><![CDATA[Aurélie Vache]]></dc:creator>
		<pubDate>Mon, 11 May 2026 12:18:46 +0000</pubDate>
				<category><![CDATA[OVHcloud Engineering]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[OVHcloud]]></category>
		<category><![CDATA[Public Cloud]]></category>
		<category><![CDATA[Storage]]></category>
		<guid isPermaLink="false">https://blog.ovhcloud.com/?p=31391</guid>

					<description><![CDATA[If you find yourself in need of shared persistent storage for applications running on OVHcloud Managed Kubernetes Service (MKS), then [&#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%2Fnavigating-ovhcloud-enterprise-file-storage-efs-with-trident-csi-on-kubernetes-clusters-mks%2F&amp;action_name=Navigating%20OVHcloud%20Enterprise%20File%20Storage%20%28EFS%29%20with%20Trident%20CSI%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 loading="lazy" decoding="async" width="1024" height="1020" src="https://blog.ovhcloud.com/wp-content/uploads/2026/04/IMG_1587-1024x1020.png" alt="" class="wp-image-31461" style="aspect-ratio:1.0039264898357345;width:426px;height:auto" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/04/IMG_1587-1024x1020.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2026/04/IMG_1587-300x300.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2026/04/IMG_1587-150x150.png 150w, https://blog.ovhcloud.com/wp-content/uploads/2026/04/IMG_1587-768x765.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/04/IMG_1587-70x70.png 70w, https://blog.ovhcloud.com/wp-content/uploads/2026/04/IMG_1587.png 1253w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">If you find yourself in need of shared persistent storage for applications running on OVHcloud Managed Kubernetes Service (MKS), then OVHcloud Enterprise File Storage (EFS) with Trident CSI offers you a practical way to provision and manage it.</p>



<p class="wp-block-paragraph">This blog post explains how to create and connect OVHcloud EFS to your MKS cluster using Trident CSI, so you can dynamically provision persistent storage for Kubernetes workloads.</p>



<h3 class="wp-block-heading">OVHcloud Enterprise File System (EFS)</h3>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="100" height="100" src="https://blog.ovhcloud.com/wp-content/uploads/2026/04/Enterprise-File-Storage@2x.png" alt="" class="wp-image-31410" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/04/Enterprise-File-Storage@2x.png 100w, https://blog.ovhcloud.com/wp-content/uploads/2026/04/Enterprise-File-Storage@2x-70x70.png 70w" sizes="auto, (max-width: 100px) 100vw, 100px" /></figure>



<p class="wp-block-paragraph"><a href="https://www.ovhcloud.com/fr/storage-solutions/enterprise-file-storage/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">EFS</a> is a high-performance, fully managed file storage solution powered by NetApp ONTAP in an active-active architecture. It is designed for enterprise workloads requiring high availability, predictable performance, and seamless integration with cloud-native environments.</p>



<p class="wp-block-paragraph">The service is available in multiple regions, including Roubaix, Gravelines, Strasbourg, Limbourg, and Beauharnois, with a strong SLA of 99.99% uptime. Storage capacity ranges from 50 GB up to 29 TB.</p>



<p class="wp-block-paragraph">EFS delivers guaranteed performance with 4,000 IOPS and 64 MB/s throughput per TiB, scaling linearly with volume size thanks to NVMe SSD infrastructure.</p>



<p class="wp-block-paragraph">Built for modern infrastructures, <a href="https://help.ovhcloud.com/csm/en-gb-public-cloud-storage-netapp-trident-csi?id=kb_article_view&amp;sysparm_article=KB0074862" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">EFS integrates natively with Kubernetes via Trident CSI</a> (compatible with MKS) and supports ReadWriteMany (RWX) access. It operates within a single availability zone (1AZ) and provides low-latency NFS storage over OVHcloud’s secure vRack network, ensuring strong security and compliance.</p>



<h3 class="wp-block-heading">NetApp Trident CSI</h3>



<figure class="wp-block-image aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="350" height="387" src="https://blog.ovhcloud.com/wp-content/uploads/2026/04/image-9.png" alt="" class="wp-image-31406" style="width:201px;height:auto" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/04/image-9.png 350w, https://blog.ovhcloud.com/wp-content/uploads/2026/04/image-9-271x300.png 271w" sizes="auto, (max-width: 350px) 100vw, 350px" /></figure>



<p class="wp-block-paragraph"><a href="https://github.com/netApp/trident" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Trident</a> is an open-source, fully supported storage orchestration project maintained by <a href="https://www.netapp.com/fr/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">NetApp</a>. It is designed to help Kubernetes applications consume persistent storage using standard interfaces such as the Container Storage Interface (<a href="https://github.com/container-storage-interface/spec/blob/master/spec.md" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">CSI</a>).</p>



<p class="wp-block-paragraph">Trident runs directly inside Kubernetes clusters as a set of <strong>Pods</strong> and enables dynamic provisioning and management of storage for containerized workloads. It allows applications to easily access persistent storage from NetApp’s ecosystem, including ONTAP systems (like the OVHcloud EFS).</p>



<h3 class="wp-block-heading">Let&#8217;s do it!</h3>



<h4 class="wp-block-heading">EFS creation</h4>



<p class="wp-block-paragraph">We already have a MKS cluster, in GRA11 region, running inside a private network and a subnet, with a gateway.<br>We also already have a vRack and our Public Cloud Project attached to this vRack.<br>So in this blog post we will only create a new EFS in <strong>eu-west-rbx</strong> region, attached to a vRackServices, inside the same subnet that our existing MKS cluster.</p>



<p class="wp-block-paragraph">Here you can see the architecture of all the services:</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="554" src="https://blog.ovhcloud.com/wp-content/uploads/2026/05/Untitled-2026-05-04-11371-1024x554.png" alt="" class="wp-image-31538" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/05/Untitled-2026-05-04-11371-1024x554.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/Untitled-2026-05-04-11371-300x162.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/Untitled-2026-05-04-11371-768x415.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/Untitled-2026-05-04-11371-1536x831.png 1536w, https://blog.ovhcloud.com/wp-content/uploads/2026/05/Untitled-2026-05-04-11371-2048x1107.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">⚠️ EFS and MKS regions may differ; be aware that latency between different regions may impact your storage workloads performance. <strong>It&#8217;s highly recommended to keep your storage and compute as close as possible.</strong></p>



<p class="wp-block-paragraph">We will deploy the EFS in <strong>eu-west-rbx</strong> instead of in <strong>eu-west-gra</strong> region to show you that it is possible.</p>



<p class="wp-block-paragraph">To deploy the EFS, we will use the <a href="https://registry.terraform.io/modules/ovh/efs/ovh/latest" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Terraform OVHcloud EFS module</a>.</p>



<p class="wp-block-paragraph">The module we will use can deploy all the components necessary to use EFS with a MKS cluster (like you can see in the schema).</p>



<p class="wp-block-paragraph">But in this blog post we will assume that we already deployed:</p>



<ul class="wp-block-list">
<li>a vRack</li>



<li>a Private Network</li>



<li>a Private Subnet</li>



<li>a Gateway</li>



<li>a MKS cluster</li>
</ul>



<p class="wp-block-paragraph">So using the Terraform module we will fill the existing resources information and ask Terraform to create:</p>



<ul class="wp-block-list">
<li>an OAuth2 credential</li>



<li>an IAM policy</li>



<li>an EFS</li>



<li>a vRack Services</li>
</ul>



<p class="wp-block-paragraph">Let&#8217;s deploy our components with Terraform!</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>    ovh = {<br>      source  = "ovh/ovh"<br>      version = "&gt;= 2.12.0"<br>    }<br>    null = {<br>      source  = "hashicorp/null"<br>      version = "&gt;= 3.0.0"<br>    }<br>  }<br><br>  required_version = "&gt;= 1.7.0"<br>}<br><br>provider "ovh" {<br>}</code></pre>



<p class="wp-block-paragraph">If you don&#8217;t define the provider information inside this file, as was shown in this example, you can instead set the environment variables 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>variable.tf.template</strong> file and fill it with these information:</p>



<pre class="wp-block-code"><code class=""># Existing services<br>variable "service_name" {<br>  default = "$OVH_CLOUD_PROJECT_SERVICE"<br>}<br><br>variable "vrack_id" {<br>  default = "pn-1234567" #ID of your existing vRack<br>}<br><br>variable "vlan_id" {<br>  default = "666" #ID of your VLAN<br>}<br><br>variable "private_network_id" {<br>  default = "d111cb65-1234-5678-9012-dac2e93b8944" #ID of your private network<br>}<br><br>variable "private_subnet_id" {<br>  default = "d8dc2469-1234-5678-9012-1f86551d3466" #ID of your subnet<br>}<br><br>variable "vrackservices_subnet_service_range_cidr" {<br>  default = "192.168.168.248/29" #CIDR of your private network<br>}<br><br>variable "private_subnet_cidr" {<br>  default = "192.168.168.0/24" #CIDR of your subnet<br>} <br><br>variable "mks_region" {<br>  default = "GRA11" #Region of your existing MKS cluster<br>}<br><br>variable "mks_cluster_id" {<br>  default = "7c3e1e6e-1234-5678-9012-4fb5a5b145e7" #ID of your existing MKS cluster<br>}<br><br># Services to create<br><br>variable "oauth2_client_name" {<br>  default = "efs-trident-client-example"<br>}<br><br>variable "oauth2_client_description" {<br>  default = "OAuth2 client for EFS Trident integration"<br>}<br><br>variable "iam_policy_name" {<br>  default = "efs-trident-policy-example"<br>}<br><br>variable "iam_policy_description" {<br>  default = "IAM policy for EFS Trident access"<br>}<br><br>variable "vrackservices_attach_to_efs" {<br>  description = "Whether to attach the EFS service endpoint to vRack Services. Set to false before destroying."<br>  type        = bool<br>  default     = true<br>}<br><br>variable "efs_region" {<br>  default = "eu-west-rbx"<br>}<br><br>variable "efs_name" {<br>  default = "my-efs-storage"<br>}<br><br>variable "efs_plan" {<br>  default = "enterprise-file-storage-premium-1tb"<br>}</code></pre>



<p class="wp-block-paragraph">⚠️ In the file, replace the IDs, CIDR &amp; MKS region with your existing resources 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>efs.tf</strong> file and fill it with the information:</p>



<pre class="wp-block-code"><code class="">module "ovh_efs_trident" {<br>  source = "ovh/efs/ovh//modules/efs-trident"<br><br>  # OVH region for EFS and vRack Services<br>  region = var.efs_region<br><br>  # Public Cloud region for MKS and private network<br>  public_cloud_region = var.mks_region<br><br>  # VLAN ID must be the same for vRack Services and Public Cloud private network<br>  vlan_id = var.vlan_id<br><br>  # Set to false before destroying to detach endpoint first<br>  vrackservices_attach_to_efs = var.vrackservices_attach_to_efs<br><br>  # EFS creation<br>  storage_efs_name      = var.efs_name<br>  storage_efs_plan_code = var.efs_plan<br><br>  # --- vRack ---<br>  create_vrack       = false<br>  vrack_service_name = var.vrack_id<br><br>  # --- Cloud Project ---<br>  create_cloud_project        = false<br>  cloud_project_id            = var.service_name<br>  bind_vrack_to_cloud_project = false # Set to false if already bound<br><br>  # --- Private Network ---<br>  create_private_network      = false<br>  private_network_id = var.private_network_id<br><br>  # --- Private Subnet ---<br>  create_private_subnet      = false<br>  private_subnet_id = var.private_subnet_id<br><br>  # --- Gateway ---<br>  create_gateway = false  # Set to false only if existing network has gateway<br><br>  # --- MKS Cluster ---<br>  create_mks_cluster = false<br>  mks_cluster_id     = var.mks_cluster_id # mks-priv-gra11<br>  create_node_pool   = false # Set to false if using existing node pool<br><br>  # OAuth2 and IAM<br>  oauth2_client_name        = var.oauth2_client_name<br>  oauth2_client_description = var.oauth2_client_description<br>  iam_policy_name           = var.iam_policy_name<br>  iam_policy_description    = var.iam_policy_description<br><br>  # Network (shared between vRack Services and Public Cloud)<br>  private_network_subnet_cidr             = var.private_subnet_cidr<br>  vrackservices_subnet_service_range_cidr = var.vrackservices_subnet_service_range_cidr # EFS gets IPs here<br>}</code></pre>



<p class="wp-block-paragraph">Create an <strong>output.tf</strong> file with the following content:</p>



<pre class="wp-block-code"><code class="">output "client_id" {<br>    value = module.ovh_efs_trident.client_id<br>}<br><br>output "client_secret" {<br>    value = module.ovh_efs_trident.client_secret<br>    sensitive = true<br>}<br><br>output "efs_id" {<br>  value       = module.ovh_efs_trident.efs_id<br>}</code></pre>



<p class="wp-block-paragraph">The Terraform configuration is ready. Let&#8217;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>Initializing provider plugins...<br>- Reusing previous version of hashicorp/null from the dependency lock file<br>- Reusing previous version of ovh/ovh from the dependency lock file<br>- Using previously-installed hashicorp/null v3.2.4<br>- Using previously-installed ovh/ovh v2.13.1<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>module.ovh_efs_trident.data.ovh_me.my_account: Reading...<br>module.ovh_efs_trident.data.ovh_cloud_project_kube.existing[0]: Reading...<br>module.ovh_efs_trident.data.ovh_cloud_project.existing[0]: Reading...<br>module.ovh_efs_trident.data.ovh_me.my_account: Read complete after 1s [id=xx12345-ovh]<br>module.ovh_efs_trident.data.ovh_cloud_project.existing[0]: Read complete after 0s<br>module.ovh_efs_trident.data.ovh_order_cart.cart: Reading...<br>module.ovh_efs_trident.data.ovh_order_cart.cart: Read complete after 0s [id=d582ab7c-1234-5678-9012-4a6e702ea4c5]<br>module.ovh_efs_trident.data.ovh_cloud_project_kube.existing[0]: Read complete after 5s [id=7c3e1e6e-1234-5678-9012-4fb5a5b145e7]<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.ovh_efs_trident.null_resource.config_validation will be created<br>  + resource "null_resource" "config_validation" {<br>      + id = (known after apply)<br>    }<br><br>  # module.ovh_efs_trident.ovh_iam_policy.iam_policy will be created<br>  + resource "ovh_iam_policy" "iam_policy" {<br>      + allow       = [<br>          + "storageNetApp:apiovh:get",<br>          + "storageNetApp:apiovh:serviceInfos/get",<br>          + "storageNetApp:apiovh:share/accessPath/get",<br>          + "storageNetApp:apiovh:share/acl/create",<br>          + "storageNetApp:apiovh:share/acl/delete",<br>          + "storageNetApp:apiovh:share/acl/get",<br>          + "storageNetApp:apiovh:share/create",<br>          + "storageNetApp:apiovh:share/delete",<br>          + "storageNetApp:apiovh:share/edit",<br>          + "storageNetApp:apiovh:share/extend",<br>          + "storageNetApp:apiovh:share/get",<br>          + "storageNetApp:apiovh:share/revertToSnapshot",<br>          + "storageNetApp:apiovh:share/snapshot/create",<br>          + "storageNetApp:apiovh:share/snapshot/delete",<br>          + "storageNetApp:apiovh:share/snapshot/edit",<br>          + "storageNetApp:apiovh:share/snapshot/get",<br>        ]<br>      + created_at  = (known after apply)<br>      + description = "IAM policy for EFS Trident access"<br>      + id          = (known after apply)<br>      + identities  = (known after apply)<br>      + name        = "efs-trident-policy-example"<br>      + owner       = (known after apply)<br>      + read_only   = (known after apply)<br>      + resources   = (known after apply)<br>      + updated_at  = (known after apply)<br>    }<br><br>  # module.ovh_efs_trident.ovh_me_api_oauth2_client.api_oauth2_client will be created<br>  + resource "ovh_me_api_oauth2_client" "api_oauth2_client" {<br>      + client_id     = (known after apply)<br>      + client_secret = (sensitive value)<br>      + description   = "OAuth2 client for EFS Trident integration"<br>      + flow          = "CLIENT_CREDENTIALS"<br>      + id            = (known after apply)<br>      + identity      = (known after apply)<br>      + name          = "efs-trident-client-example"<br>    }<br><br>  # module.ovh_efs_trident.ovh_storage_efs.efs[0] will be created<br>  + resource "ovh_storage_efs" "efs" {<br>      + created_at        = (known after apply)<br>      + iam               = (known after apply)<br>      + id                = (known after apply)<br>      + name              = "my-efs-storage"<br>      + order             = (known after apply)<br>      + ovh_subsidiary    = "FR"<br>      + performance_level = (known after apply)<br>      + plan              = [<br>          + {<br>              + configuration = [<br>                  + {<br>                      + label = "region"<br>                      + value = "eu-west-rbx"<br>                    },<br>                  + {<br>                      + label = "network"<br>                      + value = "vrack"<br>                    },<br>                ]<br>              + duration      = "P1M"<br>              + plan_code     = "enterprise-file-storage-premium-1tb"<br>              + pricing_mode  = "default"<br>            },<br>        ]<br>      + product           = (known after apply)<br>      + quota             = (known after apply)<br>      + region            = (known after apply)<br>      + service_name      = (known after apply)<br>      + status            = (known after apply)<br>    }<br><br>  # module.ovh_efs_trident.ovh_vrack_vrackservices.vrack-vrackservices-binding[0] will be created<br>  + resource "ovh_vrack_vrackservices" "vrack-vrackservices-binding" {<br>      + id             = (known after apply)<br>      + service_name   = "pn-1234567"<br>      + vrack_services = (known after apply)<br>    }<br><br>  # module.ovh_efs_trident.ovh_vrackservices.vrackservices[0] will be created<br>  + resource "ovh_vrackservices" "vrackservices" {<br>      + checksum        = (known after apply)<br>      + created_at      = (known after apply)<br>      + current_state   = (known after apply)<br>      + current_tasks   = (known after apply)<br>      + iam             = (known after apply)<br>      + id              = (known after apply)<br>      + order           = (known after apply)<br>      + ovh_subsidiary  = "FR"<br>      + plan            = [<br>          + {<br>              + configuration = [<br>                  + {<br>                      + label = "region_name"<br>                      + value = "eu-west-rbx"<br>                    },<br>                ]<br>              + duration      = "P1M"<br>              + plan_code     = "vrack-services"<br>              + pricing_mode  = "default"<br>            },<br>        ]<br>      + resource_status = (known after apply)<br>      + target_spec     = {<br>          + subnets = [<br>              + {<br>                  + cidr              = "192.168.168.0/24"<br>                  + service_endpoints = [<br>                      + {<br>                          + managed_service_urn = (known after apply)<br>                        },<br>                    ]<br>                  + service_range     = {<br>                      + cidr = "192.168.168.248/29"<br>                    }<br>                  + vlan              = 666<br>                    # (1 unchanged attribute hidden)<br>                },<br>            ]<br>        }<br>      + updated_at      = (known after apply)<br>    }<br><br>Plan: 6 to add, 0 to change, 0 to destroy.<br><br>Changes to Outputs:<br>  + client_id     = (known after apply)<br>  + client_secret = (sensitive value)<br>  + efs_id        = (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.ovh_efs_trident.null_resource.config_validation: Creating...<br>module.ovh_efs_trident.null_resource.config_validation: Creation complete after 0s [id=8553589333890826101]<br>module.ovh_efs_trident.ovh_me_api_oauth2_client.api_oauth2_client: Creating...<br>module.ovh_efs_trident.ovh_storage_efs.efs[0]: Creating...<br>module.ovh_efs_trident.ovh_me_api_oauth2_client.api_oauth2_client: Creation complete after 0s [id=EU.xxxxxxxxxxxxx]<br>module.ovh_efs_trident.ovh_storage_efs.efs[0]: Still creating... [00m10s elapsed]<br>module.ovh_efs_trident.ovh_storage_efs.efs[0]: Still creating... [00m20s elapsed]<br>module.ovh_efs_trident.ovh_storage_efs.efs[0]: Still creating... [00m30s elapsed]<br>...<br>module.ovh_efs_trident.ovh_storage_efs.efs[0]: Still creating... [03m40s elapsed]<br>module.ovh_efs_trident.ovh_storage_efs.efs[0]: Still creating... [03m50s elapsed]<br>module.ovh_efs_trident.ovh_storage_efs.efs[0]: Creation complete after 3m52s [id=c2d759de-cd63-4e28-aaab-a7599aad2ca8]<br>module.ovh_efs_trident.ovh_vrackservices.vrackservices[0]: Creating...<br>module.ovh_efs_trident.ovh_iam_policy.iam_policy: Creating...<br>module.ovh_efs_trident.ovh_iam_policy.iam_policy: Creation complete after 0s [id=a434d1a4-1234-5678-9012-cf54251eee52]<br>module.ovh_efs_trident.ovh_vrackservices.vrackservices[0]: Still creating... [00m10s elapsed]<br>module.ovh_efs_trident.ovh_vrackservices.vrackservices[0]: Still creating... [00m20s elapsed]<br>...<br>module.ovh_efs_trident.ovh_vrackservices.vrackservices[0]: Still creating... [01m20s elapsed]<br>module.ovh_efs_trident.ovh_vrackservices.vrackservices[0]: Creation complete after 1m30s [id=vrs-a00-b11-c22-d33]<br>module.ovh_efs_trident.ovh_vrack_vrackservices.vrack-vrackservices-binding[0]: Creating...<br>module.ovh_efs_trident.ovh_vrack_vrackservices.vrack-vrackservices-binding[0]: Still creating... [00m10s elapsed]<br>module.ovh_efs_trident.ovh_vrack_vrackservices.vrack-vrackservices-binding[0]: Still creating... [00m20s elapsed]<br>...<br>module.ovh_efs_trident.ovh_vrack_vrackservices.vrack-vrackservices-binding[0]: Still creating... [01m40s elapsed]<br>module.ovh_efs_trident.ovh_vrack_vrackservices.vrack-vrackservices-binding[0]: Creation complete after 1m43s [id=vrack_pn-1234567-vrackServices_vrs-a00-b11-c22-d33]<br><br>Apply complete! Resources: 6 added, 0 changed, 0 destroyed.<br><br>Outputs:<br><br>client_id = "EU.xxxxxxxxxxxxx"<br>client_secret = &lt;sensitive&gt;<br>efs_id = "c2d759de-cd63-4e28-aaab-a7599aad2ca8"</code></pre>



<p class="wp-block-paragraph">Save the OAuth2 credentials in environment variables:</p>



<pre class="wp-block-code"><code class="">export EFS_CLIENT_ID=$(terraform output -raw client_id)<br>export EFS_CLIENT_SECRET=$(terraform output -raw client_secret)</code></pre>



<h4 class="wp-block-heading">Trident CSI Installation</h4>



<p class="wp-block-paragraph">Install the Trident operator in your MKS cluster:</p>



<pre class="wp-block-code"><code class="">helm repo add netapp-trident https://netapp.github.io/trident-helm-chart<br><br>helm install trident-operator netapp-trident/trident-operator \<br>  --version 100.2502.1 \<br>  --create-namespace \<br>  --namespace trident \<br>  --set tridentSilenceAutosupport=true \<br>  --set operatorImage="ovhcom/trident-operator:25.02.1-linux-amd64" \<br>  --set tridentImage="ovhcom/trident:25.02.1-linux-amd64"</code></pre>



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



<pre class="wp-block-code"><code class="">$ helm install trident-operator netapp-trident/trident-operator \<br>  --version 100.2502.1 \<br>  --create-namespace \<br>  --namespace trident \<br>  --set tridentSilenceAutosupport=true \<br>  --set operatorImage="ovhcom/trident-operator:25.02.1-linux-amd64" \<br>  --set tridentImage="ovhcom/trident:25.02.1-linux-amd64"<br><br>NAME: trident-operator<br>LAST DEPLOYED: Tue Apr 28 14:01:19 2026<br>NAMESPACE: trident<br>STATUS: deployed<br>REVISION: 1<br>TEST SUITE: None<br>NOTES:<br>Thank you for installing trident-operator, which will deploy and manage NetApp's Trident CSI<br>storage provisioner for Kubernetes.<br><br>Your release is named 'trident-operator' and is installed into the 'trident' namespace.<br>Please note that there must be only one instance of Trident (and trident-operator) in a Kubernetes cluster.<br><br>To configure Trident to manage storage resources, you will need a copy of tridentctl, which is<br>available in pre-packaged Trident releases.  You may find all Trident releases and source code<br>online at https://github.com/NetApp/trident.<br><br>To learn more about the release, try:<br><br>  $ helm status trident-operator<br>  $ helm get all trident-operator</code></pre>



<p class="wp-block-paragraph">Once the installation is complete, verify that all Trident <strong>pods</strong> are in <code><strong>Running</strong></code> state in the trident <strong>namespace</strong> before proceeding:</p>



<pre class="wp-block-code"><code class="">$ kubectl get pods -n trident<br><br>NAME                                  READY   STATUS    RESTARTS      AGE<br>trident-controller-5bf6c8d6f6-g95jq   6/6     Running   0             119s<br>trident-node-linux-4xtjr              2/2     Running   1 (82s ago)   119s<br>trident-node-linux-6w5ff              2/2     Running   1 (82s ago)   119s<br>trident-node-linux-r7hxp              2/2     Running   0             119s<br>trident-operator-859f59c58b-2z2ts     1/1     Running   0             2m31s</code></pre>



<h4 class="wp-block-heading">Trident Backend Creation</h4>



<p class="wp-block-paragraph">The Trident backend connects NetApp Trident to the OVHcloud EFS service using the IAM credentials previously created.</p>



<h5 class="wp-block-heading" id="1-secret-creation">1. Secret Creation</h5>



<p class="wp-block-paragraph">Create a Kubernetes <strong>Secret</strong> containing the connection information that allows Trident to access the OVHcloud API. Create a <strong>trident-secret.yaml.template</strong> file with the following content:</p>



<pre class="wp-block-code"><code class="">apiVersion: v1<br>kind: Secret<br>metadata:<br>  name: ovh-efs-secret<br>type: Opaque<br>stringData:<br>  clientID: "$EFS_CLIENT_ID"         # your clientId<br>  clientSecret: "$EFS_CLIENT_SECRET" # your clientSecret</code></pre>



<p class="wp-block-paragraph">Replace the <code>clientID</code> and <code>clientSecret</code> values by the OAuth2 client we created with Terraform:</p>



<pre class="wp-block-code"><code class="">envsubst &lt; trident-secret.yaml.template &gt; trident-secret.yaml</code></pre>



<p class="wp-block-paragraph">Apply the secret in your cluster:</p>



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



<p class="wp-block-paragraph">Check that the secret has been correctly created:</p>



<pre class="wp-block-code"><code class="">$ kubectl get secret ovh-efs-secret -n trident<br><br>NAME             TYPE     DATA   AGE<br>ovh-efs-secret   Opaque   2      3s</code></pre>



<h5 class="wp-block-heading" id="2-trident-backend-creation">2. Trident Backend Creation</h5>



<p class="wp-block-paragraph">Create your backend with the command below:</p>



<pre class="wp-block-code"><code class="">cat &lt;&lt;EOF | kubectl create -n trident -f -<br>apiVersion: trident.netapp.io/v1<br>kind: TridentBackendConfig<br>metadata:<br>  name: ovh-efs-rbx<br>spec:<br>  version: 1<br>  backendName: backend-ovh-efs<br>  defaults:<br>    exportRule: "192.168.168.0/24"    # CIDR of your network for NFS ACLs<br>  storageDriverName: ovh-efs<br>  clientLocation: ovh-eu<br>  location: eu-west-rbx         # Location of your EFS service<br>  serviceLevel: premium<br>  nfsMountOptions: rw,hard,rsize=65536,wsize=65536,nfsvers=3,tcp<br>  credentials:<br>    name: ovh-efs-secret<br>  volumeCreateTimeout: "60" <br>EOF</code></pre>



<p class="wp-block-paragraph">⚠️ The <code>ovh-efs</code> storage driver must be used. Replace <code><strong>exportRule</strong></code>, <code><strong>location</strong></code>, and other parameters with values matching your environment.</p>



<p class="wp-block-paragraph">Verify that the backend has been created correctly with the command below:</p>



<pre class="wp-block-code"><code class="">$ kubectl get TridentBackendConfig -n trident<br><br>NAME          BACKEND NAME      BACKEND UUID                           PHASE   STATUS<br>ovh-efs-rbx   backend-ovh-efs   ace12d67-70ea-44e1-abd8-20d016f7f030   Bound   Success</code></pre>



<h4 class="wp-block-heading" id="storageclass-and-usage">Use EFS in your MKS cluster</h4>



<p class="wp-block-paragraph">This section describes how to expose Enterprise File Storage to Kubernetes workloads using Trident.</p>



<h5 class="wp-block-heading" id="1-storageclass">1. StorageClass</h5>



<p class="wp-block-paragraph">In a <strong>sc_efs.yaml</strong> file, define a <code>StorageClass</code> to enable dynamic provisioning via the Trident CSI driver:</p>



<pre class="wp-block-code"><code class="">apiVersion: storage.k8s.io/v1<br>kind: StorageClass<br>metadata:<br>  name: ovh-efs-premium<br>provisioner: csi.trident.netapp.io<br>parameters:<br>  backendType: "ovh-efs"<br>  fsType: "nfs"<br>allowVolumeExpansion: true</code></pre>



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



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



<p class="wp-block-paragraph">Check that the StorageClass has been created:</p>



<pre class="wp-block-code"><code class="">$ kubectl get sc ovh-efs-premium<br><br>NAME              PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE<br>ovh-efs-premium   csi.trident.netapp.io   Delete          Immediate           true                   3h13m</code></pre>



<p class="wp-block-paragraph">This <strong>StorageClass</strong> allows volumes to be provisioned on demand and expanded dynamically.</p>



<h4 class="wp-block-heading" id="2-volume-creation-pvc">2. Volume Creation (PVC)</h4>



<p class="wp-block-paragraph">Create a <code>PersistentVolumeClaim</code> with <code>ReadWriteMany</code> (RWX) access mode. Create a <strong>pvc_efs.yaml</strong> file with this content:</p>



<pre class="wp-block-code"><code class="">apiVersion: v1<br>kind: PersistentVolumeClaim<br>metadata:<br>  name: premium-pvc-efs<br>spec:<br>  accessModes:<br>    - ReadWriteMany<br>  resources:<br>    requests:<br>      storage: 100Gi<br>  storageClassName: ovh-efs-premium</code></pre>



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



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



<p class="wp-block-paragraph">Verify that the <code><strong>PVC</strong></code> has been created with the command below:</p>



<pre class="wp-block-code"><code class="">kubectl get pvc premium-pvc-efs</code></pre>



<p class="wp-block-paragraph">At this point, the <strong>EFS</strong> is creating a volume, attach the correct ACL to it and mount it in the PVC</p>



<p class="wp-block-paragraph">After a little time, the output should show the PVC in <code>Bound</code> state:</p>



<pre class="wp-block-code"><code class="">$ kubectl get pvc<br><br>NAME              STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      VOLUMEATTRIBUTESCLASS   AGE<br>premium-pvc-efs   Bound    pvc-faca364d-ad76-44ec-9bc9-959c0d33c515   100Gi      RWX            ovh-efs-premium   &lt;unset&gt;                 3m43s</code></pre>



<p class="wp-block-paragraph">The volume has been created through the <strong>PVC</strong> and you can now mount it in a <strong>Pod</strong> 🎉.</p>



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



<p class="wp-block-paragraph">In this blog, we’ve explained how to create an EFS and use it in a MKS cluster through Trident CSI. This will give you a flexible, production-ready approach to persistent shared storage in Kubernetes.</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 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%2Fnavigating-ovhcloud-enterprise-file-storage-efs-with-trident-csi-on-kubernetes-clusters-mks%2F&amp;action_name=Navigating%20OVHcloud%20Enterprise%20File%20Storage%20%28EFS%29%20with%20Trident%20CSI%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>
		<item>
		<title>OVHcloud Startups: How to Accelerate Your Growth using Our Training Portal</title>
		<link>https://blog.ovhcloud.com/ovhcloud-startups-how-to-accelerate-your-growth-using-our-training-portal/</link>
		
		<dc:creator><![CDATA[Marine Watterlot]]></dc:creator>
		<pubDate>Wed, 22 Apr 2026 16:07:10 +0000</pubDate>
				<category><![CDATA[Ecosystem]]></category>
		<category><![CDATA[OVHcloud Startup Program]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[OVHcloud]]></category>
		<category><![CDATA[Public Cloud]]></category>
		<category><![CDATA[Startup Program]]></category>
		<guid isPermaLink="false">https://blog.ovhcloud.com/?p=31268</guid>

					<description><![CDATA[As a member of the OVHcloud Startup Program, you&#8217;re part of a vibrant community that&#8217;s driving innovation and digital transformation. [&#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%2Fovhcloud-startups-how-to-accelerate-your-growth-using-our-training-portal%2F&amp;action_name=OVHcloud%20Startups%3A%20How%20to%20Accelerate%20Your%20Growth%20using%20Our%20Training%20Portal&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[
<p class="wp-block-paragraph">As a member of the OVHcloud Startup Program, you&#8217;re part of a vibrant community that&#8217;s driving innovation and digital transformation. To stay ahead of the curve, it&#8217;s essential to continuously update your skills, practices, and technologies. One way to do this is by leveraging the resources and support offered by the OVHcloud Partner Network.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="540" height="320" src="https://blog.ovhcloud.com/wp-content/uploads/2026/04/image.jpeg" alt="" class="wp-image-31269" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/04/image.jpeg 540w, https://blog.ovhcloud.com/wp-content/uploads/2026/04/image-300x178.jpeg 300w" sizes="auto, (max-width: 540px) 100vw, 540px" /></figure>



<h5 class="wp-block-heading"><strong>With the OVHcloud Startup Program, you can enhance your cloud expertise and accelerate your growth. How?</strong></h5>



<p class="wp-block-paragraph">The Startup Program provides you with access to dedicated cloud resources, including technical consultation sessions with our engineers. These sessions can help you navigate the complexities of cloud infrastructure and optimize your cloud strategy.</p>



<p class="wp-block-paragraph"><strong>Now you can also get access to dedicated cloud training</strong>. As a Startup Program member, you can obtain cloud solutions certifications which will make you stand out from the crowd and, also, be better prepared to navigate your cloud strategy.</p>



<p class="wp-block-paragraph">We’ve opted for a flexible training model because we trust our customers. This means that you can train independently through e-learning, whenever you want, choosing the courses that are relevant to your business and the people who need to be trained, according to their role. This saves you time and money and, thanks to the expertise you’ll gain through training, you’ll be able to deploy more cost-effective and efficient cloud solutions.</p>



<p class="wp-block-paragraph">Our training courses and certifications give you <strong>a more qualified workforce.</strong></p>



<p class="wp-block-paragraph">In addition to validating your technical skills, our certifications can help you develop your expertise. Plus, you can demonstrate this with our certification badges, which help you gain recognition.</p>



<p class="wp-block-paragraph">Finally, OVHcloud offers a wide range of solutions. Our training courses will help you discover the scope of these solutions and when and how to use them. Each course is designed to help you deliver a great experience for your customers. Simply by having the right knowledge to effectively identify the best solution to meet their needs.</p>



<p class="wp-block-paragraph">Once trained, you are also likely to have ideas for new projects.</p>



<p class="wp-block-paragraph">Get certified and give your expertise a headstart.</p>



<p class="wp-block-paragraph">Discover our <a href="https://partner.ovhcloud.training/?lang=e" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Training Portal&#8217;s catalog</a> to boost your expertise.</p>



<hr class="wp-block-separator has-alpha-channel-opacity" />



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="341" src="https://blog.ovhcloud.com/wp-content/uploads/2026/04/image-7-1024x341.png" alt="" class="wp-image-31379" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/04/image-7-1024x341.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2026/04/image-7-300x100.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2026/04/image-7-768x256.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/04/image-7.png 1200w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph"><a href="https://startup.ovhcloud.com/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">https://startup.ovhcloud.com/</a>Get started with the <a href="https://startup.ovhcloud.com/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">OVHcloud Startup Program</a> and accelerate your growth today. Apply now and discover how our program can help you achieve your goals: <a href="https://startup.ovhcloud.com/" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external">https://startup.ovhcloud.com/</a></p>



<p class="wp-block-paragraph"></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%2Fovhcloud-startups-how-to-accelerate-your-growth-using-our-training-portal%2F&amp;action_name=OVHcloud%20Startups%3A%20How%20to%20Accelerate%20Your%20Growth%20using%20Our%20Training%20Portal&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>
		<item>
		<title>How Mia Experts Is Reinventing Medical Software with AI and Sovereign Cloud</title>
		<link>https://blog.ovhcloud.com/how-mia-experts-is-reinventing-medical-software-with-ai-and-sovereign-cloud/</link>
		
		<dc:creator><![CDATA[Leonard Pommereau]]></dc:creator>
		<pubDate>Wed, 22 Apr 2026 16:05:58 +0000</pubDate>
				<category><![CDATA[OVHcloud Startup Program]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[HDS]]></category>
		<category><![CDATA[Healthtech]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[Public Cloud]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Startup Program]]></category>
		<guid isPermaLink="false">https://blog.ovhcloud.com/?p=31254</guid>

					<description><![CDATA[The Context: Rethinking the Digital Tools of Physicians Mia Experts is a new generation medical software platform designed by a [&#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%2Fhow-mia-experts-is-reinventing-medical-software-with-ai-and-sovereign-cloud%2F&amp;action_name=How%20Mia%20Experts%20Is%20Reinventing%20Medical%20Software%20with%20AI%20and%20Sovereign%20Cloud&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[
<h5 class="wp-block-heading"><strong>The Context: Rethinking the Digital Tools of Physicians</strong></h5>



<p class="wp-block-paragraph"><a href="https://miaexperts.com/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Mia Experts</a> is a new generation medical software platform designed <strong>by a physician, for physicians</strong>. From the very beginning, the product was built to integrate artificial intelligence in a way that is <strong>useful, secure, and aligned with the realities of medical practice</strong>.</p>



<p class="wp-block-paragraph">Today, many doctors spend a significant part of their day dealing with administrative tasks rather than focusing on patient care and clinical decision-making. Existing medical software is often outdated, poorly designed, and disconnected from how physicians actually work.</p>



<p class="wp-block-paragraph">Mia Experts aims to change that. By leveraging artificial intelligence, the platform automates repetitive tasks and structures medical data in a meaningful and usable way. The goal is simple: <strong>give physicians back their time</strong>.</p>



<p class="wp-block-paragraph">The solution primarily targets private practitioners, particularly in <strong>general medicine and surgical specialties</strong>, where efficient data management, reliability, and time savings are critical.</p>



<h5 class="wp-block-heading"><strong>Built from Real Medical Experience</strong></h5>



<p class="wp-block-paragraph">The idea behind Mia Experts originated from the daily experience of <strong>Vincent Salabi, a surgeon</strong> who repeatedly encountered the same issue: medical software that was slow, repetitive, and time-consuming.</p>



<p class="wp-block-paragraph">Instead of helping doctors, these tools often added friction to their workflow.</p>



<p class="wp-block-paragraph">At the same time, a major technological shift was occurring: artificial intelligence was becoming accessible in a way that could be deployed <strong>securely and within a sovereign regulatory framework</strong>.</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="800" height="543" src="https://blog.ovhcloud.com/wp-content/uploads/2026/04/Equipe-mia-experts.jpeg" alt="" class="wp-image-31256" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/04/Equipe-mia-experts.jpeg 800w, https://blog.ovhcloud.com/wp-content/uploads/2026/04/Equipe-mia-experts-300x204.jpeg 300w, https://blog.ovhcloud.com/wp-content/uploads/2026/04/Equipe-mia-experts-768x521.jpeg 768w" sizes="auto, (max-width: 800px) 100vw, 800px" /><figcaption class="wp-element-caption"><em>Mia Experts team (from left to right): Julie Rognon, Willy Noël, Kajarooban Thiyagarajah, Vincent Salabi, Patrick Wong</em></figcaption></figure>



<p class="wp-block-paragraph">Mia Experts was born from the collaboration of three co-founders with complementary expertise — medical, technical, and entrepreneurial — united by a shared ambition: <strong>to fundamentally rethink the physician’s digital workspace</strong>.</p>



<h5 class="wp-block-heading"><strong>Early Milestones and Key Achievements</strong></h5>



<p class="wp-block-paragraph">From the earliest stages, several key milestones helped shape the development of Mia Experts.</p>



<p class="wp-block-paragraph">One of the first successes was designing the software architecture. The team built a <strong>simple, modular, and scalable architecture</strong> capable of intelligently interacting with both patient and physician data.</p>



<p class="wp-block-paragraph">The objective was clear: eliminate unnecessary repetition, ensure every piece of data has meaning, and enable reliable data usage — whether for prescription generation or reducing medical errors.</p>



<p class="wp-block-paragraph">Operating in the highly regulated healthcare sector also required building an infrastructure compliant with <a href="https://www.ovhcloud.com/en/compliance/hds/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer"><strong>Health Data Hosting (HDS)</strong> </a>regulations. Mia Experts chose <strong>OVHcloud</strong>, ensuring health data sovereignty and providing a robust and secure cloud foundation.</p>



<p class="wp-block-paragraph">Infrastructure management is handled in partnership with <strong>Lecpac Consulting</strong>, allowing the team to meet regulatory requirements while focusing on product development and innovation.</p>



<p class="wp-block-paragraph">Another major milestone came through early presentations at medical conferences, particularly in <strong>orthopedic and urological surgery</strong>. The response from physicians was extremely positive. The software’s usability and clinical logic quickly generated word-of-mouth interest — even among doctors who had not been directly approached.</p>



<p class="wp-block-paragraph">Mia Experts also achieved several regulatory and technological milestones:</p>



<ul class="wp-block-list">
<li><strong>LAP certification</strong> for prescription software, obtained in collaboration with healthtech company Posos</li>



<li><strong>INSi compliance</strong>, enabling integration with national health identity standards</li>
</ul>



<p class="wp-block-paragraph">Even before official product launch, the startup received <strong>around 50 pre-orders</strong> purely through demonstrations and conference discussions.</p>



<p class="wp-block-paragraph">The platform is now entering its <strong>beta testing phase</strong>, with the first deployments planned soon.</p>



<h5 class="wp-block-heading"><strong>Core Values Driving the Product</strong></h5>



<p class="wp-block-paragraph">The development of Mia Experts is guided by a set of strong principles:</p>



<ul class="wp-block-list">
<li><strong>Simplicity</strong> – intuitive interfaces designed for real medical workflows</li>



<li><strong>Pragmatism</strong> – AI must deliver measurable time savings</li>



<li><strong>Data sovereignty</strong> – full control over hosting and infrastructure</li>



<li><strong>Health data security</strong> – non-negotiable protection standards</li>



<li><strong>Intelligent data structuring</strong> – ensuring reliable and actionable medical information</li>
</ul>



<h5 class="wp-block-heading"><strong>Business, Technical and Regulatory Complexity</strong></h5>



<p class="wp-block-paragraph">Building a medical software platform involves navigating a unique combination of <strong>business, technological, and regulatory challenges</strong>.</p>



<p class="wp-block-paragraph">From a business perspective, the first hurdle was securing funding while preserving technological independence. Mia Experts achieved this through an initial funding round involving physician investors, complemented by support from <strong>Bpifrance</strong> and the <strong>French Tech Grant</strong> program.</p>



<p class="wp-block-paragraph">On the technical side, the strict healthcare regulatory environment posed significant challenges. Compliance with <strong>HDS standards</strong> required implementing strong guarantees around security, traceability, service availability, and access governance from the very beginning.</p>



<p class="wp-block-paragraph">Another critical challenge involved <strong>health data interoperability</strong>. Medical data must follow standardized national frameworks and coding systems. Mia Experts needed to structure and transform this data so it could interact seamlessly with national health services such as secure messaging systems and health data platforms.</p>



<p class="wp-block-paragraph">Yet the biggest challenge was balancing all these constraints with a smooth user experience.</p>



<p class="wp-block-paragraph">The ambition was never to create software that was simply compliant but difficult to use. Instead, the goal was to design a platform that remains <strong>intuitive, efficient, and truly supportive of physicians’ daily work</strong>.</p>



<h5 class="wp-block-heading"><strong>Why Mia Experts Chose the Cloud</strong></h5>



<p class="wp-block-paragraph">Cloud infrastructure quickly became a natural choice for the project.</p>



<p class="wp-block-paragraph">First, artificial intelligence requires scalable computing resources. Running AI endpoints, fine-tuning models, and processing medical voice data demand infrastructure that can scale dynamically while protecting sensitive data.</p>



<p class="wp-block-paragraph">Second, the cloud offers strong advantages for <strong>security and regulatory compliance</strong>. As a medical software publisher, Mia Experts needed an infrastructure capable of guaranteeing both <strong>data sovereignty and regulatory compliance</strong> within the European framework.</p>



<p class="wp-block-paragraph">Finally, the cloud enables a much more agile product strategy. Unlike traditional locally installed medical software, cloud-based architecture allows centralized updates and continuous product improvement without disrupting physicians’ workflows.</p>



<p class="wp-block-paragraph">For a fast-growing startup, this flexibility is essential.</p>



<h5 class="wp-block-heading"><strong>Leveraging OVHcloud to Build a Sovereign Health Infrastructure</strong></h5>



<p class="wp-block-paragraph">Choosing OVHcloud was a strategic decision for Mia Experts, especially in a context where <strong>health data sovereignty is a critical issue</strong>.</p>



<p class="wp-block-paragraph">Many solutions rely on non-European cloud providers. OVHcloud allowed the startup to build its infrastructure on a <strong>secure, sovereign European cloud</strong>, fully compliant with French and EU regulations.</p>



<p class="wp-block-paragraph">This has become a strong differentiator — both from a regulatory standpoint and in terms of trust with physicians.</p>



<p class="wp-block-paragraph">The <strong><a href="https://startup.ovhcloud.com/en/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">OVHcloud Startup Program</a></strong> also played a key role during the early development phase by helping offset the high technical costs associated with innovation.</p>



<p class="wp-block-paragraph">Mia Experts relies heavily on <strong>speech-to-text and AI models</strong> for generating medical reports. Fine-tuning these models to understand medical vocabulary requires substantial computing power. The program allowed the team to train and test these models without immediate financial pressure.</p>



<h5 class="wp-block-heading"><strong>The Infrastructure Behind Mia Experts</strong></h5>



<p class="wp-block-paragraph">Today, the platform runs on a robust cloud architecture built on OVHcloud services, including:</p>



<ul class="wp-block-list">
<li><strong><a href="https://www.ovhcloud.com/en/public-cloud/kubernetes/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Managed Kubernetes</a></strong> for Dev, Pre-production, and Production environments</li>



<li><strong><a href="https://www.ovhcloud.com/en/public-cloud/object-storage/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">S3-compatible object storage</a></strong> for medical documents and AI models</li>



<li><strong>GPU instances</strong> supporting real-time medical speech transcription</li>



<li><strong><a href="https://www.ovhcloud.com/en/public-cloud/ai-endpoints/catalog/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">AI Endpoints</a></strong> for LLMs such as Mistral, Llama, and GPT-OSS</li>



<li><strong>Dedicated <a href="https://www.ovhcloud.com/en/public-cloud/prices/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Public Cloud</a> instances</strong> hosting GitHub CI/CD runners</li>
</ul>



<p class="wp-block-paragraph">All infrastructure is hosted in France, ensuring compliance with <strong>GDPR and HDS requirements</strong>.</p>



<p class="wp-block-paragraph">One major advantage of OVHcloud AI endpoints is transparency: <strong>customer data is not used to train external models</strong>, a key concern in healthcare environments.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="947" height="631" src="https://blog.ovhcloud.com/wp-content/uploads/2026/04/image-6.png" alt="" class="wp-image-31255" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/04/image-6.png 947w, https://blog.ovhcloud.com/wp-content/uploads/2026/04/image-6-300x200.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2026/04/image-6-768x512.png 768w" sizes="auto, (max-width: 947px) 100vw, 947px" /></figure>



<hr class="wp-block-separator has-alpha-channel-opacity" />



<h5 class="wp-block-heading"><strong>Tangible Results and Impact</strong></h5>



<p class="wp-block-paragraph">The collaboration with OVHcloud has enabled several concrete achievements.</p>



<p class="wp-block-paragraph">First, Mia Experts successfully deployed an infrastructure fully compliant with <strong>HDS health data hosting standards</strong>, guaranteeing high levels of security, availability, and traceability.</p>



<p class="wp-block-paragraph">Second, the startup has been able to build and control its <strong>own AI capabilities</strong>, particularly around speech recognition and medical text generation. The voice recognition system has already been adapted to medical vocabulary, delivering strong accuracy in clinical contexts.</p>



<p class="wp-block-paragraph">Another key outcome is <strong>AI sovereignty</strong>. By hosting AI inference within a controlled European environment, Mia Experts retains full control over its data, models, and algorithms.</p>



<p class="wp-block-paragraph">Finally, the cloud infrastructure provides significant operational agility. The team can deploy updates quickly, iterate on AI models, and continuously improve application performance.</p>



<h5 class="wp-block-heading"><strong>Accelerating Product Adoption</strong></h5>



<p class="wp-block-paragraph">These technological choices have significantly strengthened Mia Experts’ positioning within the medical software ecosystem.</p>



<p class="wp-block-paragraph">The cloud infrastructure makes the solution eligible for <strong>Ségur V2 standards</strong>, a key regulatory benchmark for healthcare software interoperability in France.</p>



<p class="wp-block-paragraph">This strengthens credibility with physicians and facilitates integration into the national digital health ecosystem.</p>



<p class="wp-block-paragraph">By maintaining full control over its AI pipeline — from hosting to model fine-tuning — Mia Experts can guarantee both <strong>data confidentiality and high-quality performance tailored to medical language</strong>.</p>



<h5 class="wp-block-heading"><strong>What’s Next for Mia Experts</strong></h5>



<p class="wp-block-paragraph">The next step is the progressive onboarding of the first users, with around <strong>50 pre-registrations already secured before the official launch</strong>.</p>



<p class="wp-block-paragraph">In the medium term, the startup aims to reach:</p>



<ul class="wp-block-list">
<li><strong>300 users within two years</strong></li>



<li><strong>500 users within three years</strong></li>
</ul>



<p class="wp-block-paragraph">At the same time, Mia Experts plans to expand beyond surgical specialties with the launch of <strong>Mia Experts for General Practice</strong>, followed by extensions into additional medical disciplines.</p>



<p class="wp-block-paragraph">The long-term vision is to build a <strong>modular medical platform</strong> adaptable to multiple specialties while sharing a unified technological foundation.</p>



<h5 class="wp-block-heading"><strong>Advice for Other Startups</strong></h5>



<p class="wp-block-paragraph">For startups building AI-driven products, the Mia Experts team highlights three key lessons.</p>



<p class="wp-block-paragraph">First, <strong>anticipate your data strategy early</strong>. AI models are only as good as the data used to train them. Structuring and preparing datasets before accessing cloud resources can provide a major competitive advantage.</p>



<p class="wp-block-paragraph">Second, <strong>do not underestimate regulatory complexity</strong>, especially in sectors like healthcare. Partnering with an experienced infrastructure manager can significantly accelerate deployment.</p>



<p class="wp-block-paragraph">Finally, think of the cloud not only as hosting infrastructure but as <strong>a strategic platform for innovation and scalability</strong>.</p>



<h5 class="wp-block-heading"><strong>Conclusion</strong></h5>



<p class="wp-block-paragraph">The journey of Mia Experts shows that innovation in healthcare requires a careful balance between <strong>technological ambition, regulatory rigor, and practical usability</strong>.</p>



<p class="wp-block-paragraph">By building on a sovereign and compliant cloud infrastructure from the outset, the startup has laid strong foundations for developing a medical platform that genuinely supports physicians.</p>



<p class="wp-block-paragraph">The collaboration with OVHcloud has enabled Mia Experts to deploy a <strong>secure, scalable, and AI-ready infrastructure</strong>, ensuring full control over both health data and AI models.</p>



<p class="wp-block-paragraph">For startups operating in highly regulated sectors, choosing the right cloud ecosystem can make all the difference — enabling innovation, accelerating growth, and building trust from day one.</p>



<p class="wp-block-paragraph">Don’t let infrastructure costs limit your growth. We strongly urge other startups to join the <a href="https://startup.ovhcloud.com/en/" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external">OVHcloud Startup Program</a>. Contact their team to build your own foundation for sustainable success.</p>



<hr class="wp-block-separator has-alpha-channel-opacity" />



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="341" src="https://blog.ovhcloud.com/wp-content/uploads/2026/04/image-7-1024x341.png" alt="" class="wp-image-31379" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/04/image-7-1024x341.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2026/04/image-7-300x100.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2026/04/image-7-768x256.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/04/image-7.png 1200w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">If you’re a startup looking to transform your business, we encourage you to join the <strong><a href="https://startup.ovhcloud.com/en/" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external">OVHcloud Startup Program</a></strong> or contact OVHcloud to discover how our solutions can support your journey!</p>



<p class="wp-block-paragraph"></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%2Fhow-mia-experts-is-reinventing-medical-software-with-ai-and-sovereign-cloud%2F&amp;action_name=How%20Mia%20Experts%20Is%20Reinventing%20Medical%20Software%20with%20AI%20and%20Sovereign%20Cloud&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>
		<item>
		<title>Reference Architecture: Deploying a vision-language model with vLLM on OVHcloud MKS for high performance inference and full observability</title>
		<link>https://blog.ovhcloud.com/reference-architecture-deploying-a-vision-language-model-with-vllm-on-ovhcloud-mks-for-high-performance-inference-and-full-observability/</link>
		
		<dc:creator><![CDATA[Eléa Petton]]></dc:creator>
		<pubDate>Fri, 10 Apr 2026 07:48:53 +0000</pubDate>
				<category><![CDATA[OVHcloud Engineering]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[GPU]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[LLM]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[OVHcloud]]></category>
		<category><![CDATA[prometheus]]></category>
		<category><![CDATA[Public Cloud]]></category>
		<category><![CDATA[vLLM]]></category>
		<guid isPermaLink="false">https://blog.ovhcloud.com/?p=30455</guid>

					<description><![CDATA[Ensure complete&#160;digital sovereignty&#160;of your AI models with end-to-end control through open-source solutions on OVHcloud’s&#160;Managed Kubernetes Service. This reference architecture demonstrates [&#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%2Freference-architecture-deploying-a-vision-language-model-with-vllm-on-ovhcloud-mks-for-high-performance-inference-and-full-observability%2F&amp;action_name=Reference%20Architecture%3A%20Deploying%20a%20vision-language%20model%20with%20vLLM%20on%20OVHcloud%20MKS%20for%20high%20performance%20inference%20and%20full%20observability&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[
<p class="wp-block-paragraph"><em><em>Ensure complete&nbsp;<strong>digital sovereignty</strong>&nbsp;of your AI models with end-to-end control through open-source solutions on OVHcloud’s&nbsp;<strong>Managed Kubernetes Service</strong>.</em></em></p>



<figure class="wp-block-image aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="703" height="1024" src="https://blog.ovhcloud.com/wp-content/uploads/2026/04/ref-archi-mks-vllm-703x1024.jpg" alt="vLLM on OVHcloud MKS for high availability and full observability" class="wp-image-31153" style="width:710px;height:auto" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/04/ref-archi-mks-vllm-703x1024.jpg 703w, https://blog.ovhcloud.com/wp-content/uploads/2026/04/ref-archi-mks-vllm-206x300.jpg 206w, https://blog.ovhcloud.com/wp-content/uploads/2026/04/ref-archi-mks-vllm-768x1118.jpg 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/04/ref-archi-mks-vllm-1055x1536.jpg 1055w, https://blog.ovhcloud.com/wp-content/uploads/2026/04/ref-archi-mks-vllm.jpg 1260w" sizes="auto, (max-width: 703px) 100vw, 703px" /><figcaption class="wp-element-caption"><em><em>vLLM on OVHcloud MKS for high availability and full observability</em></em></figcaption></figure>



<p class="wp-block-paragraph">This reference architecture demonstrates how to deploy a Large Language Model (LLM) inference system using vLLM on&nbsp;<a href="https://www.ovhcloud.com/fr/public-cloud/kubernetes/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">OVHcloud Managed Kubernetes Service</a>&nbsp;(MKS). The solution leverages NVIDIA L40S GPUs to serve the&nbsp;<a href="https://huggingface.co/Qwen/Qwen3-VL-8B-Instruct" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Qwen3-VL-8B-Instruct</a>&nbsp;multimodal model (vision + text) with OpenAI-compatible API endpoints.</p>



<p class="wp-block-paragraph">This comprehensive guide shows you how to deploy, to scale automatically, and how to monitor vLLM-based LLM workloads on the OVHcloud infrastructure.</p>



<p class="wp-block-paragraph"><strong>What are the key benefits?</strong></p>



<ul class="wp-block-list">
<li><strong>Cost-effectiveness:</strong>&nbsp;Leverage managed services to minimise operational overhead</li>



<li><strong>Real-time observability:</strong>&nbsp;Track Time-to-First-Token (TTFT), throughput, and resource utilisation</li>



<li><strong>Sovereign infrastructure:</strong>&nbsp;Keep all metrics and data within European datacentres</li>



<li><strong>Scalable by design:</strong>&nbsp;Automatically scale GPU inference replicas based on real workload demand</li>
</ul>



<h2 class="wp-block-heading">Context</h2>



<h3 class="wp-block-heading">Managed Kubernetes Service</h3>



<p class="wp-block-paragraph"><strong>OVHcloud MKS</strong>&nbsp;is a fully managed Kubernetes platform designed to help you deploy, operate, and scale containerised applications in production. It provides a secure and reliable Kubernetes environment without the operational overhead of managing the control plane.</p>



<p class="wp-block-paragraph"><strong>How does this benefit you?</strong></p>



<ul class="wp-block-list">
<li><strong>Cost-efficient</strong>: Pay only for worker nodes and consumed resources, with no additional charge for the Kubernetes control plane</li>



<li><strong>Fully managed Kubernetes</strong>: Certified upstream Kubernetes with automated control plane management, provided upgrades and high availability</li>



<li><strong>Production-ready by design</strong>: Built-in integrations with OVHcloud Load Balancers, networking, and persistent storage</li>



<li><strong>Scalable and flexible</strong>: Scale workloads easily, node pools to match application demand</li>



<li><strong>Open and portable</strong>: Based on standard Kubernetes APIs, enable seamless integration with open-source ecosystems and avoid vendor lock-in</li>
</ul>



<p class="wp-block-paragraph">In the following guide, all services are deployed within the&nbsp;<strong>OVHcloud Public Cloud</strong>.</p>



<h2 class="wp-block-heading">Architecture overview</h2>



<p class="wp-block-paragraph">This reference architecture demonstrates a basic deployment of vLLM for vision-language model inference on OVHcloud Managed Kubernetes Service, featuring:</p>



<ul class="wp-block-list">
<li><strong>High-availability deployment</strong>&nbsp;with 2 GPU nodes (NVIDIA L40S)</li>



<li><strong>Optimised GPU utilisation</strong>&nbsp;with proper driver configuration</li>



<li><strong>Scalable infrastructure</strong>&nbsp;supporting vision-language models</li>



<li><strong>Comprehensive monitoring</strong>&nbsp;using Prometheus, Grafana, and DCGM</li>



<li><strong>Full observability</strong>&nbsp;for both application and hardware metrics</li>
</ul>



<p class="wp-block-paragraph"><strong>Data flow</strong>:</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="538" src="https://blog.ovhcloud.com/wp-content/uploads/2026/03/data_ia_archi-3-1-1024x538.jpg" alt="" class="wp-image-30985" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/03/data_ia_archi-3-1-1024x538.jpg 1024w, https://blog.ovhcloud.com/wp-content/uploads/2026/03/data_ia_archi-3-1-300x158.jpg 300w, https://blog.ovhcloud.com/wp-content/uploads/2026/03/data_ia_archi-3-1-768x403.jpg 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/03/data_ia_archi-3-1-1536x806.jpg 1536w, https://blog.ovhcloud.com/wp-content/uploads/2026/03/data_ia_archi-3-1-2048x1075.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption"><em>Data Flow</em></figcaption></figure>



<ol class="wp-block-list">
<li><strong>Inference request:</strong>
<ul class="wp-block-list">
<li>User → LoadBalancer → Gateway → NGINX Ingress → &#8220;Qwen3 VL&#8221; Service → vLLM Pod → GPU</li>



<li>Response follows reverse path with streaming support</li>
</ul>
</li>



<li><strong>Metrics collection:</strong>
<ul class="wp-block-list">
<li>vLLM Pods expose <code>/metrics</code> endpoint (port <code><strong><mark class="has-inline-color has-ast-global-color-0-color">8000</mark></strong></code>)</li>



<li>DCGM Exporters expose GPU metrics (port <code><strong><mark class="has-inline-color has-ast-global-color-0-color">9400</mark></strong></code>)</li>



<li>Prometheus scrapes both endpoints every 30 seconds</li>



<li>Grafana queries Prometheus for visualization</li>
</ul>
</li>



<li><strong>Load distribution</strong>
<ul class="wp-block-list">
<li>NGINX Ingress uses cookie-based session affinity</li>



<li>vLLM Service uses ClientIP session affinity</li>



<li>Anti-affinity ensures 1 pod per GPU node</li>
</ul>
</li>
</ol>



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



<p class="wp-block-paragraph">Before you begin, ensure you have:</p>



<ul class="wp-block-list">
<li>An&nbsp;<strong>OVHcloud Public Cloud</strong>&nbsp;account</li>



<li>An&nbsp;<strong>OpenStack user</strong>&nbsp;with the<a href="https://help.ovhcloud.com/csm/en-gb-public-cloud-ai-users?id=kb_article_view&amp;sysparm_article=KB0048170" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">&nbsp;</a><strong><code>Administrator</code></strong>&nbsp;role</li>



<li><strong>Hugging Face access</strong>&nbsp;–&nbsp;<em>create a&nbsp;<a href="https://huggingface.co/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Hugging Face account</a>&nbsp;and generate an&nbsp;<a href="https://huggingface.co/settings/tokens" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">access token</a></em></li>



<li><code><strong>kubectl</strong></code>&nbsp;already installed and&nbsp;<code><strong>helm</strong></code>&nbsp;installed (at least version 3.x)</li>
</ul>



<p class="wp-block-paragraph"><strong>🚀 Now you have all the ingredients, it’s time to deploy the recipe for&nbsp;<a href="https://huggingface.co/Qwen/Qwen3-VL-8B-Instruct" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Qwen/Qwen3-VL-8B-Instruct</a>&nbsp;using vLLM and MKS!</strong></p>



<h2 class="wp-block-heading">Architecture guide: Native GPU deployment of vLLM on MKS with full stack observability</h2>



<p class="wp-block-paragraph">This reference architecture describes a<strong>&nbsp;Large Language Model</strong>&nbsp;deployment using&nbsp;<strong>vLLM inference server&nbsp;</strong>and&nbsp;<strong>Kubernetes</strong>, to enjoy the&nbsp;benefits of a service that&#8217;s both highly available and monitorable in real time.</p>



<h3 class="wp-block-heading">Step 1 &#8211; Create MKS cluster and Node pools</h3>



<p class="wp-block-paragraph">From&nbsp;<a href="https://www.ovh.com/manager/" target="_blank" rel="noreferrer noopener" data-wpel-link="exclude">OVHcloud Control Panel</a>, create a Kubernetes cluster using the&nbsp;<strong>MKS</strong>. </p>



<p class="wp-block-paragraph">Navigate to: <code>Public Cloud</code> → <code>Managed Kubernetes Service</code> → <code>Create a cluster</code></p>



<h4 class="wp-block-heading">1. Configure cluster</h4>



<p class="wp-block-paragraph">Consider using the following configuration for the current use case:</p>



<ul class="wp-block-list">
<li><strong>Name:</strong> <code><strong><mark class="has-inline-color has-ast-global-color-0-color">vllm-deployment-l40s-qwen3-8b</mark></strong></code></li>



<li><strong>Location</strong>: 1-AZ Region &#8211; Gravelines (<code><strong><mark class="has-inline-color has-ast-global-color-0-color">GRA11</mark></strong></code>)</li>



<li><strong>Plan:</strong> Free (or Standard)</li>



<li><strong>Network</strong>: attach a <strong>Private network </strong>(e.g. <code><strong><mark class="has-inline-color has-ast-global-color-0-color">0000 - AI Private Network</mark></strong></code>)</li>



<li><strong>Version:</strong> Latest stable (e.g. <code><strong><mark class="has-inline-color has-ast-global-color-0-color">1.34</mark></strong></code>)</li>
</ul>



<h4 class="wp-block-heading">2. Create GPU Node pool</h4>



<p class="wp-block-paragraph">During the cluster creation, configure the vLLM Node pool for GPUs:</p>



<ul class="wp-block-list">
<li><strong>Node pool name:</strong> <code><mark class="has-inline-color has-ast-global-color-0-color">vllm</mark></code></li>



<li><strong>Flavor:</strong> <code><mark class="has-inline-color has-ast-global-color-0-color">L40S-90</mark></code></li>



<li><strong>Number of nodes:</strong> <code><mark class="has-inline-color has-ast-global-color-0-color">2</mark></code></li>



<li><strong>Autoscaling:</strong> Disabled (OFF)</li>
</ul>



<p class="wp-block-paragraph"><strong>Why L40S-90?</strong></p>



<ul class="wp-block-list">
<li>Cost-effective for single-model deployment (1 GPU per node)</li>



<li>Sufficient RAM (90GB) for <strong><code><mark class="has-inline-color has-ast-global-color-0-color">Qwen3-VL-8B</mark></code></strong> model</li>
</ul>



<p class="wp-block-paragraph">You should see your cluster (e.g.&nbsp;<code><strong><mark class="has-inline-color has-ast-global-color-0-color">vllm-deployment-l40s-qwen3-8b</mark></strong></code>) in the list, along with the following information:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="930" height="588" src="https://blog.ovhcloud.com/wp-content/uploads/2026/03/image-1.png" alt="" class="wp-image-30745" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/03/image-1.png 930w, https://blog.ovhcloud.com/wp-content/uploads/2026/03/image-1-300x190.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2026/03/image-1-768x486.png 768w" sizes="auto, (max-width: 930px) 100vw, 930px" /></figure>



<p class="wp-block-paragraph">You can now set up the node pool dedicated to monitoring.</p>



<h4 class="wp-block-heading">3. Create CPU Node pool</h4>



<p class="wp-block-paragraph">From your cluster, click on <code><strong><mark class="has-inline-color has-ast-global-color-0-color">Add a node pool</mark></strong></code> and configure it as follow:</p>



<ul class="wp-block-list">
<li><strong>Node pool name:</strong> <mark class="has-inline-color has-ast-global-color-0-color"><code>monitoring</code></mark></li>



<li><strong>Flavor:</strong> <code><mark class="has-inline-color has-ast-global-color-0-color">B2-15</mark></code></li>



<li><strong>Number of nodes:</strong> <code><mark class="has-inline-color has-ast-global-color-0-color">1</mark></code></li>



<li><strong>Autoscaling:</strong> Disabled (OFF)</li>
</ul>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">✅ <strong>Note</strong></p>



<p class="wp-block-paragraph"><strong><em>Monitoring stack can run on GPU nodes if cost is a concern. Dedicated CPU node provides better isolation and resource management.</em></strong></p>
</blockquote>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="365" src="https://blog.ovhcloud.com/wp-content/uploads/2026/03/monitoring-node-pool-creation-1024x365.png" alt="" class="wp-image-30743" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/03/monitoring-node-pool-creation-1024x365.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2026/03/monitoring-node-pool-creation-300x107.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2026/03/monitoring-node-pool-creation-768x274.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/03/monitoring-node-pool-creation.png 1283w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">If the status is green with the&nbsp;<strong><code><mark class="has-inline-color has-ast-global-color-0-color">OK</mark></code></strong>&nbsp;label, you can proceed to the next step.</p>



<h4 class="wp-block-heading">4. Configure Kubernetes access</h4>



<p class="wp-block-paragraph">Once your nodes have been provisioned, you can download the <strong>Kubeconfig file</strong> and configure kubectl with your MKS cluster.</p>



<pre class="wp-block-code"><code class=""># configure kubectl with your MKS cluster<br>export KUBECONFIG=/path/to/your/kubeconfig-xxxxxx.yml<br><br># verify cluster connectivity<br>kubectl cluster-info<br>kubectl get nodes</code></pre>



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



<p class="wp-block-paragraph"><code>NAME &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; STATUS &nbsp; ROLES&nbsp; &nbsp; AGE &nbsp; VERSION<br>monitoring-node-xxxxxx &nbsp; Ready&nbsp; &nbsp; &lt;none&gt; &nbsp; 1d &nbsp; v1.34.2<br>vllm-node-yyyyyy &nbsp; &nbsp; &nbsp; &nbsp; Ready&nbsp; &nbsp; &lt;none&gt; &nbsp; 1d &nbsp; v1.34.2<br>vllm-node-zzzzzz &nbsp; &nbsp; &nbsp; &nbsp; Ready&nbsp; &nbsp; &lt;none&gt; &nbsp; 1d &nbsp; v1.34.2</code></p>



<p class="wp-block-paragraph">Before going further, add a label to the CPU node for monitoring workloads.</p>



<pre class="wp-block-code"><code class="">CPU_NODE=$(kubectl get nodes -o json | \<br>  jq -r '.items[] | select(.status.allocatable."nvidia.com/gpu" == null) | .metadata.name')<br>kubectl label node $CPU_NODE node-role=monitoring</code></pre>



<p class="wp-block-paragraph">Finally, check with the following command:</p>



<pre class="wp-block-code"><code class="">NAME                     GPU      ROLE<br>monitoring-node-xxxxxx   &lt;none&gt;   monitoring<br>vllm-node-yyyyyy         1        &lt;none&gt;<br>vllm-node-zzzzzz         1        &lt;none&gt;</code></pre>



<p class="wp-block-paragraph">Once both nodes are in <strong>Ready</strong> status, you can proceed to the next step.</p>



<h3 class="wp-block-heading">Step 2 &#8211; Install GPU operator</h3>



<p class="wp-block-paragraph">To start, consider setting up the GPU operator.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>✅ Note</strong></p>



<p class="wp-block-paragraph"><em><strong>This step is based on this OVHcloud documentation: <a href="https://help.ovhcloud.com/csm/en-gb-public-cloud-kubernetes-deploy-gpu-application?id=kb_article_view&amp;sysparm_article=KB0049707" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Deploying a GPU application on OVHcloud Managed Kubernetes Service</a></strong></em></p>
</blockquote>



<h4 class="wp-block-heading">1. Add NVIDIA helm repository and create namespace</h4>



<p class="wp-block-paragraph">Add NVIDIA helm repo:</p>



<pre class="wp-block-code"><code class="">helm repo add nvidia https://helm.ngc.nvidia.com/nvidia<br>helm repo update</code></pre>



<p class="wp-block-paragraph">And create Namespace as follow.</p>



<pre class="wp-block-code"><code class="">kubectl create namespace gpu-operator</code></pre>



<h4 class="wp-block-heading">2. Install GPU operator with correct configuration</h4>



<p class="wp-block-paragraph">The GPU Operator must be configured with specific driver versions to ensure compatibility with vLLM containers.</p>



<p class="wp-block-paragraph">However, the default installation uses recent drivers (<code><strong><mark class="has-inline-color has-ast-global-color-0-color">580.x</mark></strong></code> with <strong><code><mark class="has-inline-color has-ast-global-color-0-color">CUDA 13.x</mark></code></strong>) which are incompatible with vLLM containers (<strong><code><mark class="has-inline-color has-ast-global-color-0-color">CUDA 12.x</mark></code></strong>).</p>



<p class="wp-block-paragraph"><strong>Solution:</strong> Force driver version <strong><code><mark class="has-inline-color has-ast-global-color-0-color">535.183.01</mark></code></strong> (<code><strong><mark class="has-inline-color has-ast-global-color-0-color">CUDA 12.2</mark></strong></code>).</p>



<pre class="wp-block-code"><code class="">helm install gpu-operator nvidia/gpu-operator \<br>  -n gpu-operator \<br>  --set driver.enabled=true \<br>  --set driver.version="535.183.01" \<br>  --set toolkit.enabled=true \<br>  --set operator.defaultRuntime=containerd \<br>  --set devicePlugin.enabled=true \<br>  --set dcgmExporter.enabled=true \<br>  --set dcgmExporter.image="dcgm-exporter" \<br>  --set dcgmExporter.version="3.1.7-3.1.4-ubuntu20.04" \<br>  --set gfd.enabled=true \<br>  --set migManager.enabled=false \<br>  --set nodeStatusExporter.enabled=true \<br>  --set validator.driver.enable=false \<br>  --set validator.toolkit.enable=false \<br>  --set validator.plugin.enable=false \<br>  --timeout 20m</code></pre>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">✅ <strong>Note </strong></p>



<p class="wp-block-paragraph"><em><strong>Specifying the DCGM version may only be necessary if you encounter problems with the default image (e.g. <code><mark class="has-inline-color has-ast-global-color-0-color">‘ImagePullBackOff’</mark></code>). If this is the case, add the following parameters:<br><code><mark class="has-inline-color has-ast-global-color-0-color">--set dcgmExporter.repository="nvcr.io/nvidia/k8s"<br>--set dcgmExporter.image="dcgm-exporter"<br>--set dcgmExporter.version="3.1.7-3.1.4-ubuntu20.04"</mark></code></strong></em></p>
</blockquote>



<pre class="wp-block-code"><code class="">kubectl get pods -n gpu-operator</code></pre>



<p class="wp-block-paragraph">Note that all pods should reach <strong>Running</strong> state in 5-10 minutes.</p>



<p class="wp-block-paragraph">You can also check the GPU availability:</p>



<pre class="wp-block-code"><code class="">kubectl get nodes -o json | jq -r '.items[] | select(.status.allocatable."nvidia.com/gpu" != null) | "\(.metadata.name): \(.status.allocatable."nvidia.com/gpu") GPU(s)"'</code></pre>



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



<p class="wp-block-paragraph"><code>vllm-node-<code>yyyyyy</code>: 1 GPU(s)<br>vllm-node-zzzzzz: 1 GPU(s)</code></p>



<p class="wp-block-paragraph">And you can test to run <code><strong><mark class="has-inline-color has-ast-global-color-0-color">nvidia-smi</mark></strong></code>:</p>



<pre class="wp-block-code"><code class="">DRIVER_POD=$(kubectl get pods -n gpu-operator -l app=nvidia-driver-daemonset -o name | head -1)<br>kubectl exec -n gpu-operator $DRIVER_POD -- nvidia-smi</code></pre>



<p class="wp-block-paragraph">If GPU tests are working properly, you can move on DCGM service configuration.</p>



<h4 class="wp-block-heading">3. Configure DCGM service</h4>



<p class="wp-block-paragraph"><strong>Why is DCGM Exporter required?</strong></p>



<p class="wp-block-paragraph">DCGM (Data Centre GPU Manager) is NVIDIA&#8217;s official tool for monitoring GPUs in production. The goal is to be able to collect and display metrics from both GPU nodes.</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="571" src="https://blog.ovhcloud.com/wp-content/uploads/2026/03/data_ia_archi-1-1024x571.jpg" alt="" class="wp-image-30746" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/03/data_ia_archi-1-1024x571.jpg 1024w, https://blog.ovhcloud.com/wp-content/uploads/2026/03/data_ia_archi-1-300x167.jpg 300w, https://blog.ovhcloud.com/wp-content/uploads/2026/03/data_ia_archi-1-768x428.jpg 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/03/data_ia_archi-1-1536x856.jpg 1536w, https://blog.ovhcloud.com/wp-content/uploads/2026/03/data_ia_archi-1.jpg 1733w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption"><em>GPU monitoring with DCGM</em></figcaption></figure>



<p class="wp-block-paragraph">The metrics provided are:</p>



<ul class="wp-block-list">
<li><code><strong><mark class="has-inline-color has-ast-global-color-0-color">DCGM_FI_DEV_GPU_UTIL</mark></strong></code> &#8211; GPU utilisation (%)</li>



<li><strong><code><mark class="has-inline-color has-ast-global-color-0-color">DCGM_FI_DEV_GPU_TEMP</mark></code></strong> &#8211; GPU temperature (°C)</li>



<li><strong><code><mark class="has-inline-color has-ast-global-color-0-color">DCGM_FI_DEV_FB_USED</mark></code></strong> &#8211; VRAM used (MB)</li>



<li><strong><code><mark class="has-inline-color has-ast-global-color-0-color">DCGM_FI_DEV_FB_FREE</mark></code></strong> &#8211; Free VRAM (MB)</li>



<li><strong><code><mark class="has-inline-color has-ast-global-color-0-color">DCGM_FI_DEV_POWER_USAGE</mark></code></strong> &#8211; Power consumption (W)</li>



<li>And 50+ other GPU metrics</li>
</ul>



<p class="wp-block-paragraph">Next, ensure DCGM service has the correct labels and port configuration:</p>



<pre class="wp-block-code"><code class="">kubectl patch svc nvidia-dcgm-exporter -n gpu-operator --type merge -p '{<br>  "metadata": {<br>    "labels": {<br>      "app": "nvidia-dcgm-exporter"<br>    }<br>  },<br>  "spec": {<br>    "ports": [<br>      {<br>        "name": "metrics",<br>        "port": 9400,<br>        "targetPort": 9400,<br>        "protocol": "TCP"<br>      }<br>    ]<br>  }<br>}'</code></pre>



<p class="wp-block-paragraph">Verify the endpoints (should show 2 IPs, one per GPU node).</p>



<pre class="wp-block-code"><code class="">kubectl get endpoints nvidia-dcgm-exporter -n gpu-operator</code></pre>



<p class="wp-block-paragraph"><code>NAME &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ENDPOINTS &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; AGE<br>nvidia-dcgm-exporter &nbsp; x.x.x.x:9400,x.x.x.x:9400 &nbsp; 17d</code></p>



<h3 class="wp-block-heading">Step 3 &#8211; Deploy Qwen3 VL 8B with vLLM inference server</h3>



<p class="wp-block-paragraph">The deployment of the <strong>Qwen 3 VL 8B</strong> model on two L40S GPU nodes is carried out in several stages.</p>



<h4 class="wp-block-heading">1. Create namespace and Hugging Face secret</h4>



<p class="wp-block-paragraph">Start by creating Namespace:</p>



<pre class="wp-block-code"><code class="">kubectl create namespace vllm</code></pre>



<p class="wp-block-paragraph">Next, you must retrieve your Hugging Face token and replace the&nbsp;<code><strong><mark class="has-inline-color has-ast-global-color-0-color">HF_TOKEN</mark></strong></code>&nbsp;value by your own:</p>



<pre class="wp-block-code"><code class="">export HF_TOKEN="hf_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"</code></pre>



<p class="wp-block-paragraph">Create your secret as follow:</p>



<pre class="wp-block-code"><code class="">kubectl create secret generic huggingface-secret \<br>  --from-literal=token=$HF_TOKEN \<br>  --namespace=vllm</code></pre>



<p class="wp-block-paragraph">Verify you obtain the following output by launching:</p>



<pre class="wp-block-code"><code class="">kubectl get secret huggingface-secret -n vllm</code></pre>



<p class="wp-block-paragraph"><code>NAME &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TYPE &nbsp; &nbsp; DATA &nbsp; AGE<br>huggingface-secret &nbsp; Opaque &nbsp; 1&nbsp; &nbsp; &nbsp; 14d</code></p>



<h4 class="wp-block-heading">2. Create vLLM deployment configuration</h4>



<p class="wp-block-paragraph">First, you can create <code><strong><a href="https://github.com/ovh/public-cloud-examples/blob/main/containers-orchestration/managed-kubernetes/gpu-cluster-for-vllm-deployment-and-observability/vllm/vllm-deployment-2nodes.yaml" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">vllm-deployment-2nodes.yaml</a></strong></code> file.</p>



<p class="wp-block-paragraph">Deploy vLLM:</p>



<pre class="wp-block-code"><code class="">kubectl apply -f vllm-deployment-2nodes.yaml</code></pre>



<p class="wp-block-paragraph">You can monitor the deployment (it should take 8-10 minutes for model download and loading).</p>



<pre class="wp-block-code"><code class="">kubectl get pods -n vllm -o wide -w</code></pre>



<p class="wp-block-paragraph">Expected output after 10 minutes:</p>



<pre class="wp-block-code"><code class="">NAME               READY  STATUS   RESTARTS  AGE  IP       NODE  <br>qwen3-vl-xxxx-yyy  1/1    Running  0         1d   X.X.X.X  vllm-node-yyyyyy<br>qwen3-vl-xxxx-zzz  1/1    Running  0         1d   X.X.X.X  vllm-node-zzzzzz</code></pre>



<p class="wp-block-paragraph">You can also check the container logs:</p>



<pre class="wp-block-code"><code class="">kubectl logs -f -n vllm &lt;pod-name&gt;</code></pre>



<p class="wp-block-paragraph">You should find in the logs: &#8220;<code>Uvicorn running on http://0.0.0.0:8000</code>&#8220;</p>



<p class="wp-block-paragraph">Is everything installed correctly? Then let&#8217;s move on to the next step.</p>



<h4 class="wp-block-heading">3. Add service label</h4>



<p class="wp-block-paragraph">Ensure service has the correct label for <strong><code><mark class="has-inline-color has-ast-global-color-0-color">ServiceMonitor</mark></code></strong> discovery.</p>



<pre class="wp-block-code"><code class="">kubectl label svc qwen3-vl-service -n vllm app=qwen3-vl --overwrite</code></pre>



<p class="wp-block-paragraph">You can now verify by launching the following command.</p>



<pre class="wp-block-code"><code class="">kubectl get svc qwen3-vl-service -n vllm --show-labels | grep "app=qwen3-vl"</code></pre>



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



<p class="wp-block-paragraph"><code>qwen3-vl-service&nbsp; ClusterIP&nbsp; X.X.X.X &nbsp;&lt;none&gt;  8000/TCP  1d &nbsp;app=qwen3-vl</code></p>



<h3 class="wp-block-heading">Step 4 &#8211; Install NGINX ingress controller</h3>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><mark style="color:#cf2e2e" class="has-inline-color">⚠️ <strong>Moving beyond Ingress</strong></mark></p>



<p class="wp-block-paragraph"><strong><em><mark style="color:#cf2e2e" class="has-inline-color">Follow this <a href="https://blog.ovhcloud.com/moving-beyond-ingress-why-should-ovhcloud-managed-kubernetes-service-mks-users-start-looking-at-the-gateway-api/" data-wpel-link="internal">tutorial</a> if you want to use Gateway instead of Ingress.</mark></em></strong></p>
</blockquote>



<h4 class="wp-block-heading">1. Add helm repository and configure Ingress</h4>



<p class="wp-block-paragraph">First of all, add helm repository:</p>



<pre class="wp-block-code"><code class="">helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx<br>helm repo update</code></pre>



<p class="wp-block-paragraph">Create configuration file with <code><strong><a href="https://github.com/ovh/public-cloud-examples/blob/main/containers-orchestration/managed-kubernetes/gpu-cluster-for-vllm-deployment-and-observability/ingress/ingress-nginx-values.yaml" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">ingress-nginx-values.yaml</a></strong></code>.</p>



<p class="wp-block-paragraph">Then, install NGINX Ingress:</p>



<pre class="wp-block-code"><code class="">helm install ingress-nginx ingress-nginx/ingress-nginx \<br>  --namespace ingress-nginx \<br>  --create-namespace \<br>  -f ingress-nginx-values.yaml \<br>  --wait</code></pre>



<p class="wp-block-paragraph">Wait for LoadBalancer IP. The external IP assignment should take 1-2 minutes.</p>



<pre class="wp-block-code"><code class="">kubectl get svc -n ingress-nginx ingress-nginx-controller -w</code></pre>



<p class="wp-block-paragraph">Once <code><strong><mark class="has-inline-color has-ast-global-color-0-color">&lt;EXTERNAL-IP&gt;</mark></strong></code> is no longer , Ctrl+C and export it:</p>



<pre class="wp-block-code"><code class="">export EXTERNAL_IP=&lt;EXTERNAL-IP&gt;<br>echo "API URL: http://$EXTERNAL_IP"</code></pre>



<h4 class="wp-block-heading">2. Create vLLM Ingress resource</h4>



<p class="wp-block-paragraph">Next, create vLLM Ingress using <strong><code><a href="https://github.com/ovh/public-cloud-examples/blob/ep-vllm-deployment-observability-mks/containers-orchestration/managed-kubernetes/gpu-cluster-for-vllm-deployment-and-observability/vllm/vllm-ingress.yaml" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">vllm-ingress.yaml</a></code></strong>.</p>



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



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



<p class="wp-block-paragraph">You can now test different API calls to verify that your deployment is functional.</p>



<h4 class="wp-block-heading">3. Test API</h4>



<p class="wp-block-paragraph">Firstly, check if the model is available:</p>



<pre class="wp-block-code"><code class="">curl http://$EXTERNAL_IP/v1/models | jq</code></pre>



<pre class="wp-block-preformatted"><code>{<br>  "object": "list",<br>  "data": [<br>    {<br>      "id": "qwen3-vl-8b",<br>      "object": "model",<br>      "created": 1772472143,<br>      "owned_by": "vllm",<br>      "root": "Qwen/Qwen3-VL-8B-Instruct",<br>      "parent": null,<br>      "max_model_len": 8192,<br>      "permission": [<br>        {<br>          "id": "modelperm-8fb35cdd3208b068",<br>          "object": "model_permission",<br>          "created": 1772472143,<br>          "allow_create_engine": false,<br>          "allow_sampling": true,<br>          "allow_logprobs": true,<br>          "allow_search_indices": false,<br>          "allow_view": true,<br>          "allow_fine_tuning": false,<br>          "organization": "*",<br>          "group": null,<br>          "is_blocking": false<br>        }<br>      ]<br>    }<br>  ]<br>}</code></pre>



<p class="wp-block-paragraph">Next, test inference using the following request:</p>



<pre class="wp-block-code"><code class="">curl http://$EXTERNAL_IP/v1/chat/completions \<br>  -H "Content-Type: application/json" \<br>  -d '{<br>    "model": "qwen3-vl-8b",<br>    "messages": [{"role": "user", "content": "Count from 1 to 10."}],<br>    "max_tokens": 100<br>  }' | jq '.choices[0].message.content'</code></pre>



<p class="wp-block-paragraph"><code>"1, 2, 3, 4, 5, 6, 7, 8, 9, 10"</code></p>



<p class="wp-block-paragraph">Great! You&#8217;re almost there…</p>



<h3 class="wp-block-heading">Step 5 &#8211; Install Prometheus stack</h3>



<p class="wp-block-paragraph">Now, set up the monitoring stack that provides complete observability for&nbsp;<strong>application-level&nbsp;</strong>(vLLM) and&nbsp;<strong>hardware-level</strong>&nbsp;(GPU) metrics:</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="763" src="https://blog.ovhcloud.com/wp-content/uploads/2026/03/monitoring-architecture-1024x763.jpg" alt="" class="wp-image-30871" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/03/monitoring-architecture-1024x763.jpg 1024w, https://blog.ovhcloud.com/wp-content/uploads/2026/03/monitoring-architecture-300x223.jpg 300w, https://blog.ovhcloud.com/wp-content/uploads/2026/03/monitoring-architecture-768x572.jpg 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/03/monitoring-architecture-1536x1144.jpg 1536w, https://blog.ovhcloud.com/wp-content/uploads/2026/03/monitoring-architecture.jpg 1673w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption"><em>Monitoring architecture</em></figcaption></figure>



<h4 class="wp-block-heading">1. Add helm repository and create namespace</h4>



<p class="wp-block-paragraph">Add Prometheus helm repo:</p>



<pre class="wp-block-code"><code class="">helm repo add prometheus-community https://prometheus-community.github.io/helm-charts<br>helm repo update</code></pre>



<p class="wp-block-paragraph">Then, create the <code><strong><mark class="has-inline-color has-ast-global-color-0-color">monitoring</mark></strong></code> Namespace.</p>



<pre class="wp-block-code"><code class="">kubectl create namespace monitoring</code></pre>



<h4 class="wp-block-heading">2. Create Prometheus deployment configuration and installation</h4>



<p class="wp-block-paragraph">First, create <code><strong><a href="https://github.com/ovh/public-cloud-examples/blob/main/containers-orchestration/managed-kubernetes/gpu-cluster-for-vllm-deployment-and-observability/monitoring/prometheus.yaml" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">prometheus.yaml</a></strong></code> file.</p>



<p class="wp-block-paragraph">Install Prometheus stack:</p>



<pre class="wp-block-code"><code class="">helm install prometheus prometheus-community/kube-prometheus-stack \<br>  -n monitoring \<br>  -f prometheus.yaml \<br>  --timeout 10m \<br>  --wait</code></pre>



<p class="wp-block-paragraph">Now,&nbsp;monitor its installation and wait until the pods are ready:</p>



<pre class="wp-block-code"><code class="">kubectl get pods -n monitoring -w</code></pre>



<p class="wp-block-paragraph">If all pods are running successfully, you can proceed to the next step.</p>



<h4 class="wp-block-heading">3. Check that the installation is operational</h4>



<p class="wp-block-paragraph">First access Grafana in background:</p>



<pre class="wp-block-code"><code class="">kubectl port-forward -n monitoring svc/prometheus-grafana 3000:80 &amp;</code></pre>



<p class="wp-block-paragraph">Test Grafana health:</p>



<pre class="wp-block-code"><code class="">curl -s http://localhost:3000/api/health | jq</code></pre>



<pre class="wp-block-preformatted"><code>{<br>  "database": "ok",<br>  "version": "12.3.3",<br>  "commit": "2a14494b2d6ab60f860d8b27603d0ccb264336f6"<br>}</code></pre>



<p class="wp-block-paragraph">You can now access to Grafana locally via <strong><a href="http://localhost:3000" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer"><code>http://localhost:3000</code></a></strong>. You will have to use:</p>



<ul class="wp-block-list">
<li>Login: <code><strong><mark style="color:#cf2e2e" class="has-inline-color">admin</mark></strong></code></li>



<li>Password: <code><strong><mark style="color:#cf2e2e" class="has-inline-color">Admin123!vLLM</mark></strong></code></li>
</ul>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="518" src="https://blog.ovhcloud.com/wp-content/uploads/2026/03/image-2-1024x518.png" alt="" class="wp-image-30804" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/03/image-2-1024x518.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2026/03/image-2-300x152.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2026/03/image-2-768x389.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/03/image-2.png 1322w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Well done! You can now proceed to the configuration step.</p>



<h3 class="wp-block-heading">Step 6 &#8211; Configure ServiceMonitors</h3>



<p class="wp-block-paragraph">The ServiceMonitors is used to tell Prometheus which endpoints to scrape for metrics.</p>



<h4 class="wp-block-heading">1. Create vLLM ServiceMonitor</h4>



<p class="wp-block-paragraph">Retrieve the file from the GitHub repository: <code><strong><a href="https://github.com/ovh/public-cloud-examples/blob/main/containers-orchestration/managed-kubernetes/gpu-cluster-for-vllm-deployment-and-observability/monitoring/vllm-servicemonitor.yaml" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">vllm-servicemonitor.yaml</a></strong></code>.</p>



<p class="wp-block-paragraph">Next, apply and check that the ServiceMonitor <code><strong><mark class="has-inline-color has-ast-global-color-0-color">vllm-metrics</mark></strong></code> exists:</p>



<pre class="wp-block-code"><code class="">kubectl apply -f vllm-servicemonitor.yaml<br>kubectl get servicemonitor -n vllm</code></pre>



<h4 class="wp-block-heading">2. Create DCGM ServiceMonitor</h4>



<p class="wp-block-paragraph">First, create the <code><strong><a href="https://github.com/ovh/public-cloud-examples/blob/main/containers-orchestration/managed-kubernetes/gpu-cluster-for-vllm-deployment-and-observability/monitoring/dcgm-servicemonitor.yaml" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">dcgm-servicemonitor.yaml</a></strong></code> file.</p>



<p class="wp-block-paragraph">Once again, apply and verify:</p>



<pre class="wp-block-code"><code class="">kubectl apply -f dcgm-servicemonitor.yaml<br>kubectl get servicemonitor -n gpu-operator</code></pre>



<pre class="wp-block-preformatted"><code>gpu-operator                  1d<br>nvidia-dcgm-exporter          1d<br>nvidia-node-status-exporter   1d</code></pre>



<h4 class="wp-block-heading">3. Configure Prometheus for Cross-Namespace discovery</h4>



<p class="wp-block-paragraph">Apply a patch to allow Prometheus to discover ServiceMonitors in all namespaces.</p>



<pre class="wp-block-code"><code class="">kubectl patch prometheus prometheus-kube-prometheus-prometheus -n monitoring --type merge -p '{<br>  "spec": {<br>    "serviceMonitorNamespaceSelector": {},<br>    "podMonitorNamespaceSelector": {}<br>  }<br>}'</code></pre>



<p class="wp-block-paragraph">Now you have to restart Prometheus.</p>



<ol class="wp-block-list">
<li>Delete Prometheus pod to force configuration reload</li>



<li>Wait for Prometheus to restart</li>
</ol>



<pre class="wp-block-code"><code class="">kubectl delete pod prometheus-prometheus-kube-prometheus-prometheus-0 -n monitoring<br><br>kubectl wait --for=condition=Ready \<br>  pod/prometheus-prometheus-kube-prometheus-prometheus-0 \<br>  -n monitoring \<br>  --timeout=180s</code></pre>



<p class="wp-block-paragraph">Wait about 2 minutes for discovery and finally, verify targets:</p>



<pre class="wp-block-code"><code class="">kubectl port-forward -n monitoring \<br>  prometheus-prometheus-kube-prometheus-prometheus-0 9090:9090 &amp;</code></pre>



<p class="wp-block-paragraph">You can open in browser: <a href="http://localhost:9090/targets" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer"><code><strong><mark class="has-inline-color has-ast-global-color-0-color">http://localhost:9090/targets</mark></strong></code></a> and search for:</p>



<ul class="wp-block-list">
<li><code><strong><mark class="has-inline-color has-ast-global-color-0-color">vllm</mark></strong></code></li>



<li><strong><code><mark class="has-inline-color has-ast-global-color-0-color">dcgm</mark></code></strong></li>
</ul>



<p class="wp-block-paragraph">Note that the expected targets are: </p>



<ul class="wp-block-list">
<li>serviceMonitor/vllm/vllm-metrics/0   (2/2 UP)</li>



<li>serviceMonitor/gpu-operator/nvidia-dcgm-exporter/0 (2/2 UP)</li>
</ul>



<h3 class="wp-block-heading">Step 7 &#8211; Create Grafana dashboards</h3>



<p class="wp-block-paragraph">In this final step, the goal is to create two Grafana dashboards to track both the software side with vLLM metrics and the hardware metrics that will monitor the GPU consumption and system.</p>



<h4 class="wp-block-heading">1. vLLM application metrics</h4>



<p class="wp-block-paragraph">The dashboard provides insights into vLLM application performance, request handling, and resource utilization based on the following metrics:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Metric</th><th>Type</th><th>Description</th><th>Unit</th><th>Dashboard Usage</th></tr></thead><tbody><tr><td><code>vllm:request_success_total</code></td><td>Counter</td><td>Total successful requests</td><td>count</td><td>Request Rate, Total Requests</td></tr><tr><td><code>vllm:num_requests_running</code></td><td>Gauge</td><td>Requests currently being processed</td><td>count</td><td>Queue Depth, Active Requests</td></tr><tr><td><code>vllm:num_requests_waiting</code></td><td>Gauge</td><td>Requests waiting in queue</td><td>count</td><td>Queue Depth, Queued Requests</td></tr><tr><td><code>vllm:time_to_first_token_seconds</code></td><td>Histogram</td><td>Latency until first token generated</td><td>seconds</td><td>TTFT P50/P95/P99</td></tr><tr><td><code>vllm:e2e_request_latency_seconds</code></td><td>Histogram</td><td>Total end-to-end latency</td><td>seconds</td><td>E2E Latency P50/P95/P99</td></tr><tr><td><code>vllm:generation_tokens_total</code></td><td>Counter</td><td>Total tokens generated (output)</td><td>count</td><td>Token Generation Rate, Throughput</td></tr><tr><td><code>vllm:prompt_tokens_total</code></td><td>Counter</td><td>Total prompt tokens (input)</td><td>count</td><td>Token Generation Rate, Avg Tokens</td></tr><tr><td><code>vllm:kv_cache_usage_perc</code></td><td>Gauge</td><td>GPU KV cache utilization</td><td>0-1 (0-100%)</td><td>KV Cache Usage</td></tr><tr><td><code>vllm:prefix_cache_hits_total</code></td><td>Counter</td><td>Number of prefix cache hits</td><td>count</td><td>Cache Hit Rate</td></tr><tr><td><code>vllm:prefix_cache_queries_total</code></td><td>Counter</td><td>Number of prefix cache queries</td><td>count</td><td>Cache Hit Rate</td></tr><tr><td><code>vllm:request_queue_time_seconds</code></td><td>Histogram</td><td>Time spent waiting in queue</td><td>seconds</td><td>Request Queue Time</td></tr><tr><td><code>vllm:request_prefill_time_seconds</code></td><td>Histogram</td><td>Prefill phase time</td><td>seconds</td><td>Prefill Time</td></tr><tr><td><code>vllm:request_decode_time_seconds</code></td><td>Histogram</td><td>Decode phase time</td><td>seconds</td><td>Decode Time</td></tr><tr><td><code>vllm:inter_token_latency_seconds</code></td><td>Histogram</td><td>Latency between each token</td><td>seconds</td><td>Inter-Token Latency</td></tr><tr><td><code>vllm:num_preemptions_total</code></td><td>Counter</td><td>Number of preemptions (OOM)</td><td>count</td><td>Preemptions</td></tr><tr><td><code>vllm:prompt_tokens_cached_total</code></td><td>Counter</td><td>Prompt tokens cached</td><td>count</td><td>Cached Tokens</td></tr><tr><td><code>vllm:request_prompt_tokens</code></td><td>Histogram</td><td>Prompt size distribution</td><td>count</td><td>(Table)</td></tr><tr><td><code>vllm:request_generation_tokens</code></td><td>Histogram</td><td>Generated tokens distribution</td><td>count</td><td>(Table)</td></tr><tr><td><code>vllm:iteration_tokens_total</code></td><td>Histogram</td><td>Tokens per iteration</td><td>count</td><td>(Advanced analysis)</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">This <strong>vLLM Grafana dashboard</strong> is composed of 23 panels:</p>



<p class="wp-block-paragraph">The dashboard provides insights into LLM application performance, request handling, and resource utilisation based on the previous metrics.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Type</th><th>Nombre</th><th>Panels</th></tr></thead><tbody><tr><td><strong>Timeseries</strong></td><td>12</td><td>Request Rate, Queue Depth, TTFT, E2E Latency, Token Gen, Cache Usage, Cache Hit, Queue Time, Prefill/Decode, Inter-Token, Preemptions, Avg Tokens</td></tr><tr><td><strong>Stat</strong></td><td>10</td><td>Throughput, TTFT P95, Active Req, Queued Req, Cache Hit Rate, Cache Usage, Total Req, Total Tokens, Cached Tokens, Preemptions</td></tr><tr><td><strong>Table</strong></td><td>1</td><td>Pod Performance</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Now create the dashboard using <a href="https://github.com/ovh/public-cloud-examples/blob/ep-vllm-deployment-observability-mks/containers-orchestration/managed-kubernetes/gpu-cluster-for-vllm-deployment-and-observability/grafana-dashboards/vllm-app-dashboard.json" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer"></a><code><strong><a href="https://github.com/ovh/public-cloud-examples/blob/main/containers-orchestration/managed-kubernetes/gpu-cluster-for-vllm-deployment-and-observability/grafana-dashboards/vllm-app-dashboard.json" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">vllm-app-dashboard.json</a></strong></code>. Then, launch:</p>



<pre class="wp-block-code"><code class="">echo "Importing vLLM application dashboard..."<br>curl -X POST \<br>  'http://localhost:3000/api/dashboards/db' \<br>  -H 'Content-Type: application/json' \<br>  -u 'admin:Admin123!vLLM' \<br>  -d @vllm-app-dashboard.json | jq '.status, .url'</code></pre>



<p class="wp-block-paragraph">Next, you an access the vLLM dashboard and follow metrics in real time:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="686" src="https://blog.ovhcloud.com/wp-content/uploads/2026/03/image-3-1024x686.png" alt="" class="wp-image-30858" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/03/image-3-1024x686.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2026/03/image-3-300x201.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2026/03/image-3-768x514.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/03/image-3.png 1230w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">This dashboard is also essential to track hardware consumption for comprehensive monitoring.</p>



<h4 class="wp-block-heading">2. GPU hardware metrics</h4>



<p class="wp-block-paragraph">Take advantage of the most useful DCGM metrics to check both the functioning and consumption of your hardware resources:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Metric</th><th>Type</th><th>Description</th><th>Unit</th><th>Normal Thresholds</th><th>Dashboard Usage</th></tr></thead><tbody><tr><td><code>DCGM_FI_DEV_GPU_UTIL</code></td><td>Gauge</td><td>GPU utilization (compute)</td><td>% (0-100)</td><td>70-95% optimal</td><td>GPU Utilization</td></tr><tr><td><code>DCGM_FI_DEV_GPU_TEMP</code></td><td>Gauge</td><td>GPU temperature</td><td>°C</td><td>&lt; 85°C normal</td><td>GPU Temperature</td></tr><tr><td><code>DCGM_FI_DEV_FB_USED</code></td><td>Gauge</td><td>VRAM used</td><td>MB</td><td>Variable by model</td><td>GPU Memory Used</td></tr><tr><td><code>DCGM_FI_DEV_FB_FREE</code></td><td>Gauge</td><td>VRAM free</td><td>MB</td><td>&gt; 2GB recommended</td><td>GPU Memory Free</td></tr><tr><td><code>DCGM_FI_DEV_POWER_USAGE</code></td><td>Gauge</td><td>Power consumption</td><td>Watts</td><td>&lt; 300W (L40S)</td><td>GPU Power Usage</td></tr><tr><td><code>DCGM_FI_DEV_SM_CLOCK</code></td><td>Gauge</td><td>GPU clock speed (compute)</td><td>MHz</td><td>Variable</td><td>GPU Clock Speed</td></tr><tr><td><code>DCGM_FI_DEV_MEM_CLOCK</code></td><td>Gauge</td><td>Memory clock speed</td><td>MHz</td><td>Variable</td><td>Memory Clock Speed</td></tr><tr><td><code>DCGM_FI_DEV_NVLINK_BANDWIDTH_TOTAL</code></td><td>Counter</td><td>Total NVLink bandwidth</td><td>bytes/s</td><td>(If multi-GPU)</td><td>NVLink Bandwidth</td></tr><tr><td><code>DCGM_FI_DEV_PCIE_TX_BYTES</code></td><td>Counter</td><td>PCIe data transmitted</td><td>bytes</td><td>(I/O monitoring)</td><td>PCIe TX</td></tr><tr><td><code>DCGM_FI_DEV_PCIE_RX_BYTES</code></td><td>Counter</td><td>PCIe data received</td><td>bytes</td><td>(I/O monitoring)</td><td>PCIe RX</td></tr><tr><td><code>DCGM_FI_DEV_ECC_DBE_VOL_TOTAL</code></td><td>Counter</td><td>ECC double-bit errors</td><td>count</td><td>0 ideal</td><td>(Health check)</td></tr><tr><td><code>DCGM_FI_DEV_ECC_SBE_VOL_TOTAL</code></td><td>Counter</td><td>ECC single-bit errors</td><td>count</td><td>&lt; 10/day acceptable</td><td>(Health check)</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">This&nbsp;<strong>hardware Grafana dashboard</strong>&nbsp;is composed of 13 panels with GPU hardware and system metrics. A detailed view is also available GPU util (%), temperature (°C), vRAM (GB) and power (Watt).</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Type</th><th>Count</th><th>Panels</th></tr></thead><tbody><tr><td><strong>Timeseries</strong></td><td>8</td><td>GPU Util, GPU Mem, GPU Temp, GPU Power, CPU Usage, RAM Usage, Network I/O, Disk I/O</td></tr><tr><td><strong>Stat</strong></td><td>4</td><td>Avg GPU Util, Avg GPU Temp, Total GPU Mem, Total GPU Power</td></tr><tr><td><strong>Table</strong></td><td>1</td><td>Hardware Status</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Please refer to <code><strong><a href="https://github.com/ovh/public-cloud-examples/blob/main/containers-orchestration/managed-kubernetes/gpu-cluster-for-vllm-deployment-and-observability/grafana-dashboards/hardware-dashboard.json" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">hardware-dashboard.json</a></strong></code> by loading it as follows:</p>



<pre class="wp-block-code"><code class="">echo "Importing hardware dashboard..."<br>curl -X POST \<br>  'http://localhost:3000/api/dashboards/db' \<br>  -H 'Content-Type: application/json' \<br>  -u 'admin:Admin123!vLLM' \<br>  -d @hardware-dashboard.json | jq '.status, .url'</code></pre>



<p class="wp-block-paragraph">Finally, track resource consumption using this hardware dashboard:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="686" src="https://blog.ovhcloud.com/wp-content/uploads/2026/03/image-4-1024x686.png" alt="" class="wp-image-30859" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/03/image-4-1024x686.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2026/03/image-4-300x201.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2026/03/image-4-768x514.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/03/image-4.png 1230w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Congratulations! Everything is working. You can now test your model and track the various metrics in real time.</p>



<h3 class="wp-block-heading">Step 8 &#8211; LLM testing and performance tracking</h3>



<p class="wp-block-paragraph">Start by installing Python dependencies:</p>



<pre class="wp-block-code"><code class="">pip3 install openai tqdm</code></pre>



<p class="wp-block-paragraph">Replace the <strong><mark class="has-inline-color has-ast-global-color-0-color">&lt;EXTERNAL_IP&gt;</mark></strong> by the vLLM service external IP and launch the performance test thanks to the following <a href="https://github.com/ovh/public-cloud-examples/blob/ep-vllm-deployment-observability-mks/containers-orchestration/managed-kubernetes/gpu-cluster-for-vllm-deployment-and-observability/llm-inference-performance-test.py" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer"><code><strong>Python code</strong></code></a>:</p>



<pre class="wp-block-code"><code class="">import time<br>import threading<br>import random<br>from statistics import mean<br>from openai import OpenAI<br>from tqdm import tqdm<br><br>APP_URL = "http://94.23.185.22/v1"<br>MODEL = "qwen3-vl-8b"<br><br>CONCURRENT_WORKERS = 500          # concurrency<br>REQUESTS_PER_WORKER = 10<br>MAX_TOKENS = 200                  # generation pressure<br><br># some random prompts<br>SHORT_PROMPTS = [<br>    "Summarize the theory of relativity.",<br>    "Explain what a transformer model is.",<br>    "What is Kubernetes autoscaling?"<br>]<br><br>MEDIUM_PROMPTS = [<br>    "Explain how attention mechanisms work in transformer-based models, including self-attention and multi-head attention.",<br>    "Describe how vLLM manages KV cache and why it impacts inference performance."<br>]<br><br>LONG_PROMPTS = [<br>    "Write a very detailed technical explanation of how large language models perform inference, "<br>    "including tokenization, embedding lookup, transformer layers, attention computation, KV cache usage, "<br>    "GPU memory management, and how batching affects latency and throughput. Use examples.",<br>]<br><br>PROMPT_POOL = (<br>    SHORT_PROMPTS * 2 +<br>    MEDIUM_PROMPTS * 4 +<br>    LONG_PROMPTS * 6    # bias toward long prompts<br>)<br><br># openai compliance<br>client = OpenAI(<br>    base_url=APP_URL,<br>    api_key="foo"<br>)<br><br># basic metrics<br>latencies = []<br>errors = 0<br>lock = threading.Lock()<br><br># worker<br>def worker(worker_id):<br>    global errors<br>    for _ in range(REQUESTS_PER_WORKER):<br>        prompt = random.choice(PROMPT_POOL)<br><br>        start = time.time()<br>        try:<br>            client.chat.completions.create(<br>                model=MODEL,<br>                messages=[{"role": "user", "content": prompt}],<br>                max_tokens=MAX_TOKENS,<br>                temperature=0.7,<br>            )<br>            elapsed = time.time() - start<br><br>            with lock:<br>                latencies.append(elapsed)<br><br>        except Exception as e:<br>            with lock:<br>                errors += 1<br><br># run<br>threads = []<br>start_time = time.time()<br><br>print("\n-&gt; STARTING PERFORMANCE TEST:")<br>print(f"Concurrency: {CONCURRENT_WORKERS}")<br>print(f"Total requests: {CONCURRENT_WORKERS * REQUESTS_PER_WORKER}")<br><br>for i in range(CONCURRENT_WORKERS):<br>    t = threading.Thread(target=worker, args=(i,))<br>    t.start()<br>    threads.append(t)<br><br>for t in threads:<br>    t.join()<br><br>total_time = time.time() - start_time<br><br># results<br>print("\n-&gt; BENCH RESULTS:")<br>print(f"Total requests sent: {len(latencies) + errors}")<br>print(f"Successful requests: {len(latencies)}")<br>print(f"Errors: {errors}")<br>print(f"Total wall time: {total_time:.2f}s")<br><br>if latencies:<br>    print(f"Avg latency: {mean(latencies):.2f}s")<br>    print(f"Min latency: {min(latencies):.2f}s")<br>    print(f"Max latency: {max(latencies):.2f}s")<br>    print(f"Throughput: {len(latencies)/total_time:.2f} req/s")</code></pre>



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



<pre class="wp-block-preformatted"><code>-&gt; STARTING PERFORMANCE TEST:</code><br><code>Concurrency: 500<br>Total requests: 5000</code><br><code><br>-&gt; BENCH RESULTS:<br>Total requests sent: 5000<br>Successful requests: 5000<br>Errors: 0<br>Total wall time: 225.54s<br>Avg latency: 21.45s<br>Min latency: 6.06s<br>Max latency: 25.19s<br>Throughput: 22.17 req/s</code></pre>



<p class="wp-block-paragraph">Don&#8217;t forget to track GPU and vLLM metrics in your Grafana dashboards!</p>



<h2 class="wp-block-heading">Conslusion</h2>



<p class="wp-block-paragraph">This reference architecture demonstrates a<strong>&nbsp;vLLM deployment on OVHcloud Managed Kubernetes Service (MKS)</strong>&nbsp;with comprehensive GPU monitoring. Benefits include:</p>



<ul class="wp-block-list">
<li><strong>High Performance</strong>: GPU-accelerated inference with L40S</li>



<li><strong>Scalability</strong>: Kubernetes-native, horizontal scaling-ready</li>



<li><strong>Reliability</strong>: Health checks, auto-restart, monitoring</li>



<li><strong>API Compatibility</strong>: OpenAI-compatible endpoints</li>



<li><strong>Multimodality</strong>: Vision &amp; text capabilities</li>



<li><strong>Full stack monitoring</strong>: Complete vLLM application and hardware dashboards</li>
</ul>



<h2 class="wp-block-heading">Going Further</h2>



<p class="wp-block-paragraph">Your current architecture is&nbsp;<strong>functional.&nbsp;</strong>However, if desired,&nbsp;<strong>it could be improved into a full production-ready&nbsp;solution.</strong></p>



<p class="wp-block-paragraph"><strong>Wish to take production hardening a step further?</strong></p>



<p class="wp-block-paragraph">Go further with the following enhancements:</p>



<ol class="wp-block-list">
<li><strong>Authentication &amp; authorization</strong>
<ul class="wp-block-list">
<li>vLLM API authentication</li>



<li>Grafana authentication</li>



<li>Prometheus security</li>
</ul>
</li>



<li><strong>High availability &amp; load balancing</strong>
<ul class="wp-block-list">
<li>Grafana high availability with multiple replicas and shared storage</li>



<li>Prometheus high availability</li>



<li>vLLM Horizontal Pod Autoscaling (HPA) based on custom metrics</li>
</ul>
</li>



<li><strong>Data persistence &amp; backup</strong>
<ul class="wp-block-list">
<li>Prometheus long-term storage with persistent storage</li>



<li>Grafana Dashboard Backup</li>
</ul>
</li>



<li><strong>Observability enhancements</strong>
<ul class="wp-block-list">
<li>Distributed tracing by adding OpenTelemetry for request tracing</li>



<li>Alerting rules with production-ready alert rules</li>
</ul>
</li>
</ol>



<p class="wp-block-paragraph"></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%2Freference-architecture-deploying-a-vision-language-model-with-vllm-on-ovhcloud-mks-for-high-performance-inference-and-full-observability%2F&amp;action_name=Reference%20Architecture%3A%20Deploying%20a%20vision-language%20model%20with%20vLLM%20on%20OVHcloud%20MKS%20for%20high%20performance%20inference%20and%20full%20observability&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>
