<?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>Kubernetes Archives - OVHcloud Blog</title>
	<atom:link href="https://blog.ovhcloud.com/tag/kubernetes/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.ovhcloud.com/tag/kubernetes/</link>
	<description>Innovation for Freedom</description>
	<lastBuildDate>Tue, 31 Mar 2026 12:40:56 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://blog.ovhcloud.com/wp-content/uploads/2019/07/cropped-cropped-nouveau-logo-ovh-rebranding-32x32.gif</url>
	<title>Kubernetes Archives - OVHcloud Blog</title>
	<link>https://blog.ovhcloud.com/tag/kubernetes/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Reference Architecture: Custom metric autoscaling for LLM inference with vLLM on OVHcloud AI Deploy and observability using MKS</title>
		<link>https://blog.ovhcloud.com/reference-architecture-custom-metric-autoscaling-for-llm-inference-with-vllm-on-ovhcloud-ai-deploy-and-observability-using-mks/</link>
		
		<dc:creator><![CDATA[Eléa Petton]]></dc:creator>
		<pubDate>Tue, 10 Feb 2026 08:51:11 +0000</pubDate>
				<category><![CDATA[OVHcloud Engineering]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[AI Deploy]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[LLM]]></category>
		<category><![CDATA[MKS]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[OVHcloud]]></category>
		<category><![CDATA[prometheus]]></category>
		<category><![CDATA[Public Cloud]]></category>
		<guid isPermaLink="false">https://blog.ovhcloud.com/?p=30203</guid>

					<description><![CDATA[Take your LLM (Large Language Model) deployment to production level with comprehensive custom autoscaling configuration and advanced vLLM metrics observability. This reference architecture describes a comprehensive solution for deploying, autoscaling and monitoring vLLM-based LLM workloads on OVHcloud infrastructure. It combinesAI Deploy, used for model serving with custom metric autoscaling, and Managed Kubernetes Service (MKS), which [&#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-custom-metric-autoscaling-for-llm-inference-with-vllm-on-ovhcloud-ai-deploy-and-observability-using-mks%2F&amp;action_name=Reference%20Architecture%3A%20Custom%20metric%20autoscaling%20for%20LLM%20inference%20with%20vLLM%20on%20OVHcloud%20AI%20Deploy%20and%20observability%20using%20MKS&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><em><strong>Take your LLM (Large Language Model) deployment to production level with comprehensive custom autoscaling configuration and advanced vLLM metrics observability.</strong></em></p>



<figure class="wp-block-image aligncenter size-large"><img fetchpriority="high" decoding="async" width="1024" height="538" src="https://blog.ovhcloud.com/wp-content/uploads/2026/02/3-1024x538.jpg" alt="" class="wp-image-30579" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/02/3-1024x538.jpg 1024w, https://blog.ovhcloud.com/wp-content/uploads/2026/02/3-300x158.jpg 300w, https://blog.ovhcloud.com/wp-content/uploads/2026/02/3-768x403.jpg 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/02/3.jpg 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption"><em>vLLM metrics monitoring and observability based on OVHcloud infrastructure</em></figcaption></figure>



<p>This reference architecture describes a comprehensive solution for <strong>deploying, autoscaling and monitoring vLLM-based LLM workloads</strong> on OVHcloud infrastructure. It combines<strong>AI Deploy</strong>, used for <strong>model serving with custom metric autoscaling</strong>, and <strong>Managed Kubernetes Service (MKS)</strong>, which hosts the monitoring and observability stack.</p>



<p>By leveraging <strong>application-level Prometheus metrics exposed by vLLM</strong>, AI Deploy can automatically scale inference replicas based on real workload demand, ensuring <strong>high availability, consistent performance under load and efficient GPU utilisation</strong>. This autoscaling mechanism allows the platform to react dynamically to traffic spikes while maintaining predictable latency for end users.</p>



<p>On top of this scalable inference layer, the monitoring architecture provides <strong>observability</strong> through <strong>Prometheus</strong>, <strong>Grafana</strong> and Alertmanager. It enables real-time performance monitoring, capacity planning, and operational insights, while ensuring <strong>full data sovereignty</strong> for organisations running Large Language Models (LLMs) in production environments.</p>



<p><strong>What are the key benefits</strong>?</p>



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



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



<li><strong>Sovereign infrastructure</strong>: All metrics and data remain within European datacentres</li>



<li><strong>Production-ready</strong>: Persistent storage, high availability, and automated monitoring</li>
</ul>



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



<h3 class="wp-block-heading">AI Deploy</h3>



<p>OVHcloud AI Deploy is a<strong>&nbsp;Container as a Service</strong>&nbsp;(CaaS) platform designed to help you deploy, manage and scale AI models. It provides a solution that allows you to optimally deploy your applications/APIs based on Machine Learning (ML), Deep Learning (DL) or Large Language Models (LLMs).</p>



<p><strong>Key points to keep in mind</strong>:</p>



<ul class="wp-block-list">
<li><strong>Easy to use:</strong>&nbsp;Bring your own custom Docker image and deploy it in a command line or a few clicks surely</li>



<li><strong>High-performance computing:</strong>&nbsp;A complete range of GPUs available (H100, A100, V100S, L40S and L4)</li>



<li><strong>Scalability and flexibility:</strong>&nbsp;Supports automatic scaling, allowing your model to effectively handle fluctuating workloads</li>



<li><strong>Cost-efficient:</strong>&nbsp;Billing per minute, no surcharges</li>
</ul>



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



<p><strong>OVHcloud MKS</strong> 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><strong>What should you keep in mind?</strong></p>



<ul class="wp-block-list">
<li><strong>Cost-efficient</strong>: Only pay 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, 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>Scalability and flexibility</strong>: Easily scale workloads and node pools to match application demand</li>



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



<p>In the following guide, all services are deployed within the&nbsp;<strong>OVHcloud Public Cloud</strong>.</p>



<h2 class="wp-block-heading">Overview of the architecture</h2>



<p>This reference architecture describes a <strong>complete, secure and scalable solution</strong> to:</p>



<ul class="wp-block-list">
<li>Deploy an LLM with vLLM and <strong>AI Deploy</strong>, benefiting from automatic scaling based on custom metrics to ensure high service availability &#8211; vLLM exposes <code><mark class="has-inline-color has-ast-global-color-0-color"><strong>/metrics</strong></mark></code> via its public HTTPS endpoint on AI Deploy</li>



<li>Collect, store and visualise these vLLM metrics using Prometheus and Grafana on <strong>MKS</strong></li>
</ul>



<figure class="wp-block-image aligncenter size-full"><img decoding="async" width="1200" height="630" src="https://blog.ovhcloud.com/wp-content/uploads/2026/02/1.jpg" alt="" class="wp-image-30578" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/02/1.jpg 1200w, https://blog.ovhcloud.com/wp-content/uploads/2026/02/1-300x158.jpg 300w, https://blog.ovhcloud.com/wp-content/uploads/2026/02/1-1024x538.jpg 1024w, https://blog.ovhcloud.com/wp-content/uploads/2026/02/1-768x403.jpg 768w" sizes="(max-width: 1200px) 100vw, 1200px" /><figcaption class="wp-element-caption"><em>vLLM metrics monitoring and observability architecture overview</em></figcaption></figure>



<p>Here you will find the main components of the architecture. The solution comprises three main layers:</p>



<ol class="wp-block-list">
<li><strong>Model serving layer</strong> with AI Deploy
<ul class="wp-block-list">
<li>vLLM containers running on top of GPUs for LLM inference</li>



<li>vLLM inference server exposing Prometheus metrics</li>



<li>Automatic scaling based on custom metrics to ensure high availability</li>



<li>HTTPS endpoints with Bearer token authentication</li>
</ul>
</li>



<li><strong>Monitoring and observability infrastructure</strong> using Kubernetes
<ul class="wp-block-list">
<li>Prometheus for metrics collection and storage</li>



<li>Grafana for visualisation and dashboards</li>



<li>Persistent volume storage for long-term retention</li>
</ul>
</li>



<li><strong>Network layer</strong>
<ul class="wp-block-list">
<li>Secure HTTPS communication between components</li>



<li>OVHcloud LoadBalancer for external access</li>
</ul>
</li>
</ol>



<p>To go further, some prerequisites must be checked!</p>



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



<p>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"> </a><strong><code><mark class="has-inline-color has-ast-global-color-0-color">Administrator</mark></code></strong> role</li>



<li><strong>ovhai CLI available</strong> &#8211;&nbsp;<em>install the&nbsp;<a href="https://help.ovhcloud.com/csm/en-gb-public-cloud-ai-cli-install-client?id=kb_article_view&amp;sysparm_article=KB0047844" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external">ovhai CLI</a></em></li>



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



<li><code><strong><mark class="has-inline-color has-ast-global-color-0-color">kubectl</mark></strong></code> installed and <code><strong><mark class="has-inline-color has-ast-global-color-0-color">helm</mark></strong></code> installed (at least version 3.x)</li>
</ul>



<p><strong>🚀 Now you have all the ingredients for our recipe, it’s time to deploy the Ministral 14B using AI Deploy and vLLM Docker container!</strong></p>



<h2 class="wp-block-heading">Architecture guide: From autoscaling to observability for LLMs served by vLLM</h2>



<p>Let’s set up and deploy this architecture!</p>



<figure class="wp-block-image aligncenter size-large"><img decoding="async" width="1024" height="538" src="https://blog.ovhcloud.com/wp-content/uploads/2026/02/2-1024x538.jpg" alt="" class="wp-image-30580" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/02/2-1024x538.jpg 1024w, https://blog.ovhcloud.com/wp-content/uploads/2026/02/2-300x158.jpg 300w, https://blog.ovhcloud.com/wp-content/uploads/2026/02/2-768x403.jpg 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/02/2.jpg 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption"><em>Overview of the deployment workflow</em></figcaption></figure>



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



<p><strong><em>In this example, <a href="https://huggingface.co/mistralai/Ministral-3-14B-Instruct-2512" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">mistralai/Ministral-3-14B-Instruct-2512</a> is used. Choose the open-source model of your choice and follow the same steps, adapting the model slug (from Hugging Face), the versions and the GPU(s) flavour.</em></strong></p>
</blockquote>



<p><em>Remember that all of the following steps can be automated using OVHcloud APIs!</em></p>



<h3 class="wp-block-heading">Step 1 &#8211; Manage access tokens</h3>



<p>Before introducing the monitoring stack, this architecture starts with the <strong>deployment of the <strong>Ministral 3 14B</strong> on OVHcloud AI Deploy</strong>, configured to <strong>autoscale based on custom Prometheus metrics exposed by vLLM itself</strong>.</p>



<p>Export your&nbsp;<a href="https://huggingface.co/settings/tokens" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external">Hugging Face token</a>.</p>



<pre class="wp-block-code"><code class="">export MY_HF_TOKEN=hf_xxxxxxxxxxxxxxxxxxxx</code></pre>



<p><a href="https://help.ovhcloud.com/csm/en-gb-public-cloud-ai-cli-app-token?id=kb_article_view&amp;sysparm_article=KB0035280" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external">Create a Bearer token</a>&nbsp;to access your AI Deploy app once it&#8217;s been deployed.</p>



<pre class="wp-block-code"><code class="">ovhai token create --role operator ai_deploy_token=my_operator_token</code></pre>



<p>Returning the following output:</p>



<p><code><strong>Id: 47292486-fb98-4a5b-8451-600895597a2b<br>Created At: 20-01-26 11:53:05<br>Updated At: 20-01-26 11:53:05<br>Spec:<br>Name: ai_deploy_token=my_operator_token<br>Role: AiTrainingOperator<br>Label Selector:<br>Status:<br>Value: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX<br>Version: 1</strong></code></p>



<p>You can now store and export your access token:</p>



<pre class="wp-block-code"><code class="">export MY_OVHAI_ACCESS_TOKEN=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</code></pre>



<h3 class="wp-block-heading">Step 2 &#8211; LLM deployment using AI Deploy</h3>



<p>Before introducing the monitoring stack, this architecture starts with the <strong>deployment of the <strong>Ministral 3 14B</strong> on OVHcloud AI Deploy</strong>, configured to <strong>autoscale based on custom Prometheus metrics exposed by vLLM itself</strong>.</p>



<h4 class="wp-block-heading">1. Define the targeted vLLM metric for autoscaling</h4>



<p>Before proceeding with the deployment of the <strong>Ministral 3 14B</strong> endpoint, you have to choose the metric you want to use as the trigger for scaling.</p>



<p>Instead of relying solely on CPU/RAM utilisation, AI Deploy allows autoscaling decisions to be driven by <strong>application-level signals</strong>.</p>



<p>To do this, you can consult the <a href="https://docs.vllm.ai/en/latest/design/metrics/#v1-metrics" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">metrics exposed by vLLM</a>.</p>



<p>In this example, you can use a basic metric such as <code><mark class="has-inline-color has-ast-global-color-0-color"><strong>vllm:num_requests_running</strong></mark></code> to scale the number of replicas based on <strong>real inference load</strong>.</p>



<p>This enables:</p>



<ul class="wp-block-list">
<li>Faster reaction to traffic spikes</li>



<li>Better GPU utilisation</li>



<li>Reduced inference latency under load</li>



<li>Cost-efficient scaling</li>
</ul>



<p>Finally, the configuration chosen for scaling this application is as follows:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Parameter</th><th>Value</th><th>Description</th></tr></thead><tbody><tr><td>Metric source</td><td><code>/metrics</code></td><td>vLLM Prometheus endpoint</td></tr><tr><td>Metric name</td><td><code>vllm:num_requests_running</code></td><td>Number of in-flight requests</td></tr><tr><td>Aggregation</td><td><code>AVERAGE</code></td><td>Mean across replicas</td></tr><tr><td>Target value</td><td><code>50</code></td><td>Desired load per replica</td></tr><tr><td>Min replicas</td><td><code>1</code></td><td>Baseline capacity</td></tr><tr><td>Max replicas</td><td><code>3</code></td><td>Burst capacity</td></tr></tbody></table></figure>



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



<p><em><strong>You can choose the metric that best suits your use case. You can also apply a patch to your AI Deploy deployment at any time to change the target metric for scaling</strong></em>.</p>
</blockquote>



<p>When the <strong>average number of running requests exceeds 50</strong>, AI Deploy automatically provisions <strong>additional GPU-backed replicas</strong>.</p>



<h4 class="wp-block-heading">2. Deploy Ministral 3 14B using AI Deploy</h4>



<p>Now you can deploy the LLM using the <strong><code>ovhai</code> CLI</strong>.</p>



<p>Key elements necessary for proper functioning:</p>



<ul class="wp-block-list">
<li>GPU-based inference: <strong><code><mark class="has-inline-color has-ast-global-color-0-color">1 x H100</mark></code></strong></li>



<li>vLLM OpenAI-compatible Docker image: <a href="https://hub.docker.com/r/vllm/vllm-openai/tags" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer"><strong><code><mark class="has-inline-color has-ast-global-color-0-color">vllm/vllm-openai:v0.13.0</mark></code></strong></a></li>



<li>Custom autoscaling rules based on Prometheus metrics: <code><strong><mark class="has-inline-color has-ast-global-color-0-color">vllm:num_requests_running</mark></strong></code></li>
</ul>



<p>Below is the reference command used to deploy the <strong><a href="https://huggingface.co/mistralai/Ministral-3-14B-Instruct-2512" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">mistralai/Ministral-3-14B-Instruct-2512</a></strong>:</p>



<pre class="wp-block-code"><code class="">ovhai app run \<br>  --name vllm-ministral-14B-autoscaling-custom-metric \<br>  --default-http-port 8000 \<br>  --label ai_deploy_token=my_operator_token \<br>  --gpu 1 \<br>  --flavor h100-1-gpu \<br>  -e OUTLINES_CACHE_DIR=/tmp/.outlines \<br>  -e HF_TOKEN=$MY_HF_TOKEN \<br>  -e HF_HOME=/hub \<br>  -e HF_DATASETS_TRUST_REMOTE_CODE=1 \<br>  -e HF_HUB_ENABLE_HF_TRANSFER=0 \<br>  -v standalone:/hub:rw \<br>  -v standalone:/workspace:rw \<br>  --liveness-probe-path /health \<br>  --liveness-probe-port 8000 \<br>  --liveness-initial-delay-seconds 300 \<br>  --probe-path /v1/models \<br>  --probe-port 8000 \<br>  --initial-delay-seconds 300 \<br>  --auto-min-replicas 1 \<br>  --auto-max-replicas 3 \<br>  --auto-custom-api-url "http://&lt;SELF&gt;:8000/metrics" \<br>  --auto-custom-metric-format PROMETHEUS \<br>  --auto-custom-value-location vllm:num_requests_running \<br>  --auto-custom-target-value 50 \<br>  --auto-custom-metric-aggregation-type AVERAGE \<br>  vllm/vllm-openai:v0.13.0 \<br>  -- bash -c "python3 -m vllm.entrypoints.openai.api_server \<br>    --model mistralai/Ministral-3-14B-Instruct-2512 \<br>    --tokenizer_mode mistral \<br>    --load_format mistral \<br>    --config_format mistral \<br>    --enable-auto-tool-choice \<br>    --tool-call-parser mistral \<br>    --enable-prefix-caching"</code></pre>



<p>How to understand the different parameters of this command?</p>



<h5 class="wp-block-heading"><strong>a. Start your AI Deploy app</strong></h5>



<p>Launch a new app using&nbsp;<a href="https://help.ovhcloud.com/csm/en-gb-public-cloud-ai-cli-install-client?id=kb_article_view&amp;sysparm_article=KB0047844" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external">ovhai CLI</a>&nbsp;and name it.</p>



<p><code><strong>ovhai app run --name vllm-ministral-14B-autoscaling-custom-metric</strong></code></p>



<h5 class="wp-block-heading"><strong>b. Define access</strong></h5>



<p>Define the HTTP API port and restrict access to your token.</p>



<p><strong><code>--default-http-port 8000</code><br><code>--label ai_deploy_token=my_operator_token</code></strong></p>



<h5 class="wp-block-heading"><strong>c. Configure GPU resources</strong></h5>



<p>Specify the hardware type (<code><strong>h100-1-gpu</strong></code>), which refers to an&nbsp;<strong>NVIDIA H100 GPU</strong>&nbsp;and the number (<strong>1</strong>).</p>



<p><code><strong>--gpu 1<br>--flavor h100-1-gpu</strong></code></p>



<p><strong><mark>⚠️WARNING!</mark></strong>&nbsp;For this model, one H100 is sufficient, but if you want to deploy another model, you will need to check which GPU you need. Note that you can also access L40S and A100 GPUs for your LLM deployment.</p>



<h5 class="wp-block-heading"><strong>d. Set up environment variables</strong></h5>



<p>Configure caching for the&nbsp;<strong>Outlines library</strong>&nbsp;(used for efficient text generation):</p>



<p><code><strong>-e OUTLINES_CACHE_DIR=/tmp/.outlines</strong></code></p>



<p>Pass the&nbsp;<strong>Hugging Face token</strong>&nbsp;(<code>$MY_HF_TOKEN</code>) for model authentication and download:</p>



<p><code><strong>-e HF_TOKEN=$MY_HF_TOKEN</strong></code></p>



<p>Set the&nbsp;<strong>Hugging Face cache directory</strong>&nbsp;to&nbsp;<code>/hub</code>&nbsp;(where models will be stored):</p>



<p><code><strong>-e HF_HOME=/hub</strong></code></p>



<p>Allow execution of&nbsp;<strong>custom remote code</strong>&nbsp;from Hugging Face datasets (required for some model behaviours):</p>



<p><code><strong>-e HF_DATASETS_TRUST_REMOTE_CODE=1</strong></code></p>



<p>Disable&nbsp;<strong>Hugging Face Hub transfer acceleration</strong>&nbsp;(to use standard model downloading):</p>



<p><code><strong>-e HF_HUB_ENABLE_HF_TRANSFER=0</strong></code></p>



<h5 class="wp-block-heading"><strong>e. Mount persistent volumes</strong></h5>



<p>Mount&nbsp;<strong>two persistent storage volumes</strong>:</p>



<ol class="wp-block-list">
<li><code>/hub</code>&nbsp;→ Stores Hugging Face model files</li>



<li><code>/workspace</code>&nbsp;→ Main working directory</li>
</ol>



<p>The&nbsp;<code>rw</code>&nbsp;flag means&nbsp;<strong>read-write access</strong>.</p>



<p><code><strong>-v standalone:/hub:rw<br>-v standalone:/workspace:rw</strong></code></p>



<h5 class="wp-block-heading"><strong>f. Health checks and readiness</strong></h5>



<p>Configure <strong>liveness and readiness probes</strong>:</p>



<ol class="wp-block-list">
<li><code>/health</code> verifies the container is alive</li>



<li><code>/v1/models</code> confirms the model is loaded and ready to serve requests</li>
</ol>



<p>The long initial delays (300 seconds) can be reduced; they correspond to the startup time of vLLM and the loading of the model on the GPU.</p>



<p><code><strong>--liveness-probe-path /health<br>--liveness-probe-port 8000<br>--liveness-initial-delay-seconds 300<br><br>--probe-path /v1/models<br>--probe-port 8000<br>--initial-delay-seconds 300</strong></code></p>



<h5 class="wp-block-heading"><strong>g. Autoscaling configuration (custom metrics)</strong></h5>



<p>First set the minimum and maximum number of replicas.</p>



<p><strong><code>--auto-min-replicas 1<br>--auto-max-replicas 3</code></strong></p>



<p>This guarantees basic availability (one replica always up) while allowing for peak capacity.</p>



<p>Then enable autoscaling based on application-level metrics exposed by vLLM.</p>



<p><strong><code>--auto-custom-api-url "http://&lt;SELF&gt;:8000/metrics"<br>--auto-custom-metric-format PROMETHEUS<br>--auto-custom-value-location vllm:num_requests_running<br>--auto-custom-target-value 50<br>--auto-custom-metric-aggregation-type AVERAGE</code></strong></p>



<p>AI Deploy:</p>



<ul class="wp-block-list">
<li>Scrapes the local <mark class="has-inline-color has-ast-global-color-0-color"><strong><code>/metrics</code></strong></mark> endpoint</li>



<li>Parses Prometheus-formatted metrics</li>



<li>Extracts the <strong><mark class="has-inline-color has-ast-global-color-0-color"><code>vllm:num_requests_running</code></mark></strong> gauge</li>



<li>Computes the average value across replicas</li>
</ul>



<p>Scaling behaviour:</p>



<ul class="wp-block-list">
<li>When the average number of in-flight requests exceeds <strong><code><mark class="has-inline-color has-ast-global-color-0-color">50</mark></code></strong>, AI Deploy adds replicas</li>



<li>When load decreases, replicas are scaled down</li>
</ul>



<p>This approach ensures high availability and predictable latency under fluctuating traffic.</p>



<h5 class="wp-block-heading"><strong>h. Choose the target Docker image and the startup command</strong></h5>



<p>Use the official <strong><a href="https://hub.docker.com/r/vllm/vllm-openai/tags" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">vLLM OpenAI-compatible Docker image</a></strong>.</p>



<p><strong><code>vllm/vllm-openai:v0.13.0</code></strong></p>



<p>Finally, run the model inside the container using a Python command to launch the vLLM API server:</p>



<ul class="wp-block-list">
<li><strong><code>python3 -m vllm.entrypoints.openai.api_server</code></strong>&nbsp;→ Starts the OpenAI-compatible vLLM API server</li>



<li><strong><code>--model mistralai/Ministral-3-14B-Instruct-2512</code></strong>&nbsp;→ Loads the&nbsp;<strong>Ministral 3 14B</strong>&nbsp;model from Hugging Face</li>



<li><strong><code>--tokenizer_mode mistral</code></strong>&nbsp;→ Uses the&nbsp;<strong>Mistral tokenizer</strong></li>



<li><strong><code>--load_format mistral</code></strong>&nbsp;→ Uses Mistral’s model loading format</li>



<li><strong><code>--config_format mistral</code></strong>&nbsp;→ Ensures the model configuration follows Mistral’s standard</li>



<li><code><strong>--enable-auto-tool-choice </strong></code>→ Automatic call of tools if necessary (function/tool call)</li>



<li><strong><code>--tool-call-parser mistral </code></strong>→ Tool calling support</li>



<li><strong><code>--enable-prefix-caching</code></strong> → Prefix caching for improved throughput and reduced latency</li>
</ul>



<p>You can now launch this command using <strong>ovhai CLI</strong>.</p>



<h4 class="wp-block-heading">3. Check AI Deploy app status</h4>



<p>You can now check if your&nbsp;<strong>AI Deploy</strong>&nbsp;app is alive:</p>



<pre class="wp-block-code"><code class="">ovhai app get &lt;your_vllm_app_id&gt;</code></pre>



<p><strong>Is your app in&nbsp;<code>RUNNING</code>&nbsp;status?</strong>&nbsp;Perfect! You can check in the logs that the server is started:</p>



<pre class="wp-block-code"><code class="">ovhai app logs &lt;your_vllm_app_id&gt;</code></pre>



<p><strong><mark>⚠️WARNING!</mark></strong>&nbsp;This step may take a little time as the LLM must be loaded.</p>



<h4 class="wp-block-heading">4. Test that the deployment is functional</h4>



<p>First you can request and send a prompt to the LLM. Launch the following query by asking the question of your choice:</p>



<pre class="wp-block-code"><code class="">curl https://&lt;your_vllm_app_id&gt;.app.gra.ai.cloud.ovh.net/v1/chat/completions \<br>  -H "Authorization: Bearer $MY_OVHAI_ACCESS_TOKEN" \<br>  -H "Content-Type: application/json" \<br>  -d '{<br>    "model": "mistralai/Ministral-3-14B-Instruct-2512",<br>    "messages": [<br>      {"role": "system", "content": "You are a helpful assistant."},<br>      {"role": "user", "content": "Give me the name of OVHcloud’s founder."}<br>    ],<br>    "stream": false<br>  }'</code></pre>



<p>You can also verify access to vLLM metrics.</p>



<pre class="wp-block-code"><code class="">curl -H "Authorization: Bearer $MY_OVHAI_ACCESS_TOKEN" \<br>  https://&lt;your_vllm_app_id&gt;.app.gra.ai.cloud.ovh.net/metrics</code></pre>



<p>If both tests show that the model deployment is functional and you receive 200 HTTP responses, you are ready to move on to the next step!</p>



<p>The next step is to set up the observability and monitoring stack. This autoscaling mechanism is <strong>fully independent</strong> from Prometheus used for observability:</p>



<ul class="wp-block-list">
<li>AI Deploy queries the local <strong><mark class="has-inline-color has-ast-global-color-0-color"><code>/metrics</code></mark></strong> endpoint internally</li>



<li>Prometheus scrapes the <strong>same metrics endpoint</strong> externally for monitoring, dashboards and potentially alerting</li>
</ul>



<p>This ensures:</p>



<ul class="wp-block-list">
<li>A single source of truth for metrics</li>



<li>No duplication of exporters</li>



<li>Consistent signals for scaling and observability</li>
</ul>



<h3 class="wp-block-heading">Step 3 &#8211; Create an MKS cluster</h3>



<p>From <a href="https://manager.eu.ovhcloud.com/#/hub/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">OVHcloud Control Panel</a>, create a Kubernetes cluster using the <strong>MKS</strong>.</p>



<p>Consider using the following configuration for the current use case:</p>



<ul class="wp-block-list">
<li><strong>Location</strong>: GRA ( Gravelines) &#8211; <em>you can select the same region as for AI Deploy</em></li>



<li><strong>Network</strong>: Public</li>



<li><strong>Node pool</strong> :
<ul class="wp-block-list">
<li>Flavour : <code><strong><mark class="has-inline-color has-ast-global-color-0-color">b2-15</mark></strong></code> (or something similar)</li>



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



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



<li><strong>Name your node pool:</strong> <strong><mark class="has-inline-color has-ast-global-color-0-color"><code>monitoring</code></mark></strong></li>
</ul>



<p>You should see your cluster (e.g. <code><mark class="has-inline-color has-ast-global-color-0-color"><strong>prometheus-vllm-metrics-ai-deploy</strong></mark></code>) in the list, along with the following information:</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="632" src="https://blog.ovhcloud.com/wp-content/uploads/2026/01/image-3-1024x632.png" alt="" class="wp-image-30242" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/01/image-3-1024x632.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2026/01/image-3-300x185.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2026/01/image-3-768x474.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/01/image-3-1536x948.png 1536w, https://blog.ovhcloud.com/wp-content/uploads/2026/01/image-3-2048x1264.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>If the status is green with the <strong><mark style="color:#00d084" class="has-inline-color"><code>OK</code></mark></strong> label, you can proceed to the next step.</p>



<h3 class="wp-block-heading">Step 4 &#8211; Configure Kubernetes access</h3>



<p>Download your <strong>kubeconfig file</strong> from the OVHcloud Control Panel and configure <strong><code><mark class="has-inline-color has-ast-global-color-0-color">kubectl</mark></code></strong>:</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>Now,- you can create the <strong><mark class="has-inline-color has-ast-global-color-0-color"><code>values-prometheus.yaml</code></mark></strong> file:</p>



<pre class="wp-block-code"><code class=""># general configuration<br>nameOverride: "monitoring"<br>fullnameOverride: "monitoring"<br><br># Prometheus configuration<br>prometheus:<br>  prometheusSpec:<br>    # data retention (15d)<br>    retention: 15d<br>    <br>    # scrape interval (15s)<br>    scrapeInterval: 15s<br>    <br>    # persistent storage (required for production deployment)<br>    storageSpec:<br>      volumeClaimTemplate:<br>        spec:<br>          storageClassName: csi-cinder-high-speed  # OVHcloud storage<br>          accessModes: ["ReadWriteOnce"]<br>          resources:<br>            requests:<br>              storage: 50Gi  # (can be modified according to your needs)<br>    <br>    # scrape vLLM metrics from your AI Deploy instance (Ministral 3 14B)<br>    additionalScrapeConfigs:<br>      - job_name: 'vllm-ministral'<br>        scheme: https<br>        metrics_path: '/metrics'<br>        scrape_interval: 15s<br>        scrape_timeout: 10s<br>        <br>        # authentication using AI Deploy Bearer token stored Kubernetes Secret<br>        bearer_token_file: /etc/prometheus/secrets/vllm-auth-token/token<br>        static_configs:<br>          - targets:<br>              - '&lt;APP_ID&gt;.app.gra.ai.cloud.ovh.net'  # /!\ REPLACE THE &lt;APP_ID&gt; by yours /!\<br>            labels:<br>              service: 'vllm'<br>              model: 'ministral'<br>              environment: 'production'<br>        <br>        # TLS configuration<br>        tls_config:<br>          insecure_skip_verify: false<br>    <br>    # kube-prometheus-stack mounts the secret under /etc/prometheus/secrets/ and makes it accessible to Prometheus<br>    secrets:<br>      - vllm-auth-token<br><br># Grafana configuration (visualization layer)<br>grafana:<br>  enabled: true<br>  <br>  # disable automatic datasource provisioning<br>  sidecar:<br>    datasources:<br>      enabled: false<br>  <br>  # persistent dashboards<br>  persistence:<br>    enabled: true<br>    storageClassName: csi-cinder-high-speed<br>    size: 10Gi<br>  <br>  # /!\ DEFINE ADMIN PASSWORD - REPLACE "test" BY YOURS /!\<br>  adminPassword: "test"<br>  <br>  # access via OVHcloud LoadBalancer (public IP and managed LB)<br>  service:<br>    type: LoadBalancer<br>    port: 80<br>    annotations:<br>      # optional : limiter l'accès à certaines IPs<br>      # service.beta.kubernetes.io/ovh-loadbalancer-allowed-sources: "1.2.3.4/32"<br>  <br># alertmanager (optional but recommended for production)<br>alertmanager:<br>  enabled: true<br>  <br>  alertmanagerSpec:<br>    storage:<br>      volumeClaimTemplate:<br>        spec:<br>          storageClassName: csi-cinder-high-speed<br>          accessModes: ["ReadWriteOnce"]<br>          resources:<br>            requests:<br>              storage: 10Gi<br><br># cluster observability components<br>nodeExporter:<br>  enabled: true<br>  <br>kubeStateMetrics:<br>  enabled: true</code></pre>



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



<p><strong><em>On OVHcloud MKS, persistent storage is handled automatically through the Cinder CSI driver. When a PersistentVolumeClaim (PVC) references a supported <code>storageClassName</code> such as <code>csi-cinder-high-speed</code>, OVHcloud dynamically provisions the underlying Block Storage volume and attaches it to the node running the pod. This enables stateful components like Prometheus, Alertmanager and Grafana to persist data reliably without any manual volume management, making the architecture fully cloud-native and operationally simple.</em></strong></p>
</blockquote>



<p>Then create the <strong><code><mark class="has-inline-color has-ast-global-color-0-color">monitoring</mark></code></strong> namespace:</p>



<pre class="wp-block-code"><code class=""># create namespace<br>kubectl create namespace monitoring<br><br># verify creation<br>kubectl get namespaces | grep monitoring</code></pre>



<p>Finally,  configure the Bearer token secret to access vLLM metrics.</p>



<pre class="wp-block-code"><code class=""># create bearer token secret<br>kubectl create secret generic vllm-auth-token \<br>  --from-literal=token='"$MY_OVHAI_ACCESS_TOKEN"' \<br>  -n monitoring<br><br># verify secret creation<br>kubectl get secret vllm-auth-token -n monitoring<br><br># test token (optional)<br>kubectl get secret vllm-auth-token -n monitoring \<br>  -o jsonpath='{.data.token}' | base64 -d </code></pre>



<p>Right, if everything is working, let&#8217;s move on to deployment.</p>



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



<p>Add the Prometheus Helm repository and install the monitoring stack. The deployment creates:</p>



<ul class="wp-block-list">
<li>Prometheus StatefulSet with persistent storage</li>



<li>Grafana deployment with LoadBalancer access</li>



<li>Alertmanager for future alert configuration (optional)</li>



<li>Supporting components (node exporters, kube-state-metrics)</li>
</ul>



<pre class="wp-block-code"><code class=""># add Helm repository<br>helm repo add prometheus-community \<br>  https://prometheus-community.github.io/helm-charts<br>helm repo update<br><br># install monitoring stack<br>helm install monitoring prometheus-community/kube-prometheus-stack \<br>  --namespace monitoring \<br>  --values values-prometheus.yaml \<br>  --wait</code></pre>



<p>Then you can retrieve the LoadBalancer IP address to access Grafana:</p>



<pre class="wp-block-code"><code class="">kubectl get svc -n monitoring monitoring-grafana</code></pre>



<p>Finally, open your browser to <code><strong><mark class="has-inline-color has-ast-global-color-0-color">http://&lt;EXTERNAL-IP&gt;</mark></strong></code> and login with:</p>



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



<li><strong>Password</strong>: as configured in your <code><strong><mark class="has-inline-color has-ast-global-color-0-color">values-prometheus.yaml</mark></strong></code> file</li>
</ul>



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



<p>In this step, you will be able to access Grafana interface and add your Prometheus as a new data source, then create a complete dashboard with different vLLM metrics.</p>



<h4 class="wp-block-heading">1. Add a new data source in Grafana</h4>



<p>First of all, create a new Prometheus connection inside Grafana:</p>



<ul class="wp-block-list">
<li>Navigate to <strong><mark class="has-inline-color has-ast-global-color-0-color"><code>Connections</code></mark></strong> → <strong><mark class="has-inline-color has-ast-global-color-0-color"><code>Data sources</code></mark></strong> → <strong><code><mark class="has-inline-color has-ast-global-color-0-color">Add data source</mark></code></strong></li>



<li>Select <strong>Prometheus</strong></li>



<li>Configure URL: <code><strong><mark class="has-inline-color has-ast-global-color-0-color">http://monitoring-prometheus:9090</mark></strong></code></li>



<li>Click <strong>Save &amp; test</strong></li>
</ul>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="609" src="https://blog.ovhcloud.com/wp-content/uploads/2026/01/image-4-1024x609.png" alt="" class="wp-image-30247" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/01/image-4-1024x609.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2026/01/image-4-300x178.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2026/01/image-4-768x457.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/01/image-4-1536x913.png 1536w, https://blog.ovhcloud.com/wp-content/uploads/2026/01/image-4-2048x1218.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Now that your Prometheus has been configured as a new data source, you can create your Grafana dashboard.</p>



<h4 class="wp-block-heading">2. Create your monitoring dashboard</h4>



<p>To begin with, you can use the following pre-configured Grafana dashboard by downloading this JSON file locally:</p>





<p>In the left-hand menu, select <strong><code><mark class="has-inline-color has-ast-global-color-0-color">Dashboard</mark></code></strong>:</p>



<ol class="wp-block-list">
<li>Navigate to <strong><code><mark class="has-inline-color has-ast-global-color-0-color">Dashboards</mark></code></strong> → <strong><code><mark class="has-inline-color has-ast-global-color-0-color">Import</mark></code></strong></li>



<li>Upload the provided dashboard JSON</li>



<li>Select <strong>Prometheus</strong> as datasource</li>



<li>Click <strong>Import</strong> and select the <strong><code><mark class="has-inline-color has-ast-global-color-0-color">vLLM-metrics-grafana-monitoring.json</mark></code></strong> file</li>
</ol>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="449" src="https://blog.ovhcloud.com/wp-content/uploads/2026/01/image-6-1024x449.png" alt="" class="wp-image-30250" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/01/image-6-1024x449.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2026/01/image-6-300x131.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2026/01/image-6-768x337.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/01/image-6-1536x673.png 1536w, https://blog.ovhcloud.com/wp-content/uploads/2026/01/image-6-2048x897.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>The dashboard provides real-time visibility for <strong>Ministral 3 14B</strong> deployed with vLLM container and OVHcloud AI Deploy.</p>



<p>You can now track:</p>



<ul class="wp-block-list">
<li><strong>Performance metrics</strong>: TTFT, inter-token latency, end-to-end latency</li>



<li><strong>Throughput indicators</strong>: Requests per second, token generation rates</li>



<li><strong>Resource utilisation</strong>: KV cache usage, active/waiting requests</li>



<li><strong>Capacity indicators</strong>: Queue depth, preemption rates</li>
</ul>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="540" src="https://blog.ovhcloud.com/wp-content/uploads/2026/01/image-7-1024x540.png" alt="" class="wp-image-30253" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/01/image-7-1024x540.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2026/01/image-7-300x158.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2026/01/image-7-768x405.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/01/image-7-1536x811.png 1536w, https://blog.ovhcloud.com/wp-content/uploads/2026/01/image-7-2048x1081.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Here are the key metrics tracked and displayed in the Grafana dashboard:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Metric Category</th><th>Prometheus Metric</th><th>Description</th><th>Use case</th></tr></thead><tbody><tr><td><strong>Latency</strong></td><td><code>vllm:time_to_first_token_seconds</code></td><td>Time until first token generation</td><td>User experience monitoring</td></tr><tr><td><strong>Latency</strong></td><td><code>vllm:inter_token_latency_seconds</code></td><td>Time between tokens</td><td>Throughput optimisation</td></tr><tr><td><strong>Latency</strong></td><td><code>vllm:e2e_request_latency_seconds</code></td><td>End-to-end request time</td><td>SLA monitoring</td></tr><tr><td><strong>Throughput</strong></td><td><code>vllm:request_success_total</code></td><td>Successful requests counter</td><td>Capacity planning</td></tr><tr><td><strong>Resource</strong></td><td><code>vllm:kv_cache_usage_perc</code></td><td>KV cache memory usage</td><td>Memory management</td></tr><tr><td><strong>Queue</strong></td><td><code>vllm:num_requests_running</code></td><td>Active requests</td><td>Load monitoring</td></tr><tr><td><strong>Queue</strong></td><td><code>vllm:num_requests_waiting</code></td><td>Queued requests</td><td>Overload detection</td></tr><tr><td><strong>Capacity</strong></td><td><code>vllm:num_preemptions_total</code></td><td>Request preemptions</td><td>Peak load indicator</td></tr><tr><td><strong>Tokens</strong></td><td><code>vllm:prompt_tokens_total</code></td><td>Input tokens processed</td><td>Usage analytics</td></tr><tr><td><strong>Tokens</strong></td><td><code>vllm:generation_tokens_total</code></td><td>Output tokens generated</td><td>Cost tracking</td></tr></tbody></table></figure>



<p>Well done, you now have at your disposal:</p>



<ul class="wp-block-list">
<li>An endpoint of the Ministral 3 14B model deployed with vLLM thanks to <strong>OVHcloud AI Deploy</strong> and its autoscaling strategies based on custom metrics</li>



<li>Prometheus for metrics collection and Grafana for visualisation/dashboards thanks to <strong>OVHcloud MKS</strong></li>
</ul>



<p><strong>But how can you check that everything will work when the load increases?</strong></p>



<h3 class="wp-block-heading">Step 7 &#8211; Test autoscaling and real-time visualisation</h3>



<p>The first objective here is to force AI Deploy to:</p>



<ul class="wp-block-list">
<li>Increase <code>vllm:num_requests_running</code></li>



<li>&#8216;Saturate&#8217; a single replica</li>



<li>Trigger the <strong>scale up</strong></li>



<li>Observe replica increase + latency drop</li>
</ul>



<h4 class="wp-block-heading">1. Autoscaling testing strategy</h4>



<p>The goal is to combine:</p>



<ul class="wp-block-list">
<li><strong>High concurrency</strong></li>



<li><strong>Long prompts</strong> (KVcache heavy)</li>



<li><strong>Long generations</strong></li>



<li><strong>Bursty load</strong></li>
</ul>



<p>This is what vLLM autoscaling actually reacts to.</p>



<p>To do so, a Python code can simulate the expected behaviour:</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 = "https://&lt;APP_ID&gt;.app.gra.ai.cloud.ovh.net/v1" # /!\ REPLACE THE &lt;APP_ID&gt; by yours /!\<br>MODEL = "mistralai/Ministral-3-14B-Instruct-2512"<br>API_KEY = $MY_OVHAI_ACCESS_TOKEN<br><br>CONCURRENT_WORKERS = 500          # concurrency (main scaling trigger)<br>REQUESTS_PER_WORKER = 25<br>MAX_TOKENS = 768                  # 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=API_KEY,<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("Starting autoscaling stress 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=== AUTOSCALING 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><strong>How can you verify that autoscaling is working and that the load is being handled correctly without latency skyrocketing?</strong></p>



<h4 class="wp-block-heading">2. Hardware and platform-level monitoring</h4>



<p>First, <strong>AI Deploy Grafana</strong> answers <strong>&#8216;What resources are being used and how many replicas exist?</strong>&#8216;.</p>



<p>GPU utilisation, GPU memory, CPU, RAM and replica count are monitored through <strong>OVHcloud AI Deploy Grafana</strong> (monitoring URL), which exposes infrastructure and runtime metrics for the AI Deploy application. This layer provides visibility into <strong>resource saturation and scaling events</strong> managed by the AI Deploy platform itself.</p>



<p>Access it using the following URL (do not forget to replace <code><mark class="has-inline-color has-ast-global-color-0-color"><strong>&lt;APP_ID&gt;</strong></mark></code> by yours): <strong><code>https://monitoring.gra.ai.cloud.ovh.net/d/app/app-monitoring?var-app=</code><mark class="has-inline-color has-ast-global-color-0-color"><code>&lt;APP_ID&gt;</code></mark><code>&amp;orgId=1</code></strong></p>



<p>For example, check GPU/RAM metrics:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="540" src="https://blog.ovhcloud.com/wp-content/uploads/2026/01/image-8-1024x540.png" alt="" class="wp-image-30260" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/01/image-8-1024x540.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2026/01/image-8-300x158.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2026/01/image-8-768x405.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/01/image-8-1536x811.png 1536w, https://blog.ovhcloud.com/wp-content/uploads/2026/01/image-8-2048x1081.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>You can also monitor scale ups and downs in real time, as well as information on HTTP calls and much more!</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="540" src="https://blog.ovhcloud.com/wp-content/uploads/2026/01/image-9-1024x540.png" alt="" class="wp-image-30261" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/01/image-9-1024x540.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2026/01/image-9-300x158.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2026/01/image-9-768x405.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/01/image-9-1536x811.png 1536w, https://blog.ovhcloud.com/wp-content/uploads/2026/01/image-9-2048x1081.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h4 class="wp-block-heading">3. Software and application-level monitoring</h4>



<p>Next the combination of MKS + Prometheus + Grafana answers <strong>&#8216;How the inference engine behaves internally&#8217;</strong>.</p>



<p>In fact, vLLM internal metrics (request concurrency, token throughput, latency indicators, KV cache pressure, etc.) are collected via the <strong>vLLM <code>/metrics</code> endpoint</strong> and scraped by <strong>Prometheus running on OVHcloud MKS</strong>, then visualised in a <strong>dedicated Grafana instance</strong>. This layer focuses on <strong>model behaviour and inference performance</strong>.</p>



<p>Find all these metrics via (just replace <strong><code><mark class="has-inline-color has-ast-global-color-0-color">&lt;EXTERNAL-IP&gt;</mark></code></strong>): <strong><code>http://<mark class="has-inline-color has-ast-global-color-0-color">&lt;EXTERNAL-IP&gt;</mark>/d/vllm-ministral-monitoring/ministral-14b-vllm-metrics-monitoring?orgId=1</code></strong></p>



<p>Find key metrics such as TTF, etc:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="540" src="https://blog.ovhcloud.com/wp-content/uploads/2026/01/image-10-1024x540.png" alt="" class="wp-image-30263" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/01/image-10-1024x540.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2026/01/image-10-300x158.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2026/01/image-10-768x405.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/01/image-10-1536x811.png 1536w, https://blog.ovhcloud.com/wp-content/uploads/2026/01/image-10-2048x1081.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>You can also find some information about <strong>&#8216;Model load and throughput&#8217;</strong>:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="540" src="https://blog.ovhcloud.com/wp-content/uploads/2026/01/image-11-1024x540.png" alt="" class="wp-image-30264" srcset="https://blog.ovhcloud.com/wp-content/uploads/2026/01/image-11-1024x540.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2026/01/image-11-300x158.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2026/01/image-11-768x405.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2026/01/image-11-1536x811.png 1536w, https://blog.ovhcloud.com/wp-content/uploads/2026/01/image-11-2048x1081.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>To go further and add even more metrics, you can refer to the vLLM documentation on &#8216;<a href="https://docs.vllm.ai/en/v0.7.2/getting_started/examples/prometheus_grafana.html" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Prometheus and Grafana</a>&#8216;.</p>



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



<p>This reference architecture provides a scalable, and production-ready approach for deploying LLM inference on OVHcloud using <strong>AI Deploy</strong> and the <a href="https://help.ovhcloud.com/csm/en-gb-public-cloud-ai-deploy-apps-deployments?id=kb_article_view&amp;sysparm_article=KB0047997#advanced-custom-metrics-for-autoscaling" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">autoscaling on custom metric feature</a>.</p>



<p>OVHcloud <strong>MKS</strong> is dedicated to running Prometheus and Grafana, enabling secure scraping and visualisation of <strong>vLLM internal metrics</strong> exposed via the <strong><mark class="has-inline-color has-ast-global-color-0-color"><code>/metrics</code> </mark></strong>endpoint.</p>



<p>By scraping vLLM metrics securely from AI Deploy into Prometheus and exposing them through Grafana, the architecture provides full visibility into model behaviour, performance and load, enabling informed scaling analysis, troubleshooting and capacity planning in production environments.</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-custom-metric-autoscaling-for-llm-inference-with-vllm-on-ovhcloud-ai-deploy-and-observability-using-mks%2F&amp;action_name=Reference%20Architecture%3A%20Custom%20metric%20autoscaling%20for%20LLM%20inference%20with%20vLLM%20on%20OVHcloud%20AI%20Deploy%20and%20observability%20using%20MKS&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>Moving Beyond Ingress: Why should OVHcloud Managed Kubernetes Service (MKS) users start looking at the Gateway API?</title>
		<link>https://blog.ovhcloud.com/moving-beyond-ingress-why-should-ovhcloud-managed-kubernetes-service-mks-users-start-looking-at-the-gateway-api/</link>
		
		<dc:creator><![CDATA[Aurélie Vache&nbsp;and&nbsp;Antonin Anchisi]]></dc:creator>
		<pubDate>Mon, 15 Dec 2025 09:26:36 +0000</pubDate>
				<category><![CDATA[OVHcloud Engineering]]></category>
		<category><![CDATA[Tranches de Tech & co]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[OVHcloud Managed Kubernetes]]></category>
		<category><![CDATA[Public Cloud]]></category>
		<guid isPermaLink="false">https://blog.ovhcloud.com/?p=30016</guid>

					<description><![CDATA[For years, the Kubernetes Ingress API, and the popular Ingress NGINX controller (ingress-nginx), have been the default way to expose applications running inside a Kubernetes cluster. But the ecosystem is changing: the Kubernetes SIG network has announced the retirement of Ingress NGINX in March 2026. After March 2026 the Ingress NGINX will no longer get [&#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%2Fmoving-beyond-ingress-why-should-ovhcloud-managed-kubernetes-service-mks-users-start-looking-at-the-gateway-api%2F&amp;action_name=Moving%20Beyond%20Ingress%3A%20Why%20should%20OVHcloud%20Managed%20Kubernetes%20Service%20%28MKS%29%20users%20start%20looking%20at%20the%20Gateway%20API%3F&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="680" src="https://blog.ovhcloud.com/wp-content/uploads/2025/12/Gribouillis-2025-12-02-13.47.59.631-1024x680.png" alt="" class="wp-image-30084" style="width:669px;height:auto" srcset="https://blog.ovhcloud.com/wp-content/uploads/2025/12/Gribouillis-2025-12-02-13.47.59.631-1024x680.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2025/12/Gribouillis-2025-12-02-13.47.59.631-300x199.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2025/12/Gribouillis-2025-12-02-13.47.59.631.png 1505w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>For years, the Kubernetes <strong>Ingress</strong> API, and the popular Ingress NGINX controller (ingress-nginx), have been the default way to expose applications running inside a Kubernetes cluster.</p>



<p>But the ecosystem is changing: the Kubernetes SIG network has announced the <a href="https://kubernetes.io/blog/2025/11/11/ingress-nginx-retirement/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">retirement of Ingress NGINX</a> in March 2026.</p>



<p>After <strong>March 2026 </strong>the Ingress NGINX will no longer get new features, new releases, security patches and bug fixes.</p>



<p>Furthermore, the <a href="https://kubernetes.io/docs/concepts/services-networking/ingress/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Kubernetes project <strong>recommends using Gateway instead of Ingress</strong></a>.</p>



<p>The Ingress API has already been frozen, which means it is no longer being developed, and will have no further changes or updates made to it. The Kubernetes project has no plans to remove Ingress from Kubernetes.</p>



<p>While OVHcloud Managed Kubernetes Service (MKS) does not yet provide a native <strong>GatewayClass</strong>, you can already benefit from Gateway API capabilities today by deploying your own controller 💪 .</p>



<p>Also, until Gateway API becomes fully integrated with OpenStack providers, there is an <strong>intermediate option</strong>: using a <strong>modern, actively maintained Ingress controller</strong> other than ingress-nginx.</p>



<h3 class="wp-block-heading">The limitations of the current Ingress controller model</h3>



<p>The traditional Kubernetes Ingress model was intentionally simple: define an <code>Ingress</code>, install an <code>Ingress Controller</code>, and let it configure a single proxy (usually Nginx) to route traffic.</p>



<p>This design works, but it comes with limitations:</p>



<p>&#8211; Single Monolithic “Entry Point”: All HTTP routing for the entire cluster goes through <strong>one shared proxy</strong>. It adds complexity, configuration conflicts and scaling challenges.<br>&#8211; Protocol limitations: only <strong>HTTP and HTTPS</strong>.Support for gRPC, HTTP/2, TCP, UDP or TLS passthrough is inconsistent and controller-specific.<br>&#8211; Heavy Reliance on Annotations: Advanced features (timeouts, rewrites, header handling…) rely on custom annotations.<br>&#8211; Strong 3rd parties and cloud Load Balancers support: Every <a href="https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/#additional-controllers" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Ingress controllers</a> (3rd parties providers) come with their specialized annotations.</p>



<p>Finally, as mentioned, the most used Ingress controller, Ingress NGINX, will be retired in March 2026.</p>



<h3 class="wp-block-heading">A Transitional Solution: Using a Modern Ingress Controller (Traefik, Contour, HAProxy…)</h3>



<p>Before moving to the Gateway API, as a transitional solution, OVHcloud MKS users can simply replace Ingress Nginx with a <strong>modern, actively maintained Ingress controller</strong>.</p>



<p>This allows you to:</p>



<p>&#8211; keep using your existing <code>Ingress</code> manifests<br>&#8211; keep the same architecture: Service type LoadBalancer → OVHcloud Public Cloud Load Balancer → Ingress Controller<br>&#8211; avoid relying on unsupported or deprecated components<br>&#8211; gain features (better gRPC support, built‑in dashboards, improved L7 behaviour&#8230;)</p>



<h4 class="wp-block-heading">Popular alternatives:</h4>



<p><a href="https://doc.traefik.io/traefik/providers/kubernetes-ingress/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer"><strong>Traefik</strong></a>:<br>&#8211; Very easy to deploy<br>&#8211; Excellent support for HTTP/2, gRPC, WebSockets<br>&#8211; Built‑in dashboard<br>&#8211; Supports both Ingress and Gateway API<br>&#8211; Actively maintained<br>&#8211; Seamless migration from NGINX Ingress Controller to Traefik with <a href="https://doc.traefik.io/traefik/reference/routing-configuration/kubernetes/ingress-nginx/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">NGINX annotation compatibility</a></p>



<p><strong><a href="https://projectcontour.io/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Contour</a> (Envoy)</strong>:<br>&#8211; Envoy-based Ingress Controller<br>&#8211; Excellent performance<br>&#8211; Good stepping‑stone toward Gateway API</p>



<p><a href="https://www.haproxy.com/documentation/kubernetes-ingress/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer"><strong>HAProxy Ingress</strong></a>:<br>&#8211; Extremely performant<br>&#8211; Enterprise-grade L7 routing<br>&#8211; Optional Gateway API support</p>



<p><strong><a href="https://docs.nginx.com/nginx-gateway-fabric/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">NGINX Gateway Fabric</a> (NGF)</strong>:<br>&#8211; The successor to Ingress NGINX<br>&#8211; Built directly around Gateway API<br>&#8211; Still maturing but a strong long‑term candidate</p>



<p>If you are interested, you can read the more<a href="https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer"> exhaustive list of Ingress controllers</a>.</p>



<h3 class="wp-block-heading">Installing an Alternative Ingress Controller on OVHcloud MKS</h3>



<p>We will show you how to install <strong>Traefik</strong>, as an alternative Ingress controller and use it to spawn a single OVHcloud Public Cloud Load Balancer (based on OpenStack Octavia).</p>



<p>Install Traefik:</p>



<pre class="wp-block-code"><code class="">helm repo add traefik https://traefik.github.io/charts<br>helm repo update<br><br>helm install traefik traefik/traefik --namespace traefik --create-namespace --set service.type=LoadBalancer</code></pre>



<p>This automatically triggers:<br>&#8211; the OpenStack CCM (used by OVHcloud)<br>&#8211; the creation of an OVHcloud Public Cloud Load Balancer<br>&#8211; exposure of Traefik through a public IP</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="179" src="https://blog.ovhcloud.com/wp-content/uploads/2025/11/image-11-1024x179.png" alt="" class="wp-image-30035" srcset="https://blog.ovhcloud.com/wp-content/uploads/2025/11/image-11-1024x179.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2025/11/image-11-300x52.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2025/11/image-11-768x134.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2025/11/image-11-1536x268.png 1536w, https://blog.ovhcloud.com/wp-content/uploads/2025/11/image-11-2048x358.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>After several seconds, the Load Balancer will be active.</p>



<p>Check that Traefik is running:</p>



<pre class="wp-block-code"><code class="">$ kubectl get all -n traefik<br>NAME                           READY   STATUS    RESTARTS   AGE<br>pod/traefik-6777c5db85-pddd6   1/1     Running   0          31s<br><br>NAME              TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)                      AGE<br>service/traefik   LoadBalancer   10.3.129.188   &lt;pending&gt;     80:30267/TCP,443:30417/TCP   31s<br><br>NAME                      READY   UP-TO-DATE   AVAILABLE   AGE<br>deployment.apps/traefik   1/1     1            1           31s<br><br>NAME                                 DESIRED   CURRENT   READY   AGE<br>replicaset.apps/traefik-6777c5db85   1         1         1       31s</code></pre>



<p>Then in order to use it, create an <code>ingress.yaml</code> file with the following content:</p>



<pre class="wp-block-code"><code class="">apiVersion: networking.k8s.io/v1<br>kind: Ingress<br>metadata:<br>  name: my-app-ingress<br>  namespace: default<br>  annotations:<br>    kubernetes.io/ingress.class: "traefik"  # Specifies Traefik as the ingress controller<br>spec:<br>  rules:<br>    - host: my-app.local<br>      http:<br>        paths:<br>          - path: /<br>            pathType: Prefix<br>            backend:<br>              service:<br>                name: my-app-service<br>                port:<br>                  number: 80</code></pre>



<p>And apply it in your cluster:</p>



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



<p>Using this type of alternative provides a <strong>fully supported, modern Ingress Controller</strong> while you prepare a long‑term transition to the Gateway API.</p>



<h3 class="wp-block-heading">Gateway API: A modern, flexible networking model</h3>



<p>The <strong>Gateway API</strong> is the next-generation Kubernetes networking specification. It introduces clearer roles and more flexible architectures.</p>



<p>Gateway API splits responsibilities across:<br>&#8211; <strong>GatewayClass</strong>: defines the type of gateway and which controller manages it<br>&#8211; <strong>Gateway</strong>: the actual entry point (e.g., a Load Balancer)<br>&#8211; <strong>Routes</strong>: routing rules, protocol-specific (HTTPRoute, TLSRoute, GRPCRoute, TCPRoute…)</p>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="800" height="700" src="https://blog.ovhcloud.com/wp-content/uploads/2025/12/image-1.png" alt="" class="wp-image-30065" style="width:558px;height:auto" srcset="https://blog.ovhcloud.com/wp-content/uploads/2025/12/image-1.png 800w, https://blog.ovhcloud.com/wp-content/uploads/2025/12/image-1-300x263.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2025/12/image-1-768x672.png 768w" sizes="auto, (max-width: 800px) 100vw, 800px" /></figure>



<p>Gateway API supports:<br>&#8211; HTTP(S)<br>&#8211; HTTP/2<br>&#8211; gRPC<br>&#8211; TCP<br>&#8211; TLS passthrough<br>…in a consistent and portable way.</p>



<p>Unlike Ingress, Gateway API is explicitly designed to allow providers like OVHcloud, AWS, GCP, Azure to:<br>&#8211; provision Load Balancers (LB)<br>&#8211; manage listeners<br>&#8211; expose multiple ports<br>&#8211; integrate with their LB features<br>This paves the way for native OVHcloud <strong>GatewayClass</strong> support.</p>



<h3 class="wp-block-heading">How does it work today on OVHcloud MKS?</h3>



<p>OVHcloud MKS relies on the OpenStack Cloud Controller Manager (CCM) to provision OVHcloud <strong>Public Cloud</strong> Load Balancers in response to a Service of type <code>LoadBalancer</code>.</p>



<p>Since MKS does not yet include a native <code>GatewayClass</code>, you can use Gateway API today as follows:</p>



<p>1. You deploy an existing Gateway Controller (Envoy Gateway, Traefik, Contour/Envoy…) and its GatewayClass.<br>2. The controller deploys a Data Plane proxy inside the cluster.<br>3. To expose that proxy, you still have to create a <code>Service</code> of type <strong>LoadBalancer</strong> (and your app of course).<br>4. The CCM provisions an OVHcloud Public Cloud Load Balancer and forwards traffic to your proxy.</p>



<p>Thanks to that, you will have a fully functional Gateway API. The workflow is very similar to that which is required for using NGINX Ingress controller.</p>



<h3 class="wp-block-heading">Using the Gateway API on OVHcloud MKS today</h3>



<p>You can already use the Gateway API by deploying your preferred controller.</p>



<p>Here’s an example using<a href="https://gateway.envoyproxy.io/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer"> Envoy Gateway</a>, one of the most future-proof options.</p>



<p>Install Gateway API CRDs:</p>



<pre class="wp-block-code"><code class="">kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/latest/download/standard-install.yaml</code></pre>



<p>Deploy Envoy Gateway:</p>



<pre class="wp-block-code"><code class="">helm install eg oci://docker.io/envoyproxy/gateway-helm -n envoy-gateway-system --create-namespace</code></pre>



<p>You should have a result like this:</p>



<pre class="wp-block-code"><code class="">$ helm install eg oci://docker.io/envoyproxy/gateway-helm -n envoy-gateway-system --create-namespace<br><br>Pulled: docker.io/envoyproxy/gateway-helm:1.6.0<br>Digest: sha256:5c55e7844ae8cff3152ca00330234ef61b1f9fa3d466f50db2c63a279f1cd1df<br>NAME: eg<br>LAST DEPLOYED: Mon Dec  1 16:27:07 2025<br>NAMESPACE: envoy-gateway-system<br>STATUS: deployed<br>REVISION: 1<br>TEST SUITE: None<br>NOTES:<br>**************************************************************************<br>*** PLEASE BE PATIENT: Envoy Gateway may take a few minutes to install ***<br>**************************************************************************<br><br>Envoy Gateway is an open source project for managing Envoy Proxy as a standalone or Kubernetes-based application gateway.<br><br>Thank you for installing Envoy Gateway! 🎉<br><br>Your release is named: eg. 🎉<br><br>Your release is in namespace: envoy-gateway-system. 🎉<br><br>To learn more about the release, try:<br><br>  $ helm status eg -n envoy-gateway-system<br>  $ helm get all eg -n envoy-gateway-system<br><br>To have a quickstart of Envoy Gateway, please refer to https://gateway.envoyproxy.io/latest/tasks/quickstart.<br><br>To get more details, please visit https://gateway.envoyproxy.io and https://github.com/envoyproxy/gateway.</code></pre>



<p>Check the Envoy gateway is running:</p>



<pre class="wp-block-code"><code class="">$ kubectl get po -n envoy-gateway-system<br>NAME                            READY   STATUS    RESTARTS   AGE<br>envoy-gateway-9cbbc577c-5h5qw   1/1     Running   0          16m</code></pre>



<p>As a quickstart, you can install directly the <a href="https://gateway-api.sigs.k8s.io/api-types/gatewayclass/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">GatewayClass</a>, <a href="https://gateway-api.sigs.k8s.io/api-types/gateway/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Gateway</a>, <a href="https://gateway-api.sigs.k8s.io/api-types/httproute/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">HTTPRoute</a> and an example app:</p>



<pre class="wp-block-code"><code class="">kubectl apply -f https://github.com/envoyproxy/gateway/releases/download/latest/quickstart.yaml -n default</code></pre>



<p>This command deploys a <code>GatewayClass</code>, a <code>Gateway</code>, a <code>HTTPRoute</code> and an app deployed in a deployment and exposed through a service:</p>



<pre class="wp-block-code"><code class="">gatewayclass.gateway.networking.k8s.io/eg created<br>gateway.gateway.networking.k8s.io/eg created<br>serviceaccount/backend created<br>service/backend created<br>deployment.apps/backend created<br>httproute.gateway.networking.k8s.io/backend created</code></pre>



<p>As you can see, a GatewayClass have been deployed:</p>



<pre class="wp-block-code"><code class="">$ kubectl get gatewayclass -o yaml | kubectl neat<br>apiVersion: v1<br>items:<br>- apiVersion: gateway.networking.k8s.io/v1<br>  kind: GatewayClass<br>  metadata:<br>    name: eg<br>  spec:<br>    controllerName: gateway.envoyproxy.io/gatewayclass-controller<br>kind: List<br>metadata:<br>  resourceVersion: ""</code></pre>



<p>Note that a GatewayClass is a cluster-wide resource so you don&#8217;t have to specify any namespace.</p>



<p>A Gateway have been deployed also:</p>



<pre class="wp-block-code"><code class="">$ kubectl get gateway -o yaml -n default | kubectl neat<br>apiVersion: v1<br>items:<br>- apiVersion: gateway.networking.k8s.io/v1<br>  kind: Gateway<br>  metadata:<br>    name: eg<br>    namespace: default<br>  spec:<br>    gatewayClassName: eg<br>    listeners:<br>    - allowedRoutes:<br>        namespaces:<br>          from: Same<br>      name: http<br>      port: 80<br>      protocol: HTTP<br>kind: List<br>metadata:<br>  resourceVersion: ""</code></pre>



<p>A HTTPRoute also:</p>



<pre class="wp-block-code"><code class="">$ kubectl get httproute -o yaml -n default | kubectl neat<br>apiVersion: v1<br>items:<br>- apiVersion: gateway.networking.k8s.io/v1<br>  kind: HTTPRoute<br>  metadata:<br>    name: backend<br>    namespace: default<br>  spec:<br>    hostnames:<br>    - www.example.com<br>    parentRefs:<br>    - group: gateway.networking.k8s.io<br>      kind: Gateway<br>      name: eg<br>    rules:<br>    - backendRefs:<br>      - group: ""<br>        kind: Service<br>        name: backend<br>        port: 3000<br>        weight: 1<br>      matches:<br>      - path:<br>          type: PathPrefix<br>          value: /<br>kind: List<br>metadata:<br>  resourceVersion: ""</code></pre>



<p>In order to retrieve the external IP (of the external Load Balancer), you just have to get information about the Gateway and export it in an environment variable:</p>



<pre class="wp-block-code"><code class="">$ kubectl get gateway eg<br>NAME   CLASS   ADDRESS        PROGRAMMED   AGE<br>eg     eg      xx.xxx.xx.xxx   True        18m<br><br>$ export GATEWAY_HOST=$(kubectl get gateway/eg -o jsonpath='{.status.addresses[0].value}')<br><br>$ echo $GATEWAY_HOST<br>xx.xxx.xx.xxx</code></pre>



<p>And finally, a <code>backend</code> service have been deployed with its deployment:</p>



<pre class="wp-block-code"><code class="">$ kubectl get pod,svc -l app=backend -n default<br>NAME                           READY   STATUS    RESTARTS   AGE<br>pod/backend-765694d47f-zr6hh   1/1     Running   0          21m<br><br>NAME              TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE<br>service/backend   ClusterIP   10.3.114.179   &lt;none&gt;        3000/TCP   21m</code></pre>



<p>In order to create your own <code>Gateway</code> and <code>*Route</code> resources, don&#8217;t hesitate to take a look at the <a href="https://gateway-api.sigs.k8s.io/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Gateway API website</a>.</p>



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



<p>Two migration paths are currently available for OVHcloud MKS users:</p>



<ul class="wp-block-list">
<li>Short-term: switch to a modern Ingress Controller (Traefik, Contour, HAProxy, NGF&#8230;). It provides full support for current Ingress usage, without requiring API changes.</li>



<li>Long-term: adopt the Gateway API. Gateway API brings multi‑protocol support, clearer separation of roles, and is the strategic direction of Kubernetes networking.</li>
</ul>



<p>Which approach and which tool should you choose? Well, it’s up to you, depending on your use cases, your teams, your needs… 🙂</p>



<p>As we have seen in this blog post, OVHcloud MKS users can begin adopting these technologies today, safely and incrementally.</p>



<p>This ecosystem is evolving quickly, so stay tuned to find out about the coming release of a pre-installed official GatewayClass (based on OpenStack Octavia) 💪.</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%2Fmoving-beyond-ingress-why-should-ovhcloud-managed-kubernetes-service-mks-users-start-looking-at-the-gateway-api%2F&amp;action_name=Moving%20Beyond%20Ingress%3A%20Why%20should%20OVHcloud%20Managed%20Kubernetes%20Service%20%28MKS%29%20users%20start%20looking%20at%20the%20Gateway%20API%3F&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>Manage your secrets using OVHcloud Secret Manager with External Secrets Operator (ESO) on OVHcloud Managed Kubernetes Service (MKS)</title>
		<link>https://blog.ovhcloud.com/manage-your-secrets-through-ovhcloud-secret-manager-thanks-to-external-secrets-operator-eso-on-ovhcloud-managed-kubernetes-service-mks/</link>
		
		<dc:creator><![CDATA[Aurélie Vache]]></dc:creator>
		<pubDate>Tue, 25 Nov 2025 14:44:52 +0000</pubDate>
				<category><![CDATA[OVHcloud Engineering]]></category>
		<category><![CDATA[Tranches de Tech & co]]></category>
		<category><![CDATA[IAM]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[MKS]]></category>
		<category><![CDATA[Public Cloud]]></category>
		<category><![CDATA[Secret Manager]]></category>
		<guid isPermaLink="false">https://blog.ovhcloud.com/?p=29374</guid>

					<description><![CDATA[Secrets resources in Kubernetes help us keep sensitive information like logins, passwords, tokens, credentials and certificates secure. But just a heads up: Secrets in Kubernetes are base64 encoded, not encrypted so anyone can read and decode them if they know how. The good news is that OVHcloud has just launched the Secret Manager Beta, which [&#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%2Fmanage-your-secrets-through-ovhcloud-secret-manager-thanks-to-external-secrets-operator-eso-on-ovhcloud-managed-kubernetes-service-mks%2F&amp;action_name=Manage%20your%20secrets%20using%20OVHcloud%20Secret%20Manager%20with%20External%20Secrets%20Operator%20%28ESO%29%20on%20OVHcloud%20Managed%20Kubernetes%20Service%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="675" src="https://blog.ovhcloud.com/wp-content/uploads/2025/11/IMG_1547-1-1024x675.jpg" alt="" class="wp-image-30006" style="width:638px;height:auto" srcset="https://blog.ovhcloud.com/wp-content/uploads/2025/11/IMG_1547-1-1024x675.jpg 1024w, https://blog.ovhcloud.com/wp-content/uploads/2025/11/IMG_1547-1-300x198.jpg 300w, https://blog.ovhcloud.com/wp-content/uploads/2025/11/IMG_1547-1-768x507.jpg 768w, https://blog.ovhcloud.com/wp-content/uploads/2025/11/IMG_1547-1.jpg 1536w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Secrets resources in Kubernetes help us keep sensitive information like logins, passwords, tokens, credentials and certificates secure. But just a heads up: Secrets in Kubernetes are base64 encoded, not encrypted so anyone can read and decode them if they know how.</p>



<p>The good news is that OVHcloud has just launched the<a href="https://www.ovhcloud.com/fr/identity-security-operations/secret-manager/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer"> Secret Manager</a> Beta, which you can use within your Kubernetes clusters via the External Secrets Operator (ESO) 🎉.</p>



<h2 class="wp-block-heading">External Secrets Operator</h2>



<p>The External Secrets Operator (ESO) extends Kubernetes with Custom Resource Definitions (CRDs) ) that define <strong>where</strong> secrets are and <strong>how</strong> to sync them.</p>



<p>The controller <strong>retrieves secrets from an external API</strong> and <strong>creates Kubernetes Secrets</strong>. If the secret changes in the external API, the controller updates the secret in the Kubernetes cluster.</p>



<p>Basically, the ESO can connect to an external Secret Manager like OVHcloud, Vault, AWS, or GCP using a (Cluster)SecretStore, and an ExternalSecret to figure out which Secret it needs to fetch. It then creates a Secret in the Kubernetes cluster with the fetched secret’s value.</p>



<figure class="wp-block-image aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="1020" height="942" src="https://blog.ovhcloud.com/wp-content/uploads/2025/07/image-10.png" alt="" class="wp-image-29378" style="width:435px;height:auto" srcset="https://blog.ovhcloud.com/wp-content/uploads/2025/07/image-10.png 1020w, https://blog.ovhcloud.com/wp-content/uploads/2025/07/image-10-300x277.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2025/07/image-10-768x709.png 768w" sizes="auto, (max-width: 1020px) 100vw, 1020px" /></figure>



<p>Plus, it can sync secrets across all the namespaces in your Kubernetes cluster (I love this feature ❤️):</p>



<figure class="wp-block-image aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="577" src="https://blog.ovhcloud.com/wp-content/uploads/2025/07/image-11-1024x577.png" alt="" class="wp-image-29380" style="width:502px;height:auto" srcset="https://blog.ovhcloud.com/wp-content/uploads/2025/07/image-11-1024x577.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2025/07/image-11-300x169.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2025/07/image-11-768x433.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2025/07/image-11.png 1282w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>You can use External Secrets with different<a href="https://external-secrets.io/latest/provider/aws-secrets-manager/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer"> Providers</a>, including AWS Secrets Manager, HashiCorp Vault, Google Secret Manager. In this blog I’ll show you how to create a secret in the new OVHcloud Secret Manager using<a href="https://external-secrets.io/latest/provider/hashicorp-vault/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer"> Hashicorp Vault</a>.</p>



<p>For more details, read the<a href="https://external-secrets.io/v0.8.5/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer"> ESO official documentation</a>.</p>



<h2 class="wp-block-heading">Let&#8217;s jump in!</h2>



<h3 class="wp-block-heading">Create an IAM local user</h3>



<p>To fetch secrets in Secret Manager, you’ll need an IAM user with the right permissions. You can either set it up or use an existing one.</p>



<p>In the<a href="https://www.ovh.com/manager" data-wpel-link="exclude"> OVHcloud Control Panel</a> (UI), go to ‘Identity and Access Management’, then ‘Identities’.</p>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="760" height="636" src="https://blog.ovhcloud.com/wp-content/uploads/2025/11/identity.png" alt="" class="wp-image-29967" style="width:232px;height:auto" srcset="https://blog.ovhcloud.com/wp-content/uploads/2025/11/identity.png 760w, https://blog.ovhcloud.com/wp-content/uploads/2025/11/identity-300x251.png 300w" sizes="auto, (max-width: 760px) 100vw, 760px" /></figure>



<p>Click the ‘Add user’ button to create an IAM local user and complete the fields as shown below:</p>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="907" src="https://blog.ovhcloud.com/wp-content/uploads/2025/11/image-9-2-1024x907.png" alt="" class="wp-image-29994" style="width:561px;height:auto" srcset="https://blog.ovhcloud.com/wp-content/uploads/2025/11/image-9-2-1024x907.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2025/11/image-9-2-300x266.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2025/11/image-9-2-768x681.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2025/11/image-9-2.png 1194w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="473" src="https://blog.ovhcloud.com/wp-content/uploads/2025/11/image-10-1-1024x473.png" alt="" class="wp-image-29995" style="width:560px;height:auto" srcset="https://blog.ovhcloud.com/wp-content/uploads/2025/11/image-10-1-1024x473.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2025/11/image-10-1-300x139.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2025/11/image-10-1-768x355.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2025/11/image-10-1.png 1194w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Quick note, I’ve named the user ‘secretmanager-’ followed by the ID of the OKMS domain I want to use.</p>



<p>The user needs to be an ADMIN, or, ideally, have the following policies:</p>



<pre class="wp-block-code"><code class="">okms:apikms:secret/create<br>okms:apikms:secret/version/getData<br>okms:apiovh:secret/get</code></pre>



<h3 class="wp-block-heading">Get the Personal Access Token (PAT)</h3>



<p>The ESO ClusterSecretStore needs the permission to fetch secrets from Secret Manager, so you’ll need a token (PAT).</p>



<p>You can access it via our API, which you’ll find here: <a href="https://eu.api.ovh.com/console/?section=%2Fme&amp;branch=v1#post-/me/identity/user/-user-/token" data-wpel-link="exclude">https://eu.api.ovh.com/console/?section=%2Fme&amp;branch=v1#post-/me/identity/user/-user-/token</a></p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="542" src="https://blog.ovhcloud.com/wp-content/uploads/2025/11/image-1-3-1024x542.png" alt="" class="wp-image-29997" srcset="https://blog.ovhcloud.com/wp-content/uploads/2025/11/image-1-3-1024x542.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2025/11/image-1-3-300x159.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2025/11/image-1-3-768x406.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2025/11/image-1-3-1536x813.png 1536w, https://blog.ovhcloud.com/wp-content/uploads/2025/11/image-1-3.png 1546w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p><strong>Path parameters</strong></p>



<p>user: secretmanager-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx</p>



<p><strong>Request body:</strong></p>



<pre class="wp-block-code"><code class="">{<br>  "description": "PAT secretmanager-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx",<br>  "name": "pat-secretmanager-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx"<br>}</code></pre>



<p>You should obtain a response like this:</p>



<pre class="wp-block-code"><code class="">{<br>  "creation": "2025-11-07T14:02:56.679157188Z",<br>  "description": "PAT secretmanager-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx",<br>  "expiresAt": null,<br>  "lastUsed": null,<br>  "name": "pat-secretmanager-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx",<br>  "token": "eyJhbGciOiJ...punpVAg"<br>}</code></pre>



<p>Save the token value, because you’ll need it in a bit.</p>



<h3 class="wp-block-heading">Create a secret in the Secret Manager</h3>



<p>Here’s how to create a secret with OVHcloud MPR credentials for use in Kubernetes cluster(s).</p>



<p>In the<a href="https://www.ovh.com/manager" data-wpel-link="exclude"> OVHcloud Control Panel</a> (UI), go to ‘Secret Manager’, then create a secret ‘prod/va1/dockerconfigjson’ in the Europe region (France – Paris) eu-west-par:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="309" src="https://blog.ovhcloud.com/wp-content/uploads/2025/11/image-5-1-1024x309.png" alt="" class="wp-image-29973" srcset="https://blog.ovhcloud.com/wp-content/uploads/2025/11/image-5-1-1024x309.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2025/11/image-5-1-300x91.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2025/11/image-5-1-768x232.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2025/11/image-5-1-1536x464.png 1536w, https://blog.ovhcloud.com/wp-content/uploads/2025/11/image-5-1-2048x618.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>You’ll need to activate the region if you’re selecting it for the first time:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="569" src="https://blog.ovhcloud.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-a-14.03.20-1024x569.png" alt="" class="wp-image-29911" srcset="https://blog.ovhcloud.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-a-14.03.20-1024x569.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-a-14.03.20-300x167.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-a-14.03.20-768x426.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-a-14.03.20-1536x853.png 1536w, https://blog.ovhcloud.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-a-14.03.20-2048x1137.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Select an OKMS domain:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="260" src="https://blog.ovhcloud.com/wp-content/uploads/2025/11/image-6-3-1024x260.png" alt="" class="wp-image-29996" srcset="https://blog.ovhcloud.com/wp-content/uploads/2025/11/image-6-3-1024x260.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2025/11/image-6-3-300x76.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2025/11/image-6-3-768x195.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2025/11/image-6-3.png 1384w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Enter the path and value of your secret. For example:</p>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="708" src="https://blog.ovhcloud.com/wp-content/uploads/2025/11/image-7-1-1024x708.png" alt="" class="wp-image-29975" style="width:558px;height:auto" srcset="https://blog.ovhcloud.com/wp-content/uploads/2025/11/image-7-1-1024x708.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2025/11/image-7-1-300x208.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2025/11/image-7-1-768x531.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2025/11/image-7-1.png 1402w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Your secret is all set!</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="417" src="https://blog.ovhcloud.com/wp-content/uploads/2025/11/image-4-2-1024x417.png" alt="" class="wp-image-29990" srcset="https://blog.ovhcloud.com/wp-content/uploads/2025/11/image-4-2-1024x417.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2025/11/image-4-2-300x122.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2025/11/image-4-2-768x313.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2025/11/image-4-2-1536x625.png 1536w, https://blog.ovhcloud.com/wp-content/uploads/2025/11/image-4-2-2048x834.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h3 class="wp-block-heading">Install External Secrets Operators on your cluster</h3>



<p>Deploy external secret through Helm:</p>



<pre class="wp-block-code"><code class="">helm repo add external-secrets https://charts.external-secrets.io
helm repo update</code></pre>



<p>Install from the chart repository:</p>



<pre class="wp-block-code"><code class="">helm install external-secrets \<br>   external-secrets/external-secrets \<br>    -n external-secrets \<br>    --create-namespace \<br>    --set installCRDs=true</code></pre>



<p>Your result should look something like this:</p>



<pre class="wp-block-code"><code class="">$ helm install external-secrets \<br>   external-secrets/external-secrets \<br>    -n external-secrets \<br>    --create-namespace \<br>    --set installCRDs=true<br><br>NAME: external-secrets<br>LAST DEPLOYED: Mon Nov 24 17:08:58 2025<br>NAMESPACE: external-secrets<br>STATUS: deployed<br>REVISION: 1<br>TEST SUITE: None<br>NOTES:<br>external-secrets has been deployed successfully in namespace external-secrets!<br><br>In order to begin using ExternalSecrets, you will need to set up a SecretStore<br>or ClusterSecretStore resource (for example, by creating a 'vault' SecretStore).<br><br>More information on the different types of SecretStores and how to configure them<br>can be found in our Github: https://github.com/external-secrets/external-secrets</code></pre>



<p>This command will install the External Secrets Operator in your cluster.</p>



<p>Check ESO is running:</p>



<pre class="wp-block-code"><code class="">$ kubectl get all -n external-secrets<br>NAME                                                    READY   STATUS    RESTARTS   AGE<br>pod/external-secrets-6b9f8ff5d4-jwd6g                   1/1     Running   0          25m<br>pod/external-secrets-cert-controller-7bf8fd894c-d24xb   1/1     Running   0          25m<br>pod/external-secrets-webhook-df488ddff-2xv4t            1/1     Running   0          25m<br><br>NAME                               TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE<br>service/external-secrets-webhook   ClusterIP   10.3.106.32   &lt;none&gt;        443/TCP   25m<br><br>NAME                                               READY   UP-TO-DATE   AVAILABLE   AGE<br>deployment.apps/external-secrets                   1/1     1            1           25m<br>deployment.apps/external-secrets-cert-controller   1/1     1            1           25m<br>deployment.apps/external-secrets-webhook           1/1     1            1           25m<br><br>NAME                                                          DESIRED   CURRENT   READY   AGE<br>replicaset.apps/external-secrets-6b9f8ff5d4                   1         1         1       25m<br>replicaset.apps/external-secrets-cert-controller-7bf8fd894c   1         1         1       25m<br>replicaset.apps/external-secrets-webhook-df488ddff            1         1         1       25m</code></pre>



<h3 class="wp-block-heading">Create a Secret contains the PAT</h3>



<p>Encode the PAT in base64:</p>



<pre class="wp-block-code"><code class="">$ echo -n "&lt;token&gt;" | base64<br><br>ZXlKaG...wVkFn</code></pre>



<p>Create a secret with it inside a <strong>secret.yaml</strong> file:</p>



<pre class="wp-block-code"><code class="">apiVersion: v1<br>kind: Secret<br>metadata:<br>  name: ovhcloud-vault-token<br>  namespace: external-secrets<br>data:<br>  token: ZXlKaG...wVkFn</code></pre>



<p>Apply the resource in your cluster:</p>



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



<p>Check that the secret have been created:</p>



<pre class="wp-block-code"><code class="">$ kubectl get secret ovhcloud-vault-token -n external-secrets<br>NAME                   TYPE     DATA   AGE<br>ovhcloud-vault-token   Opaque   1      5m</code></pre>



<h3 class="wp-block-heading">Deploy a ClusterSecretStore to connect ESO to Secret Manager</h3>



<p>Set up a ClusterSecretStore to manage synchronisation with Secret Manager.<br>It will use the HashiCorp Vault provider with token auth, and the OKMS endpoint as the backend.</p>



<p>Create a <strong>clustersecretstore.yaml</strong> file with the content below:</p>



<pre class="wp-block-code"><code class="">apiVersion: external-secrets.io/v1<br>kind: ClusterSecretStore<br>metadata:<br>  name: vault-secret-store<br>spec:<br>  provider:<br>      vault:<br>        server: "https://eu-west-par.okms.ovh.net/api/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" # OKMS endpoint, fill with the correct region and your okms_id<br>        path: "secret"<br>        version: "v2"<br>        auth:<br>            tokenSecretRef:<br>              name: ovhcloud-vault-token # The k8s secret that contain your PAT<br>              key: token</code></pre>



<p>Keep in mind, in our example, we’ve selected the “eu-west-par” region. You can enter a different server URL, depending on your desired region.</p>



<p>Apply it:</p>



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



<p>Check:</p>



<pre class="wp-block-code"><code class="">$ kubectl get clustersecretstore.external-secrets.io/vault-secret-store<br>NAME                 AGE   STATUS   CAPABILITIES   READY<br>vault-secret-store   2m   Valid    ReadWrite      True</code></pre>



<h3 class="wp-block-heading">Create an ExternalSecret</h3>



<p>Create an <strong>externalsecret.yaml</strong> file with the content below:</p>



<pre class="wp-block-code"><code class="">apiVersion: external-secrets.io/v1<br>kind: ExternalSecret<br>metadata:<br>  name: docker-config-secret<br>  namespace: external-secrets<br>spec:<br>  refreshInterval: 30m<br>  secretStoreRef:<br>    name: vault-secret-store<br>    kind: ClusterSecretStore<br>  target:<br>    template:<br>      type: kubernetes.io/dockerconfigjson<br>      data:<br>        .dockerconfigjson: "{{ .mysecret | toString }}"<br>    name: ovhregistrycred<br>    creationPolicy: Owner<br>  data:<br>  - secretKey: mysecret<br>    remoteRef:<br>      key: prod/va1/dockerconfigjson</code></pre>



<p>Apply it:</p>



<pre class="wp-block-code"><code class="">$ kubectl apply -f externalsecret.yaml<br>externalsecret.external-secrets.io/docker-config-secret created</code></pre>



<p>Check:</p>



<pre class="wp-block-code"><code class="">$ kubectl get externalsecret.external-secrets.io/docker-config-secret -n external-secrets<br>NAME                   STORETYPE            STORE                REFRESH INTERVAL   STATUS         READY<br>docker-config-secret   ClusterSecretStore   vault-secret-store   30m0s              SecretSynced   True</code></pre>



<p>After applying this command, it will create a Kubernetes Secret object.</p>



<pre class="wp-block-code"><code class="">$ kubectl get secret -n external-secrets<br>NAME                                     TYPE                             DATA   AGE<br>...<br>ovhregistrycred                          kubernetes.io/dockerconfigjson   1      17d<br>...</code></pre>



<p>As you can see, the Secret is ready, and you can now use it as an imagePullSecret in your Pods!</p>



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



<p>In this blog, we’ve explained how to create secrets in the new OVHcloud Secret Manager and integrate them directly in your Kubernetes clusters using the ESO Vault provider.</p>



<p>And here’s some great news: our teams are working on an OVHcloud External Secret Operator, set to go live in the coming months, which you can use 🎉.</p>



<p>Stay tuned and share your thoughts!</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%2Fmanage-your-secrets-through-ovhcloud-secret-manager-thanks-to-external-secrets-operator-eso-on-ovhcloud-managed-kubernetes-service-mks%2F&amp;action_name=Manage%20your%20secrets%20using%20OVHcloud%20Secret%20Manager%20with%20External%20Secrets%20Operator%20%28ESO%29%20on%20OVHcloud%20Managed%20Kubernetes%20Service%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>10 Reasons Scaling Startups Are Migrating to OVHcloud</title>
		<link>https://blog.ovhcloud.com/10-reasons-scaling-startups-are-migrating-to-ovhcloud/</link>
		
		<dc:creator><![CDATA[Alexander Grau]]></dc:creator>
		<pubDate>Tue, 21 Oct 2025 21:26:37 +0000</pubDate>
				<category><![CDATA[OVHcloud Startup Program]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[Data Sovereignty]]></category>
		<category><![CDATA[Infrastructure]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[Migration]]></category>
		<category><![CDATA[OVHcloud]]></category>
		<category><![CDATA[Public Cloud]]></category>
		<category><![CDATA[Startup Program]]></category>
		<guid isPermaLink="false">https://blog.ovhcloud.com/?p=28941</guid>

					<description><![CDATA[Cloud infrastructure plays a critical role in how startups scale—affecting everything from product delivery and user experience to budget and compliance. While many startups begin their journey with public cloud giants, the challenges of unpredictable costs, data control, and technical constraints become more apparent as they grow. For startups ready to scale smarter, OVHcloud offers [&#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%2F10-reasons-scaling-startups-are-migrating-to-ovhcloud%2F&amp;action_name=10%20Reasons%20Scaling%20Startups%20Are%20Migrating%20to%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[
<p>Cloud infrastructure plays a critical role in how startups scale—affecting everything from product delivery and user experience to budget and compliance. While many startups begin their journey with public cloud giants, the challenges of unpredictable costs, data control, and technical constraints become more apparent as they grow.</p>



<p>For startups ready to scale smarter, <strong>OVHcloud</strong> offers a compelling alternative: high-performance, cost-effective, and sovereignty-first infrastructure. Here’s why more and more growing startups are making the switch.</p>



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



<h5 class="wp-block-heading"><strong>1. Predictable, Transparent Pricing</strong></h5>



<p>OVHcloud’s <a href="https://www.ovhcloud.com/en-gb/lp/prices-give-you-edge/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">flat-rate pricing model</a> eliminates hidden fees and unpredictable billing. Bandwidth is included. Egress costs? Zero. This gives startups the ability to budget confidently—even as infrastructure scales rapidly.</p>



<h5 class="wp-block-heading"><strong>2. Cost-Efficient Scaling</strong></h5>



<p>Startups that migrate to OVHcloud often report <strong>up to 60% cost savings</strong> compared to hyperscalers. Whether you&#8217;re scaling your backend, AI workloads, or customer-facing applications, OVHcloud lets you do more with less.</p>



<h5 class="wp-block-heading"><strong>3. Performance Without Compromise</strong></h5>



<p>From <a href="https://www.ovhcloud.com/en/bare-metal/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Bare Metal</a> servers and <a href="https://www.ovhcloud.com/en/public-cloud/virtual-instances/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">high-memory VMs</a> to <a href="https://www.ovhcloud.com/en/public-cloud/gpu/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">GPU</a> and <a href="https://www.ovhcloud.com/en/public-cloud/storage/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">storage-optimized instances</a>, OVHcloud infrastructure is engineered for performance. Ideal for AI, SaaS, analytics, and other compute-intensive use cases.</p>



<h5 class="wp-block-heading"><strong>4. Full Data Sovereignty in the EU</strong></h5>



<p>OVHcloud is headquartered in Europe and operates under <strong>the strictest data protection laws (like GDPR in the EU or Law 25 in Quebec, Canada)</strong>. Unlike other providers, <a href="https://www.ovhcloud.com/en-gb/lp/data-stays-your-data/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">your data stays</a> within jurisdictions that respect privacy and sovereignty—no exposure to foreign surveillance laws.</p>



<h5 class="wp-block-heading"><strong>5. Open Standards and No Vendor Lock-In</strong></h5>



<p>Freedom matters—especially when you’re building for scale. OVHcloud supports open technologies like <a href="https://www.ovhcloud.com/en/public-cloud/kubernetes/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Kubernetes</a>, Terraform, and OpenStack, giving your team full flexibility and avoiding lock-in to proprietary tools or services.</p>



<h5 class="wp-block-heading"><strong>6. Infrastructure That Grows With You</strong></h5>



<p>Whether you&#8217;re launching in new markets or onboarding thousands of new users, OVHcloud enables seamless horizontal and vertical scaling. With availability across multiple regions, your growth won’t hit a wall.</p>



<h5 class="wp-block-heading"><strong>7. Faster Time-to-Market Through Cloud Migration Support</strong></h5>



<p>OVHcloud offers <strong>cloud migration guidance and tools</strong>, including compatibility with major platforms and migration kits. This helps your team move faster, avoid downtime, and focus on innovation—not infrastructure headaches.</p>



<h5 class="wp-block-heading"><strong>8. Dev-Friendly Ecosystem</strong></h5>



<p>With support for containerization, automation, and CI/CD pipelines, OVHcloud makes life easier for DevOps teams. You can provision infrastructure programmatically and scale efficiently—just like you would with AWS or GCP.</p>



<h5 class="wp-block-heading"><strong>9. Sustainability Built In</strong></h5>



<p>Efficiency is built into OVHcloud’s DNA. By designing and operating its own energy-efficient data centers, OVHcloud helps startups meet their <a href="https://www.ovhcloud.com/en-gb/lp/sustainable-ground/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">sustainability goals</a> without compromising on performance or cost.</p>



<h5 class="wp-block-heading"><strong>10. A Cloud Partner—Not Just a Provider</strong></h5>



<p>Startups need more than compute power—they need guidance, flexibility, and a partner that understands their journey. OVHcloud offers <a href="https://www.ovhcloud.com/en/professional-services/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">tailored support</a>, <a href="https://help.ovhcloud.com/csm/world-documentation?id=kb_home" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">technical documentation</a>, and real human engagement to help you succeed at every stage of growth.</p>



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



<h5 class="wp-block-heading"><strong><em>OVHcloud: Built to Scale With Startups</em></strong></h5>



<p>If your startup is growing fast and needs infrastructure that can keep up—without breaking the budget or sacrificing control—OVHcloud offers a cloud built around your values: <strong>scalability, transparency, freedom, and performance</strong>.</p>



<p><strong>Migrate with confidence. Scale with control. Grow with OVHcloud.</strong></p>



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



<figure class="wp-block-image size-full"><a href="https://startup.ovhcloud.com/en/globalreport2025/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer"><img loading="lazy" decoding="async" width="970" height="250" src="https://blog.ovhcloud.com/wp-content/uploads/2025/08/Email-Signature-–-1.jpg" alt="" class="wp-image-29527" srcset="https://blog.ovhcloud.com/wp-content/uploads/2025/08/Email-Signature-–-1.jpg 970w, https://blog.ovhcloud.com/wp-content/uploads/2025/08/Email-Signature-–-1-300x77.jpg 300w, https://blog.ovhcloud.com/wp-content/uploads/2025/08/Email-Signature-–-1-768x198.jpg 768w" sizes="auto, (max-width: 970px) 100vw, 970px" /></a></figure>



<p>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>
<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%2F10-reasons-scaling-startups-are-migrating-to-ovhcloud%2F&amp;action_name=10%20Reasons%20Scaling%20Startups%20Are%20Migrating%20to%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>Create encrypted Persistent Volumes on OVHcloud Managed Kubernetes clusters with LUKS</title>
		<link>https://blog.ovhcloud.com/create-encrypted-persistent-volumes-on-ovhcloud-managed-kubernetes-clusters-with-luks/</link>
		
		<dc:creator><![CDATA[Aurélie Vache]]></dc:creator>
		<pubDate>Tue, 19 Aug 2025 11:35:41 +0000</pubDate>
				<category><![CDATA[OVHcloud Engineering]]></category>
		<category><![CDATA[Tranches de Tech & co]]></category>
		<category><![CDATA[Block Storage]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[MKS]]></category>
		<category><![CDATA[Public Cloud]]></category>
		<guid isPermaLink="false">https://blog.ovhcloud.com/?p=29532</guid>

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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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

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



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



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

# Wait a little...

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



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



<pre class="wp-block-code"><code class="">$ kubectl describe pod pod-with-encrypted-volume -n test-pvc-luks
Name:             pod-with-encrypted-volume
Namespace:        test-pvc-luks
Priority:         0
Service Account:  default
Node:             my-pool-zone-c-h5xjf-7n7kt/192.168.142.174
Start Time:       Tue, 19 Aug 2025 10:10:41 +0200
Labels:           &lt;none&gt;
Annotations:      &lt;none&gt;
Status:           Running
IP:               10.240.0.203
IPs:
  IP:  10.240.0.203
Containers:
  nginx:
    Container ID:   containerd://c38c0a0e19970503ad1bfaa0c74b5cc320cb9df08456c7613b9a9a8c908b9190
    Image:          nginx
    Image ID:       docker.io/library/nginx@sha256:33e0bbc7ca9ecf108140af6288c7c9d1ecc77548cbfd3952fd8466a75edefe57
    Port:           &lt;none&gt;
    Host Port:      &lt;none&gt;
    State:          Running
      Started:      Tue, 19 Aug 2025 10:11:42 +0200
    Ready:          True
    Restart Count:  0
    Environment:    &lt;none&gt;
    Mounts:
      /usr/share/nginx/html from encrypted-volume (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-vbcnk (ro)
Conditions:
  Type                        Status
  PodReadyToStartContainers   True
  Initialized                 True
  Ready                       True
  ContainersReady             True
  PodScheduled                True
Volumes:
  encrypted-volume:
    Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
    ClaimName:  pvc-luks
    ReadOnly:   false
  kube-api-access-vbcnk:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  3607
    ConfigMapName:           kube-root-ca.crt
    ConfigMapOptional:       &lt;nil&gt;
    DownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              &lt;none&gt;
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                             node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type     Reason                  Age                    From                     Message
  ----     ------                  ----                   ----                     -------
  Normal   Scheduled               3m48s                  default-scheduler        Successfully assigned test-pvc-luks/pod-with-encrypted-volume to my-pool-zone-c-h5xjf-7n7kt
  Warning  FailedAttachVolume      3m25s (x6 over 3m43s)  attachdetach-controller  AttachVolume.Attach failed for volume "ovh-managed-kubernetes-siti343p-pvc-3a3b1d2e-ebdf-41a2-8f8f-4ee6984b6149" : rpc error: code = Internal desc = [ControllerPublishVolume] Attach Volume failed with error failed to attach b76d1025-9473-4050-86be-4880f0f625cb volume to 516c41cf-9637-4b08-a75e-1d265d1773f4 compute: Bad request with: [POST https://compute.eu-west-par.cloud.ovh.net/v2.1/a212a1e43b614c4ba27a247b890fcf59/servers/516c41cf-9637-4b08-a75e-1d265d1773f4/os-volume_attachments], error message: {"badRequest": {"code": 400, "message": "Invalid input received: Invalid volume: Volume b76d1025-9473-4050-86be-4880f0f625cb status must be available or downloading to reserve, but the current status is creating. (HTTP 400) (Request-ID: req-e94505fd-39d6-496c-bc6d-275cd2604dda)"}}
  Normal   SuccessfulAttachVolume  3m8s                   attachdetach-controller  AttachVolume.Attach succeeded for volume "ovh-managed-kubernetes-siti343p-pvc-3a3b1d2e-ebdf-41a2-8f8f-4ee6984b6149"
  Normal   Pulling                 2m53s                  kubelet                  Pulling image "nginx"
  Normal   Pulled                  2m48s                  kubelet                  Successfully pulled image "nginx" in 5.072s (5.072s including waiting). Image size: 72324501 bytes.
  Normal   Created                 2m48s                  kubelet                  Created container: nginx
  Normal   Started                 2m48s                  kubelet                  Started container nginx</code></pre>



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



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



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



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



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

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



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



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



<p>🎉</p>



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



<p>In this blog post we saw a basic (but concrete) usage of the encrypted <code>Persistent Volume</code> on OVHcloud Kubernetes clusters that just bee released, don&#8217;t hesitate to think about it for your sensitive data.<br><br>In the coming months, the encrypted <strong>Block Storage</strong> will be available worldwide. Follow the <a href="https://github.com/ovh/public-cloud-roadmap/issues/307" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Encrypted Block Volumes</a> issue on GitHub to stay informed.<br><br>And don&#8217;t hesitate to take a look to our <a href="https://github.com/orgs/ovh/projects/16" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Cloud Roadmap &amp; Changelog</a> to see the state of all of the coming features in OVHcloud Public Cloud products.</p>
<img loading="lazy" decoding="async" src="//blog.ovhcloud.com/wp-content/plugins/matomo/app/matomo.php?idsite=1&amp;rec=1&amp;url=https%3A%2F%2Fblog.ovhcloud.com%2Fcreate-encrypted-persistent-volumes-on-ovhcloud-managed-kubernetes-clusters-with-luks%2F&amp;action_name=Create%20encrypted%20Persistent%20Volumes%20on%20OVHcloud%20Managed%20Kubernetes%20clusters%20with%20LUKS&amp;urlref=https%3A%2F%2Fblog.ovhcloud.com%2Ffeed%2F" style="border:0;width:0;height:0" width="0" height="0" alt="" />]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Discover Kubernetes 1.33 features &#8211; Topology aware routing in multi-zones Kubernetes clusters</title>
		<link>https://blog.ovhcloud.com/discover-kubernetes-1-33-features-topology-aware-routing-in-multi-zones-kubernetes-clusters/</link>
		
		<dc:creator><![CDATA[Aurélie Vache]]></dc:creator>
		<pubDate>Tue, 17 Jun 2025 07:05:40 +0000</pubDate>
				<category><![CDATA[OVHcloud Engineering]]></category>
		<category><![CDATA[Tranches de Tech & co]]></category>
		<category><![CDATA[3AZ]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[Kubernetes 1.33]]></category>
		<category><![CDATA[MKS]]></category>
		<category><![CDATA[multi-zone cluster]]></category>
		<category><![CDATA[OVHcloud]]></category>
		<category><![CDATA[Public Cloud]]></category>
		<guid isPermaLink="false">https://blog.ovhcloud.com/?p=29191</guid>

					<description><![CDATA[Kubernetes 1.33 version has just been released few days/weeks ago.As this new release contains 64 enhancements (!), it can not be easy to know what are the interesting and useful features and how to use them. In this blog post, let&#8217;s discover one of interesting and useful new feature: &#8220;Topology aware routing in multi-zones Kubernetes [&#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%2Fdiscover-kubernetes-1-33-features-topology-aware-routing-in-multi-zones-kubernetes-clusters%2F&amp;action_name=Discover%20Kubernetes%201.33%20features%20%26%238211%3B%20Topology%20aware%20routing%20in%20multi-zones%20Kubernetes%20clusters&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-full is-resized"><img loading="lazy" decoding="async" width="1014" height="1022" src="https://blog.ovhcloud.com/wp-content/uploads/2025/06/mks3az-kubernetes-1.33-small.png" alt="" class="wp-image-29240" style="width:436px;height:auto" srcset="https://blog.ovhcloud.com/wp-content/uploads/2025/06/mks3az-kubernetes-1.33-small.png 1014w, https://blog.ovhcloud.com/wp-content/uploads/2025/06/mks3az-kubernetes-1.33-small-298x300.png 298w, https://blog.ovhcloud.com/wp-content/uploads/2025/06/mks3az-kubernetes-1.33-small-150x150.png 150w, https://blog.ovhcloud.com/wp-content/uploads/2025/06/mks3az-kubernetes-1.33-small-768x774.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2025/06/mks3az-kubernetes-1.33-small-70x70.png 70w" sizes="auto, (max-width: 1014px) 100vw, 1014px" /></figure>



<p><a href="https://kubernetes.io/blog/2025/04/23/kubernetes-v1-33-release/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Kubernetes 1.33 version</a> has just been released few days/weeks ago.<br>As this new release contains 64 enhancements (!), it can not be easy to know what are the interesting and useful features and how to use them.</p>



<p>In this blog post, let&#8217;s discover one of interesting and useful new feature: &#8220;Topology aware routing in multi-zones Kubernetes clusters&#8221;.</p>



<p>⚠️ Kubernetes 1.33 should be available on OVHcloud MKS clusters at the end of June/beginning of July but the demo is working also on MKS with Kubernetes 1.32 release 😉.</p>



<h2 class="wp-block-heading">Topology aware routing</h2>



<p>Since Kubernetes 1.33, the <a href="https://kubernetes.io/docs/concepts/services-networking/topology-aware-routing/" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external">topology aware routing and traffic distribution</a> feature is in General Availability (GA).</p>



<p>This feature allows to optimize service traffic in multi-zone clusters and reduce latency and cross-zone data transfer cost.</p>



<p>Topology Aware Routing provides a mechanism to help <strong>keep traffic within the zone</strong> it originated from.</p>



<p>In a context of multi-zone clusters, it helps reliability, performance, <strong>reduce costs</strong> or <strong>improve network performance</strong>.</p>



<p>As OVHcloud just released, in Beta, the launch of their <a href="https://labs.ovhcloud.com/en/managed-kubernetes-service-mks-premium-plan/" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external">Managed Kubernetes clusters (MKS) on 3 AZ (Availability Zones)</a>, it&#8217;s the perfect occasion for me to test this brand new Kubernetes feature 🙂.</p>



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



<p>Prerequisite: Have a Kubernetes cluster with at least 2 nodes running in 2 different zones.</p>



<p>If you already don&#8217;t have one, you can follow <a href="https://blog.ovhcloud.com/deploy-your-workloads-on-3-availability-zones-with-our-new-managed-kubernetes-services-mks-premium-plan/" data-wpel-link="internal">this blog post</a> in order to <a href="https://blog.ovhcloud.com/deploy-your-workloads-on-3-availability-zones-with-our-new-managed-kubernetes-services-mks-premium-plan/" data-wpel-link="internal">create an OVHcloud MKS cluster with 3 nodes pools</a>, one per AZ.</p>



<p>On my side I set-up a MKS cluster in 3AZ (one per node pool), with 3 nodes per node pool:</p>



<pre class="wp-block-code"><code class="">$ kubectx kubernetes-admin@multi-zone-mks
Switched to context "kubernetes-admin@multi-zone-mks".

$ kubectl get np
NAME             FLAVOR   AUTOSCALED   MONTHLYBILLED   ANTIAFFINITY   DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   MIN   MAX   AGE
my-pool-zone-a   b3-8     false        false           false          3         3         3            3           0     100   20d
my-pool-zone-b   b3-8     false        false           false          3         3         3            3           0     100   20d
my-pool-zone-c   b3-8     false        false           false          3         3         3            3           0     100   20d

$ kubectl get no
NAME                         STATUS   ROLES    AGE   VERSION
my-pool-zone-a-b9ztj-brgpq   Ready    &lt;none&gt;   20d   v1.32.3
my-pool-zone-a-b9ztj-gt5vd   Ready    &lt;none&gt;   20d   v1.32.3
my-pool-zone-a-b9ztj-mss8j   Ready    &lt;none&gt;   20d   v1.32.3
my-pool-zone-b-tr6wf-5wfgz   Ready    &lt;none&gt;   20d   v1.32.3
my-pool-zone-b-tr6wf-ct7fs   Ready    &lt;none&gt;   20d   v1.32.3
my-pool-zone-b-tr6wf-vlkwg   Ready    &lt;none&gt;   20d   v1.32.3
my-pool-zone-c-wgrl6-b2f9s   Ready    &lt;none&gt;   20d   v1.32.3
my-pool-zone-c-wgrl6-lp22l   Ready    &lt;none&gt;   20d   v1.32.3
my-pool-zone-c-wgrl6-slkq5   Ready    &lt;none&gt;   20d   v1.32.3</code></pre>



<p>⚠️ As you saw, the Kubernetes version installed on my cluster is not equals to 1.33, but the <code>ServiceTrafficDistribution</code> feature gate is in Beta and it is activated:</p>



<pre class="wp-block-code"><code class="">$ kubectl get --raw /metrics | grep kubernetes_feature_enabled | grep Traffic

kubernetes_feature_enabled{name="ServiceTrafficDistribution",stage="BETA"} 1</code></pre>



<p class="has-text-align-center">A visual architecture of my MKS cluster:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="800" height="556" src="https://blog.ovhcloud.com/wp-content/uploads/2025/06/image-11.png" alt="" class="wp-image-29192" srcset="https://blog.ovhcloud.com/wp-content/uploads/2025/06/image-11.png 800w, https://blog.ovhcloud.com/wp-content/uploads/2025/06/image-11-300x209.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2025/06/image-11-768x534.png 768w" sizes="auto, (max-width: 800px) 100vw, 800px" /></figure>



<p>⚠️ In MKS Standard clusters, don&#8217;t forget to <a href="https://help.ovhcloud.com/csm/en-gb-public-cloud-kubernetes-customizing-cilium?id=kb_article_view&amp;sysparm_article=KB0074067" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">enable the topology aware routing for 3AZ region</a>. </p>



<p>In order to test this feature, in a new namespace, we will deploy:</p>



<ul class="wp-block-list">
<li>a deployment with two pods named <code>receiver-xxx</code></li>



<li>a ClusterIP service named <code>svc-prefer-close</code> with the feature enabled</li>



<li>a Pod named <code>sender</code></li>
</ul>



<p>Let&#8217;s do that!</p>



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



<pre class="wp-block-code"><code class="">apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app.kubernetes.io/name: service-traffic-example
  name: receiver
  namespace: prefer-close
spec:
  replicas: 2
  selector:
    matchLabels:
      app: service-traffic-example
  template:
    metadata:
      labels:
        app: service-traffic-example
    spec:
      containers:
      - image: scraly/hello-pod:1.0.1
        name: receiver
        ports:
        - containerPort: 8080
        env:
          - name: NODE_NAME
            valueFrom:
              fieldRef:
                fieldPath: spec.nodeName</code></pre>



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



<pre class="wp-block-code"><code class="">apiVersion: v1
kind: Service
metadata:
  name: svc-prefer-close
  namespace: prefer-close
  annotations:
    service.kubernetes.io/topology-mode: auto
spec:
  ports:
    - name: http
      protocol: TCP
      port: 8080
      targetPort: 8080
  selector:
    app: service-traffic-example
  type: ClusterIP
  trafficDistribution: PreferClose</code></pre>



<p>As you can see, this Service has two specific configurations.<br>First, we added the <code>service.kubernetes.io/topology-mode: auto</code> annotation to enable Topology Aware Routing for a Service.<br>Then, we configured the <code>trafficDistribution</code> to <code>PreferClose</code> in order to ask Kubernetes to send the traffic, preferably, to a pod that is &#8220;closed&#8221; to the sender.</p>



<p>Create a new namespace and apply the manifest files:</p>



<pre class="wp-block-code"><code class="">$ kubectl create ns prefer-close
$ kubectl apply -f deploy.yaml
$ kubectl apply -f svc.yaml</code></pre>



<p>Result:<br>You should have two running Pods on 2 differents Nodes.</p>



<pre class="wp-block-code"><code class="">$ kubectl get po -o wide -n prefer-close

NAME                        READY   STATUS              RESTARTS   AGE   IP            NODE                         NOMINATED NODE   READINESS GATES
receiver-7cfd89d78d-dhv6z   1/1     Running             0          94s   10.240.4.91   my-pool-zone-c-wgrl6-slkq5   &lt;none&gt;           &lt;none&gt;
receiver-7cfd89d78d-hrxrt   1/1     Running             0          94s   10.240.5.63   my-pool-zone-a-b9ztj-mss8j   &lt;none&gt;           &lt;none&gt;</code></pre>



<p>OK, <code>receiver-xxxxxxxx-dhv6z</code> is running on <code>my-pool-zone-c-xxxx</code> and the other pod is running on <code>my-pool-zone-a-xxxx</code>. There are running on differents Availability Zones.</p>



<p>Now, we can create a Pod <code>sender</code>. it will be scheduled on a Node:</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="800" height="556" src="https://blog.ovhcloud.com/wp-content/uploads/2025/06/image-12.png" alt="" class="wp-image-29193" srcset="https://blog.ovhcloud.com/wp-content/uploads/2025/06/image-12.png 800w, https://blog.ovhcloud.com/wp-content/uploads/2025/06/image-12-300x209.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2025/06/image-12-768x534.png 768w" sizes="auto, (max-width: 800px) 100vw, 800px" /></figure>



<p>Run it and execute a <code>curl</code> command to test the traffic redirection to the &#8220;svc-prefer-close&#8221; Service:</p>



<pre class="wp-block-code"><code class="">$ kubectl run sender -n prefer-close --image=curlimages/curl -it -- sh
If you don't see a command prompt, try pressing enter.
~ $ curl http://svc-prefer-close.prefer-close:8080
Version: 1.0.1
Hostname: receiver-7cfd89d78d-dhv6z
Node: my-pool-zone-c-wgrl6-slkq5</code></pre>



<p>Let&#8217;s verify where are our Pods:</p>



<pre class="wp-block-code"><code class="">$ kubectl get po -n prefer-close -o wide
NAME                        READY   STATUS    RESTARTS     AGE   IP             NODE                         NOMINATED NODE   READINESS GATES
receiver-7cfd89d78d-dhv6z   1/1     Running   0            9d    10.240.4.91    my-pool-zone-c-wgrl6-slkq5   &lt;none&gt;           &lt;none&gt;
receiver-7cfd89d78d-hrxrt   1/1     Running   0            9d    10.240.5.63    my-pool-zone-a-b9ztj-mss8j   &lt;none&gt;           &lt;none&gt;
sender                      1/1     Running   1 (5s ago)   21s   10.240.3.134   my-pool-zone-c-wgrl6-b2f9s   &lt;none&gt;           &lt;none&gt;</code></pre>



<p>Kube-proxy sent the traffic from <code>sender</code> to a <code>receiver-xx</code> Pod on the same Availability Zone 🎉</p>



<p>⚠️ Note that because <code>preferClose</code> means &#8220;topologically proximate&#8221;, it may vary across implementations and could encompass endpoints within the same node, rack, zone, or even region.</p>



<h2 class="wp-block-heading"><a href="https://dev.to/aurelievache/discover-kubernetes-133-topology-aware-routing-with-trafficdistribution-preferclose-2m66-temp-slug-8063145?preview=9c6673fc1c1d618ab0b2d7e86274fa1bcad2630e2e947e73c16022ee80128700654e53730ba787bd5407154bcb2dde6f5bed3b7e112a11034df4aefc#how-is-it-working" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer"></a> How is it working?</h2>



<p>When calculating the endpoints for a Service, the EndpointSlice controller considers the topology (region and zone) of each endpoint and populates the hints field to allocate it to a zone.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="800" height="598" src="https://blog.ovhcloud.com/wp-content/uploads/2025/06/image-13.png" alt="" class="wp-image-29194" srcset="https://blog.ovhcloud.com/wp-content/uploads/2025/06/image-13.png 800w, https://blog.ovhcloud.com/wp-content/uploads/2025/06/image-13-300x224.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2025/06/image-13-768x574.png 768w" sizes="auto, (max-width: 800px) 100vw, 800px" /></figure>



<p>Cluster components such as <em>kube-proxy</em> can then consume those hints, and use them to influence how the traffic is routed (favoring topologically closer endpoints).</p>



<p>So, with <code>PreferClose</code> value for <code>trafficDistribution</code>, we ask kube-proxy to redirect traffic to the nearest available endpoints based on the network topology.</p>



<p>That&#8217;s why the option is called <code>Prefer</code><code>Close</code>.</p>



<h2 class="wp-block-heading"><a href="https://dev.to/aurelievache/discover-kubernetes-133-topology-aware-routing-with-trafficdistribution-preferclose-2m66-temp-slug-8063145?preview=9c6673fc1c1d618ab0b2d7e86274fa1bcad2630e2e947e73c16022ee80128700654e53730ba787bd5407154bcb2dde6f5bed3b7e112a11034df4aefc#whats-next" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer"></a> What&#8217;s next?</h2>



<p>In the future you will be able to configure the <code>trafficDistribution</code> field with other values.</p>



<p>Indeed, two new values, more explicit, are currently in Alpha since the Kubernetes 1.33 release: <code>PreferSameZone</code> and <code>PreferSameNode</code>.</p>



<figure class="wp-block-image aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="800" height="917" src="https://blog.ovhcloud.com/wp-content/uploads/2025/06/image-14.png" alt="" class="wp-image-29195" style="width:527px;height:auto" srcset="https://blog.ovhcloud.com/wp-content/uploads/2025/06/image-14.png 800w, https://blog.ovhcloud.com/wp-content/uploads/2025/06/image-14-262x300.png 262w, https://blog.ovhcloud.com/wp-content/uploads/2025/06/image-14-768x880.png 768w" sizes="auto, (max-width: 800px) 100vw, 800px" /></figure>



<p>Personally I can&#8217;t wait to test them 😇.</p>



<h2 class="wp-block-heading">Want to go further?</h2>



<p>Want to learn more on this topic? In the coming days, we will publish a blog post about MKS Premium plan.</p>



<p>Visit our <a href="https://labs.ovhcloud.com/en/managed-kubernetes-service-mks-premium-plan/" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external">Managed Kubernetes Service (MKS) Premium plan</a> in the OVHcloud Labs website to know more about Premium MKS.</p>



<p>Join the <strong>free</strong> Beta: <a href="https://labs.ovhcloud.com/en/managed-kubernetes-service-mks-premium-plan/" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external">https://labs.ovhcloud.com/en/managed-kubernetes-service-mks-premium-plan/</a></p>



<p>Read the documentation about the new <a href="https://help.ovhcloud.com/csm/fr-public-cloud-kubernetes-premium?id=kb_article_view&amp;sysparm_article=KB0067581" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external">Managed Kubernetes Service (MKS) Premium plan</a>.</p>



<p>Join us on <a href="https://discord.com/channels/850031577277792286/1366761790150541402" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external">Discord</a> and give us your feedbacks.</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%2Fdiscover-kubernetes-1-33-features-topology-aware-routing-in-multi-zones-kubernetes-clusters%2F&amp;action_name=Discover%20Kubernetes%201.33%20features%20%26%238211%3B%20Topology%20aware%20routing%20in%20multi-zones%20Kubernetes%20clusters&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>Deploy your workloads on 3 availability zones with our new Managed Kubernetes Services (MKS) &#8216;Premium&#8217; plan</title>
		<link>https://blog.ovhcloud.com/deploy-your-workloads-on-3-availability-zones-with-our-new-managed-kubernetes-services-mks-premium-plan/</link>
		
		<dc:creator><![CDATA[Aurélie Vache]]></dc:creator>
		<pubDate>Mon, 19 May 2025 05:20:42 +0000</pubDate>
				<category><![CDATA[OVHcloud Engineering]]></category>
		<category><![CDATA[Tranches de Tech & co]]></category>
		<category><![CDATA[3AZ]]></category>
		<category><![CDATA[Beta]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[milti-AZ]]></category>
		<category><![CDATA[MKS]]></category>
		<guid isPermaLink="false">https://blog.ovhcloud.com/?p=28796</guid>

					<description><![CDATA[This blog post will first explain briefly what is the new MKS Premium plan, for who and which use case, then you will see how to deploy a new MKS cluster in 3 availability zones and how to deploy your workloads with this new architecture of Kubernetes cluster. What&#8217;s inside the Premium MKS? The 30th [&#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%2Fdeploy-your-workloads-on-3-availability-zones-with-our-new-managed-kubernetes-services-mks-premium-plan%2F&amp;action_name=Deploy%20your%20workloads%20on%203%20availability%20zones%20with%20our%20new%20Managed%20Kubernetes%20Services%20%28MKS%29%20%26%238216%3BPremium%26%238217%3B%20plan&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="890" height="1024" src="https://blog.ovhcloud.com/wp-content/uploads/2025/05/mks-3Apremium-ovh-890x1024.png" alt="" class="wp-image-28908" style="width:336px;height:auto" srcset="https://blog.ovhcloud.com/wp-content/uploads/2025/05/mks-3Apremium-ovh-890x1024.png 890w, https://blog.ovhcloud.com/wp-content/uploads/2025/05/mks-3Apremium-ovh-261x300.png 261w, https://blog.ovhcloud.com/wp-content/uploads/2025/05/mks-3Apremium-ovh-768x884.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2025/05/mks-3Apremium-ovh-1335x1536.png 1335w, https://blog.ovhcloud.com/wp-content/uploads/2025/05/mks-3Apremium-ovh-1780x2048.png 1780w, https://blog.ovhcloud.com/wp-content/uploads/2025/05/mks-3Apremium-ovh.png 2048w" sizes="auto, (max-width: 890px) 100vw, 890px" /></figure>



<p>This blog post will first explain briefly what is the new MKS Premium plan, for who and which use case, then you will see how to deploy a new MKS cluster in 3 availability zones and how to deploy your workloads with this new architecture of Kubernetes cluster.</p>



<h2 class="wp-block-heading">What&#8217;s inside the Premium MKS?</h2>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="120" height="120" src="https://blog.ovhcloud.com/wp-content/uploads/2025/05/pci_product-managed-kubernetes-service.png" alt="" class="wp-image-28902" srcset="https://blog.ovhcloud.com/wp-content/uploads/2025/05/pci_product-managed-kubernetes-service.png 120w, https://blog.ovhcloud.com/wp-content/uploads/2025/05/pci_product-managed-kubernetes-service-70x70.png 70w" sizes="auto, (max-width: 120px) 100vw, 120px" /></figure>



<p>The 30th of April, we launched, in Beta, our brand new &#8220;Premium plan&#8221; of our Managed Kubernetes Services (MKS) 🎉</p>



<p>Concretely, with MKS Premium you will have:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="455" src="https://blog.ovhcloud.com/wp-content/uploads/2025/05/image-19-1024x455.png" alt="" class="wp-image-28924" srcset="https://blog.ovhcloud.com/wp-content/uploads/2025/05/image-19-1024x455.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2025/05/image-19-300x133.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2025/05/image-19-768x341.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2025/05/image-19-1536x683.png 1536w, https://blog.ovhcloud.com/wp-content/uploads/2025/05/image-19.png 1570w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>💡 For the moment, only Paris is available for the 3AZ region but several new regions will be available in the coming months including Milan.</p>



<p>Behind this new plan, this new version of our MKS offering actually represents a complete overhaul of our platform based on several <a href="https://www.cncf.io/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Cloud Native</a> Open Source projects like <a href="https://cluster-api.sigs.k8s.io/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Cluster API</a>, <a href="https://kamaji.clastix.io/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Kamaji</a>, <a href="https://argo-cd.readthedocs.io/en/stable/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">ArgoCD</a> and several homemade Kubernetes operators.</p>



<h2 class="wp-block-heading">For who? For what?</h2>



<p>The new MKS Premium plan has been designed for those who wants high availability and scalability of their critical applications.</p>



<p>Thanks to a dedicated and fully managed control plane, resilience across multiple availability zones, dedicated resources for the Kubernetes control plane, and the ability to deploy the data plane across multiple availability zones.</p>



<p>You will be able to design cloud-native applications that are resilient to failures and deploy highly resilient cloud-native applications across our multi-zones region. </p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="485" src="https://blog.ovhcloud.com/wp-content/uploads/2025/05/image-1024x485.png" alt="" class="wp-image-28799" srcset="https://blog.ovhcloud.com/wp-content/uploads/2025/05/image-1024x485.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2025/05/image-300x142.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2025/05/image-768x364.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2025/05/image.png 1120w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>You will have the full control on how to deploy your worker node in our <strong>new 3AZ region</strong> (EU-WEST-PAR).</p>



<p>Deploying your cloud-native applications in our new Paris 3-AZ region also means enjoying the full range of services available:</p>



<ul class="wp-block-list">
<li>Well architected application relying on resilient managed services (MKS + Load Balancer + Gateway + DBaaS + Object Storage &#8230;),</li>



<li>Advanced internal cluster networking with the new <a href="https://cilium.io/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Cilium</a> CNI</li>



<li>Better API server performances and scaling capacity</li>



<li>And much more to come!</li>
</ul>



<h2 class="wp-block-heading">Let&#8217;s deploy a MKS Premium cluster in 3 AZ at Paris!</h2>



<figure class="wp-block-image aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="960" height="797" src="https://blog.ovhcloud.com/wp-content/uploads/2025/05/image-14.png" alt="" class="wp-image-28906" style="width:300px;height:auto" srcset="https://blog.ovhcloud.com/wp-content/uploads/2025/05/image-14.png 960w, https://blog.ovhcloud.com/wp-content/uploads/2025/05/image-14-300x249.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2025/05/image-14-768x638.png 768w" sizes="auto, (max-width: 960px) 100vw, 960px" /></figure>



<p>Like the actual Standard MKS, you can deploy MKS on the 3AZ via the Control Panel (OVHcloud UI), the API and also our Infrastructure as Code (IaC) providers (Terraform/OpenTofu, Pulumi&#8230;).</p>



<p>In this blog post, we will deploy a new MKS cluster, in a 3AZ region (Paris) with 3 node pools (one per availability zone).</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="547" src="https://blog.ovhcloud.com/wp-content/uploads/2025/05/image-21-1024x547.png" alt="" class="wp-image-28933" srcset="https://blog.ovhcloud.com/wp-content/uploads/2025/05/image-21-1024x547.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2025/05/image-21-300x160.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2025/05/image-21-768x410.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2025/05/image-21-1536x820.png 1536w, https://blog.ovhcloud.com/wp-content/uploads/2025/05/image-21.png 1854w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h3 class="wp-block-heading">With OVHcloud Control Panel</h3>



<p>Log in to the&nbsp;<a href="https://www.ovh.com/auth/?action=gotomanager&amp;from=https://www.ovh.co.uk/&amp;ovhSubsidiary=GB" data-wpel-link="exclude">OVHcloud Control Panel</a>, go to the&nbsp;<code><strong>Public Cloud</strong></code>&nbsp;section and select the <strong>Public Cloud </strong>project concerned.</p>



<p>In the left panel, go in the <strong>Containers &amp; Orchestration</strong> section, click on <strong>Managed Kubernetes Service</strong> link and click on the <strong>Create a Kubernetes cluster</strong> button</p>



<p>Fill the name of the cluster, choose a 3AZ region, click on Paris (EU-WEST-PAR) and select the Premium plan:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="695" src="https://blog.ovhcloud.com/wp-content/uploads/2025/05/image-3-1024x695.png" alt="" class="wp-image-28816" srcset="https://blog.ovhcloud.com/wp-content/uploads/2025/05/image-3-1024x695.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2025/05/image-3-300x204.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2025/05/image-3-768x521.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2025/05/image-3-1536x1043.png 1536w, https://blog.ovhcloud.com/wp-content/uploads/2025/05/image-3.png 1750w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Then, select the Kubernetes version and the security policy.</p>



<p>⚠️  Contrary to the Standard MKS, which is public by default, the Premium MKS is private by default so it is mandatory to create a private network, a subnet and a gateway.</p>



<p>Then, create one node pool by Availability Zone, with 3 nodes by node pool, for example:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="487" src="https://blog.ovhcloud.com/wp-content/uploads/2025/05/image-6-1024x487.png" alt="" class="wp-image-28871" srcset="https://blog.ovhcloud.com/wp-content/uploads/2025/05/image-6-1024x487.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2025/05/image-6-300x143.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2025/05/image-6-768x365.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2025/05/image-6-1536x730.png 1536w, https://blog.ovhcloud.com/wp-content/uploads/2025/05/image-6.png 1884w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Confirm the creation of your cluster and wait its creation.</p>



<p>Finally, click on the new created cluster and get the kubeconfig file.</p>



<h3 class="wp-block-heading">With Terraform</h3>



<p>In a previous blog post, we showed you <a href="https://blog.ovhcloud.com/infrastructure-as-code-iac-on-ovhcloud-part-1-terraform-opentofu/" data-wpel-link="internal">how to deploy a MKs cluster with Terraform/OpenTofu</a>. Please read the post if you are not familiar with Terraform or OpenTofu.</p>



<p>Create a <strong>ovh_kube.tf</strong> file with the following content:</p>



<pre class="wp-block-code"><code class="">resource "ovh_cloud_project_network_private" "network" {<br>  service_name = var.service_name<br>  vlan_id      = 84<br>  name         = "terraform_mks_multiaz_private_net"<br>  regions      = ["EU-WEST-PAR"]<br>}<br><br>resource "ovh_cloud_project_network_private_subnet" "subnet" {<br>  service_name = ovh_cloud_project_network_private.network.service_name<br>  network_id   = ovh_cloud_project_network_private.network.id<br><br>  # whatever region, for test purpose<br>  region     = "EU-WEST-PAR"<br>  start      = "192.168.142.100"<br>  end        = "192.168.142.200"<br>  network    = "192.168.142.0/24"<br>  dhcp       = true<br>  no_gateway = false<br>}<br><br>resource "ovh_cloud_project_gateway" "gateway" {<br>  service_name = ovh_cloud_project_network_private.network.service_name<br>  name       = "gateway"<br>  model      = "s"<br>  region     = "EU-WEST-PAR"<br>  network_id = tolist(ovh_cloud_project_network_private.network.regions_attributes[*].openstackid)[0]<br>  subnet_id  = ovh_cloud_project_network_private_subnet.subnet.id<br>}<br><br>resource "ovh_cloud_project_kube" "my_multizone_cluster" {<br>  service_name  = ovh_cloud_project_network_private.network.service_name<br>  name          = "multi-zone-mks"<br>  region        = "EU-WEST-PAR"<br>  plan          = "standard"<br><br>  private_network_id = tolist(ovh_cloud_project_network_private.network.regions_attributes[*].openstackid)[0]<br>  nodes_subnet_id    = ovh_cloud_project_network_private_subnet.subnet.id<br><br>  depends_on    = [ ovh_cloud_project_gateway.gateway ] //Gateway is mandatory for multizones cluster<br>}<br><br>resource "ovh_cloud_project_kube_nodepool" "node_pool_multi_zones_a" {<br>  service_name       = ovh_cloud_project_network_private.network.service_name<br>  kube_id            = ovh_cloud_project_kube.my_multizone_cluster.id<br>  name               = "my-pool-zone-a" //Warning: "_" char is not allowed!<br>  flavor_name        = "b3-8"<br>  desired_nodes      = 3<br>  availability_zones = ["eu-west-par-a"] //Currently, only one zone is supported<br>}<br><br>resource "ovh_cloud_project_kube_nodepool" "node_pool_multi_zones_b" {<br>  service_name       = ovh_cloud_project_network_private.network.service_name<br>  kube_id            = ovh_cloud_project_kube.my_multizone_cluster.id<br>  name               = "my-pool-zone-b"<br>  flavor_name        = "b3-8"<br>  desired_nodes      = 3<br>  availability_zones = ["eu-west-par-b"]<br>}<br><br>resource "ovh_cloud_project_kube_nodepool" "node_pool_multi_zones_c" {<br>  service_name       = ovh_cloud_project_network_private.network.service_name<br>  kube_id            = ovh_cloud_project_kube.my_multizone_cluster.id<br>  name               = "my-pool-zone-c"<br>  flavor_name        = "b3-8"<br>  desired_nodes      = 3<br>  availability_zones = ["eu-west-par-c"]<br>}<br><br>output "kubeconfig_file_eu_west_par" {<br>  value     = ovh_cloud_project_kube.my_multizone_cluster.kubeconfig<br>  sensitive = true<br>}</code></pre>



<p>This HCL configuration will create several OVHcloud services:</p>



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



<li>a subnet</li>



<li>a gateway (S size)</li>



<li>a MKS cluster in EU_WEST_PAR region</li>



<li>one node pool in <strong>eu-west-par-a</strong> availability zone with 3 nodes</li>



<li>one node pool in <strong>eu-west-par-b</strong> availability zone with 3 nodes</li>



<li>one node pool in <strong>eu-west-par-c</strong> availability zone with 3 nodes</li>
</ul>



<p>Apply the configuration:</p>



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

...

ovh_cloud_project_network_private.network: Creating...
ovh_cloud_project_network_private.network: Still creating... [10s elapsed]
ovh_cloud_project_network_private.network: Creation complete after 14s [id=pn-xxxxxxxx_xx]
ovh_cloud_project_network_private_subnet.subnet: Creating...
ovh_cloud_project_network_private_subnet.subnet: Creation complete after 3s [id=c14cbb87-xxxx-xxxx-xxxx-7b9d4940d857]
ovh_cloud_project_gateway.gateway: Creating...
ovh_cloud_project_gateway.gateway: Still creating... [10s elapsed]
ovh_cloud_project_gateway.gateway: Creation complete after 13s [id=7dafdcfe-xxxx-xxxx-xxxx-240df8f93af1]
ovh_cloud_project_kube.my_multizone_cluster: Creating...
ovh_cloud_project_kube.my_multizone_cluster: Still creating... [10s elapsed]
ovh_cloud_project_kube.my_multizone_cluster: Still creating... [20s elapsed]
ovh_cloud_project_kube.my_multizone_cluster: Still creating... [30s elapsed]
...
ovh_cloud_project_kube.my_multizone_cluster: Still creating... [1m40s elapsed]
ovh_cloud_project_kube.my_multizone_cluster: Still creating... [1m50s elapsed]
ovh_cloud_project_kube.my_multizone_cluster: Still creating... [2m0s elapsed]
ovh_cloud_project_kube.my_multizone_cluster: Creation complete after 2m2s [id=0196cd9a-xxxx-xxxx-xxxx-3acbb48d6dda]
ovh_cloud_project_kube_nodepool.node_pool_multi_zones_c: Creating...
ovh_cloud_project_kube_nodepool.node_pool_multi_zones_a: Creating...
ovh_cloud_project_kube_nodepool.node_pool_multi_zones_b: Creating...
ovh_cloud_project_kube_nodepool.node_pool_multi_zones_c: Still creating... [10s elapsed]
ovh_cloud_project_kube_nodepool.node_pool_multi_zones_a: Still creating... [10s elapsed]
ovh_cloud_project_kube_nodepool.node_pool_multi_zones_b: Still creating... [10s elapsed]
ovh_cloud_project_kube_nodepool.node_pool_multi_zones_c: Still creating... [20s elapsed]
ovh_cloud_project_kube_nodepool.node_pool_multi_zones_a: Still creating... [20s elapsed]
ovh_cloud_project_kube_nodepool.node_pool_multi_zones_b: Still creating... [20s elapsed]
ovh_cloud_project_kube_nodepool.node_pool_multi_zones_a: Still creating... [30s elapsed]
ovh_cloud_project_kube_nodepool.node_pool_multi_zones_c: Still creating... [30s elapsed]
ovh_cloud_project_kube_nodepool.node_pool_multi_zones_b: Still creating... [30s elapsed]
ovh_cloud_project_kube_nodepool.node_pool_multi_zones_a: Still creating... [40s elapsed]
ovh_cloud_project_kube_nodepool.node_pool_multi_zones_c: Still creating... [40s elapsed]
ovh_cloud_project_kube_nodepool.node_pool_multi_zones_b: Still creating... [40s elapsed]
...
ovh_cloud_project_kube_nodepool.node_pool_multi_zones_c: Still creating... [4m0s elapsed]
ovh_cloud_project_kube_nodepool.node_pool_multi_zones_b: Still creating... [4m0s elapsed]
ovh_cloud_project_kube_nodepool.node_pool_multi_zones_c: Still creating... [4m10s elapsed]
ovh_cloud_project_kube_nodepool.node_pool_multi_zones_a: Still creating... [4m10s elapsed]
ovh_cloud_project_kube_nodepool.node_pool_multi_zones_b: Still creating... [4m10s elapsed]
ovh_cloud_project_kube_nodepool.node_pool_multi_zones_a: Still creating... [4m20s elapsed]
ovh_cloud_project_kube_nodepool.node_pool_multi_zones_c: Still creating... [4m20s elapsed]
ovh_cloud_project_kube_nodepool.node_pool_multi_zones_b: Still creating... [4m20s elapsed]
ovh_cloud_project_kube_nodepool.node_pool_multi_zones_c: Creation complete after 4m24s [id=0196cd9c-xxxx-xxxx-xxxx-8e1925c4c18e]
ovh_cloud_project_kube_nodepool.node_pool_multi_zones_b: Creation complete after 4m24s [id=0196cd9c-xxxx-xxxx-xxxx-96a18b9202ff]
ovh_cloud_project_kube_nodepool.node_pool_multi_zones_a: Still creating... [4m30s elapsed]
ovh_cloud_project_kube_nodepool.node_pool_multi_zones_a: Creation complete after 4m35s [id=0196cd9c-xxxx-xxxx-xxxx-8a08cdc2e68d]

Apply complete! Resources: 7 added, 0 changed, 0 destroyed.

Outputs:

kubeconfig_file_eu_west_par = &lt;sensitive&gt;</code></pre>



<p>Our MKS in 3AZ have been deployed 🎉</p>



<p>To connect into it, retrieve the kubeconfig file locally:</p>



<pre class="wp-block-code"><code class="">$ terraform output -raw kubeconfig_file_eu_west_par &gt; ~/.kube/multi-zone-mks.yml</code></pre>



<h3 class="wp-block-heading">Connect and discover your MKS cluster</h3>



<p>Initialize or append the KUBECONFIG environment variable with the new kubeconfig files:</p>



<pre class="wp-block-code"><code class="">export KUBECONFIG=/Users/my-user/.kube/mks.yml:/Users/my-user/.kube/multi-zone-mks.yml</code></pre>



<p>Display the node pools. Our cluster have 3 nodes pools, one per AZ:</p>



<pre class="wp-block-code"><code class="">$ kubectl get np
NAME             FLAVOR   AUTOSCALED   MONTHLYBILLED   ANTIAFFINITY   DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   MIN   MAX   AGE
my-pool-zone-a   b3-8     false        false           false          3         3         3            3           0     100   7h8m
my-pool-zone-b   b3-8     false        false           false          3         3         3            3           0     100   7h8m
my-pool-zone-c   b3-8     false        false           false          3         3         3            3           0     100   7h8m</code></pre>



<p>You can also display the control plane&#8217;s pods in order to discover the new components of the MKS Premium:</p>



<pre class="wp-block-code"><code class="">$ kubectl get po -n kube-system</code></pre>



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



<h3 class="wp-block-heading">Deploy pods accross several availability zones</h3>



<p>Now, let&#8217;s create a Depoyment with 6 pods and ask Kubernetes to deploy them in our 3 AZ (in the three node pools).</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="713" src="https://blog.ovhcloud.com/wp-content/uploads/2025/05/image-12-1024x713.png" alt="" class="wp-image-28897" srcset="https://blog.ovhcloud.com/wp-content/uploads/2025/05/image-12-1024x713.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2025/05/image-12-300x209.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2025/05/image-12-768x535.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2025/05/image-12-1536x1070.png 1536w, https://blog.ovhcloud.com/wp-content/uploads/2025/05/image-12.png 1588w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>To do that, create a <strong>nginx-cross-az.yam</strong>l file with the following content:</p>



<pre class="wp-block-code"><code class="">apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-cross-az
  labels:
    app: nginx-cross-az
spec:
  replicas: 6
  selector:
    matchLabels:
      app: nginx-cross-az
  template:
    metadata:
      labels:
        app: nginx-cross-az
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: "topology.kubernetes.io/zone"
                operator: In
                values:
                - eu-west-par-a
                - eu-west-par-b
                - eu-west-par-c
      containers:
      - name: nginx
        image: nginx:1.28.0
        ports:
        - containerPort: 80</code></pre>



<p>Thanks to the nodeAffinity feature of Kubernetes, we declare that we want 6 replicas (pods) running in 3 zones: <code>eu-west-par-a</code>, <code>eu-west-par-b</code>, <code>eu-west-par-c</code>.</p>



<p>Create a new namespace and apply the deployment:</p>



<pre class="wp-block-code"><code class="">$ kubectl create ns hello-app
$ kubectl apply -f nginx-cross-az.yaml -n hello-app</code></pre>



<p>As you can see, 6 pods have been created, and they are running on the nodes located in the 3 AZ.</p>



<pre class="wp-block-code"><code class="">$ kubectl get po -o wide -l app=nginx-cross-az -n hello-app
NAME                             READY   STATUS    RESTARTS   AGE    IP             NODE                         NOMINATED NODE   READINESS GATES
nginx-cross-az-6ffd957c4-7528p   1/1     Running   0          6s     10.240.2.140   my-pool-zone-b-tr6wf-5wfgz   &lt;none&gt;           &lt;none&gt;
nginx-cross-az-6ffd957c4-96mnh   1/1     Running   0          6s     10.240.3.91    my-pool-zone-c-wgrl6-b2f9s   &lt;none&gt;           &lt;none&gt;
nginx-cross-az-6ffd957c4-b48cv   1/1     Running   0          115m   10.240.6.182   my-pool-zone-c-wgrl6-lp22l   &lt;none&gt;           &lt;none&gt;
nginx-cross-az-6ffd957c4-k7rwf   1/1     Running   0          115m   10.240.1.237   my-pool-zone-b-tr6wf-ct7fs   &lt;none&gt;           &lt;none&gt;
nginx-cross-az-6ffd957c4-pb7zp   1/1     Running   0          115m   10.240.8.195   my-pool-zone-a-b9ztj-gt5vd   &lt;none&gt;           &lt;none&gt;
nginx-cross-az-6ffd957c4-vhhcw   1/1     Running   0          6s     10.240.7.40    my-pool-zone-a-b9ztj-brgpq   &lt;none&gt;           &lt;none&gt;</code></pre>



<h3 class="wp-block-heading">Deploy pods only in a desired availability zone</h3>



<p>You can also choose to deploy a Deployment with 3 replicas, only in the AZ of your choice, only in <strong>eu-west-par-a</strong> for example.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="713" src="https://blog.ovhcloud.com/wp-content/uploads/2025/05/image-13-1024x713.png" alt="" class="wp-image-28898" srcset="https://blog.ovhcloud.com/wp-content/uploads/2025/05/image-13-1024x713.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2025/05/image-13-300x209.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2025/05/image-13-768x535.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2025/05/image-13-1536x1070.png 1536w, https://blog.ovhcloud.com/wp-content/uploads/2025/05/image-13.png 1588w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Create a <strong>nginx-one-az.yaml</strong> file with the following content:</p>



<pre class="wp-block-code"><code class="">apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-one-az
  labels:
    app: nginx-one-az
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx-one-az
  template:
    metadata:
      labels:
        app: nginx-one-az
    spec:
      nodeSelector:
        topology.kubernetes.io/zone: eu-west-par-a
      containers:
      - name: nginx
        image: nginx:1.28.0
        ports:
        - containerPort: 80</code></pre>



<p>Deploy the manifest file in your cluster:</p>



<pre class="wp-block-code"><code class="">$ kubectl apply -f nginx-one-az.yaml -n hello-app
deployment.apps/nginx-one-az created</code></pre>



<p>As you can see, our three pods are running in the PAR region only in the <code><strong>zone-a</strong></code> nodes:</p>



<pre class="wp-block-code"><code class="">$ kubectl get po -o wide -l app=nginx-one-az -n hello-app
NAME                            READY   STATUS    RESTARTS   AGE    IP             NODE                         NOMINATED NODE   READINESS GATES
nginx-one-az-6b5f9bdccc-8vv9l   1/1     Running   0          98s    10.240.7.13    my-pool-zone-a-b9ztj-brgpq   &lt;none&gt;           &lt;none&gt;
nginx-one-az-6b5f9bdccc-ck99s   1/1     Running   0          100s   10.240.5.216   my-pool-zone-a-b9ztj-mss8j   &lt;none&gt;           &lt;none&gt;
nginx-one-az-6b5f9bdccc-tlg4d   1/1     Running   0          96s    10.240.8.221   my-pool-zone-a-b9ztj-gt5vd   &lt;none&gt;           &lt;none&gt;</code></pre>



<h2 class="wp-block-heading">Want to go further?</h2>



<p>Want to learn more on this topic? In the coming days, we will publish a blog post about MKS Premium plan.</p>



<p>Visit our <a href="https://labs.ovhcloud.com/en/managed-kubernetes-service-mks-premium-plan/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Managed Kubernetes Service (MKS) Premium plan</a> in the OVHcloud Labs website to know more about Premium MKS.</p>



<p>Join the <strong>free</strong> Beta: <a href="https://labs.ovhcloud.com/en/managed-kubernetes-service-mks-premium-plan/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">https://labs.ovhcloud.com/en/managed-kubernetes-service-mks-premium-plan/</a></p>



<p>Read the documentation about the new <a href="https://help.ovhcloud.com/csm/fr-public-cloud-kubernetes-premium?id=kb_article_view&amp;sysparm_article=KB0067581" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Managed Kubernetes Service (MKS) Premium plan</a>.</p>



<p>Join us on <a href="https://discord.com/channels/850031577277792286/1366761790150541402" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Discord</a> and give us your feedbacks.</p>



<p></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%2Fdeploy-your-workloads-on-3-availability-zones-with-our-new-managed-kubernetes-services-mks-premium-plan%2F&amp;action_name=Deploy%20your%20workloads%20on%203%20availability%20zones%20with%20our%20new%20Managed%20Kubernetes%20Services%20%28MKS%29%20%26%238216%3BPremium%26%238217%3B%20plan&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>Solutions at OVHcloud to overcome the Docker Hub pull rate limits</title>
		<link>https://blog.ovhcloud.com/solutions-at-ovhcloud-to-overcome-the-docker-hub-pull-rate-limits/</link>
		
		<dc:creator><![CDATA[Aurélie Vache]]></dc:creator>
		<pubDate>Fri, 11 Apr 2025 06:53:38 +0000</pubDate>
				<category><![CDATA[OVHcloud Engineering]]></category>
		<category><![CDATA[Tranches de Tech & co]]></category>
		<category><![CDATA[Docker Hub]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[OVHcloud]]></category>
		<category><![CDATA[OVHcloud Managed Kubernetes]]></category>
		<category><![CDATA[OVHcloud Managed Private Registry]]></category>
		<category><![CDATA[Public Cloud]]></category>
		<category><![CDATA[registry]]></category>
		<guid isPermaLink="false">https://blog.ovhcloud.com/?p=28623</guid>

					<description><![CDATA[For the past few months, Docker has been announcing the implementation of new pull rate limits for the Docker Hub. The most significant change is the 10 pulls-per-hour limit, per IP address, for unauthenticated users that can quickly lead to a &#8220;You have reached your pull rate limit&#8221; error message. Even if these changes have [&#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%2Fsolutions-at-ovhcloud-to-overcome-the-docker-hub-pull-rate-limits%2F&amp;action_name=Solutions%20at%20OVHcloud%20to%20overcome%20the%20Docker%20Hub%20pull%20rate%20limits&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-full"><img loading="lazy" decoding="async" width="960" height="540" src="https://blog.ovhcloud.com/wp-content/uploads/2025/04/ovh_solutions_overcome_docker_hub_pull_rate_limits-1.png" alt="" class="wp-image-28707" srcset="https://blog.ovhcloud.com/wp-content/uploads/2025/04/ovh_solutions_overcome_docker_hub_pull_rate_limits-1.png 960w, https://blog.ovhcloud.com/wp-content/uploads/2025/04/ovh_solutions_overcome_docker_hub_pull_rate_limits-1-300x169.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2025/04/ovh_solutions_overcome_docker_hub_pull_rate_limits-1-768x432.png 768w" sizes="auto, (max-width: 960px) 100vw, 960px" /></figure>



<p>For the past few months, <a href="https://www.docker.com/blog/revisiting-docker-hub-policies-prioritizing-developer-experience/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Docker has been announcing the implementation of new pull rate limits for the Docker Hub</a>. The most significant change is the 10 pulls-per-hour limit, per IP address, for unauthenticated users that can quickly lead to a &#8220;You have reached your pull rate limit&#8221; error message.</p>



<p>Even if these changes have been implemented and rollbacked as of April 1, 2025, at OVHcloud, we are aware that these upcoming changes could impact your deployments and daily work.</p>



<p>In this blog post, you will find several solutions and best practices that can help you reduce Docker pull commands and avoid hitting Docker Hub&#8217;s pull rate limit.</p>



<h3 class="wp-block-heading">Use OVHcloud Managed Private Registry and activate the proxy cache</h3>



<figure class="wp-block-image aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="800" height="800" src="https://blog.ovhcloud.com/wp-content/uploads/2025/04/managed_private_registry.png" alt="" class="wp-image-28658" style="width:181px;height:auto" srcset="https://blog.ovhcloud.com/wp-content/uploads/2025/04/managed_private_registry.png 800w, https://blog.ovhcloud.com/wp-content/uploads/2025/04/managed_private_registry-300x300.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2025/04/managed_private_registry-150x150.png 150w, https://blog.ovhcloud.com/wp-content/uploads/2025/04/managed_private_registry-768x768.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2025/04/managed_private_registry-70x70.png 70w" sizes="auto, (max-width: 800px) 100vw, 800px" /></figure>



<p><a href="https://www.ovhcloud.com/en/public-cloud/managed-rancher-service/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">OVHcloud Managed Private Registry</a> (MPR) is a container image registry, based on CNCF project Harbor. It allows you to store and manage Docker (or OCI-compliant) container images and artifacts in a private, secure, and scalable environment, hosted in OVHcloud&#8217;s infrastructure.</p>



<p>MPR provides a <strong>proxy cache</strong> feature that helps you mirror and cache images from external registries, like <strong>Docker Hub</strong>, <strong>Github Container Registry</strong>, <strong>Quay</strong>, <strong>JFrog Artifactory Registry</strong>, etc. External registries can be private or public. This improves performance and reduces rate limits imposed by external registries 💪.</p>



<h4 class="wp-block-heading">Configure proxy cache in OVHcloud Managed Private Registry</h4>



<p>If you don&#8217;t have deployed a MPR yet, you can deploy it through the <a href="https://help.ovhcloud.com/csm/en-gb-public-cloud-private-registry-creation?id=kb_article_view&amp;sysparm_article=KB0050325" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">OVHcloud Control Panel</a>, the <a href="https://help.ovhcloud.com/csm/en-public-cloud-private-registry-creation-via-terraform?id=kb_article_view&amp;sysparm_article=KB0050330" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">OVHcloud Terraform provider</a>, the <a href="https://help.ovhcloud.com/csm/en-public-cloud-private-registry-creation-with-pulumi?id=kb_article_view&amp;sysparm_article=KB0061073" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">OVHcloud Pulumi provider</a> and even the API. Follow the guide according to your needs.</p>



<p>First, log in the <a href="https://help.ovhcloud.com/csm/en-gb-public-cloud-private-registry-connect-to-ui?id=kb_article_view&amp;sysparm_article=KB0050321" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Harbor user interface</a> on your private registry, follow the guide if you needed to.</p>



<p>⚠️ In order to activate the proxy cache, you need to log in the Harbor UI with an administrator account.</p>



<h5 class="wp-block-heading">Registry endpoint creation</h5>



<p>In the left sidebar, click on <strong>Registries</strong> (inside the Administration section).</p>



<p>Then click on the <strong>New endpoint</strong> button.</p>



<p>Select Docker Hub in the provider list, enter a name (&#8220;Docker Hub&#8221; for example), fill your Docker Hub login in Access ID field and fill your Docker Hub password in Access Secret field.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="674" src="https://blog.ovhcloud.com/wp-content/uploads/2025/04/Capture-decran-2025-04-10-a-11.16.21-1024x674.png" alt="" class="wp-image-28663" srcset="https://blog.ovhcloud.com/wp-content/uploads/2025/04/Capture-decran-2025-04-10-a-11.16.21-1024x674.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2025/04/Capture-decran-2025-04-10-a-11.16.21-300x197.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2025/04/Capture-decran-2025-04-10-a-11.16.21-768x505.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2025/04/Capture-decran-2025-04-10-a-11.16.21-1536x1010.png 1536w, https://blog.ovhcloud.com/wp-content/uploads/2025/04/Capture-decran-2025-04-10-a-11.16.21.png 1818w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>⚠️ Note that we <strong>strongly recommend</strong> using a <strong>Docker account</strong> (even a free one) to <strong>avoid rate limits</strong>, for unanthenticated users, when pulling images. Without authentication, Docker Hub enforces strict pull limits, which may cause failures when pulling frequently used images.</p>



<p>Click on the <strong>Test connection</strong> button to test if your login and password are correct.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="620" src="https://blog.ovhcloud.com/wp-content/uploads/2025/04/Capture-decran-2025-04-10-a-11.16.39-1024x620.png" alt="" class="wp-image-28664" srcset="https://blog.ovhcloud.com/wp-content/uploads/2025/04/Capture-decran-2025-04-10-a-11.16.39-1024x620.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2025/04/Capture-decran-2025-04-10-a-11.16.39-300x182.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2025/04/Capture-decran-2025-04-10-a-11.16.39-768x465.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2025/04/Capture-decran-2025-04-10-a-11.16.39.png 1228w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Now click on the <strong>OK</strong> button in order to create the new endpoint.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="330" src="https://blog.ovhcloud.com/wp-content/uploads/2025/04/Capture-decran-2025-04-10-a-11.16.56-1024x330.png" alt="" class="wp-image-28665" srcset="https://blog.ovhcloud.com/wp-content/uploads/2025/04/Capture-decran-2025-04-10-a-11.16.56-1024x330.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2025/04/Capture-decran-2025-04-10-a-11.16.56-300x97.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2025/04/Capture-decran-2025-04-10-a-11.16.56-768x247.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2025/04/Capture-decran-2025-04-10-a-11.16.56-1536x494.png 1536w, https://blog.ovhcloud.com/wp-content/uploads/2025/04/Capture-decran-2025-04-10-a-11.16.56-2048x659.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>The Docker Hub endpoint is created 🎉</p>



<h5 class="wp-block-heading">Proxy cache project creation</h5>



<p>In the left sidebar, click on <strong>Projects</strong>, then click on the <strong>New project</strong> button.</p>



<p>Enter a project name (&#8220;docker-hub&#8221; for example), enable the Proxy Cache, click on the Docker Hub endpoint in the list and click on the <strong>OK</strong> button.</p>



<p>ℹ️ Note that a project is private by default, so you have to click on the Public checkbox if you want to change the visibilty of a project.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="735" src="https://blog.ovhcloud.com/wp-content/uploads/2025/04/image-33-1024x735.png" alt="" class="wp-image-28669" srcset="https://blog.ovhcloud.com/wp-content/uploads/2025/04/image-33-1024x735.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2025/04/image-33-300x215.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2025/04/image-33-768x551.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2025/04/image-33.png 1182w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>⚠️ The name of a proxy cache project should not contains dot(s), indeed it can causes issues with external tools like Kaniko.</p>



<p>Your proxy cache project have been created 🎉</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="373" src="https://blog.ovhcloud.com/wp-content/uploads/2025/04/image-34-1024x373.png" alt="" class="wp-image-28670" srcset="https://blog.ovhcloud.com/wp-content/uploads/2025/04/image-34-1024x373.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2025/04/image-34-300x109.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2025/04/image-34-768x280.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2025/04/image-34-1536x560.png 1536w, https://blog.ovhcloud.com/wp-content/uploads/2025/04/image-34-2048x746.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>⚠️ A proxy cache project works similarly to a normal Harbor project, except that you are not able to push images to a proxy cache project.</p>



<p>Now when you want to pull a Docker images hosted in the Docker Hub you proxy cached, instead of pulling directly from the Docker Hub, you need to configure your docker/podman pull commands and Kubernetes pod manifests to pull images from the OVHcloud Managed Private Registry:</p>



<pre class="wp-block-code"><code class="">$ docker pull xxxxxxxx.c1.de1.container-registry.ovh.net/docker-hub/ovhcom/ovh-platform-hello:latest
latest: Pulling from docker-hub/ovhcom/ovh-platform-hello
1f3e46996e29: Pull complete 
6aa905c35cc0: Pull complete 
Digest: sha256:fddb76f0eb92d95b3721bfa0ea87350c5d39ea262e90cd30d66f429bb40c8b07
Status: Downloaded newer image for xxxxxxxx.c1.de1.container-registry.ovh.net/docker-hub/ovhcom/ovh-platform-hello:latest
xxxxxxxx.c1.de1.container-registry.ovh.net/docker-hub/ovhcom/ovh-platform-hello:latest</code></pre>



<h3 class="wp-block-heading">Disable the AlwaysPullImages admission plugin on your MKS cluster</h3>



<figure class="wp-block-image aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="200" height="200" src="https://blog.ovhcloud.com/wp-content/uploads/2025/04/Managed-Kubernetes-Service.png" alt="" class="wp-image-28702" style="width:186px;height:auto" srcset="https://blog.ovhcloud.com/wp-content/uploads/2025/04/Managed-Kubernetes-Service.png 200w, https://blog.ovhcloud.com/wp-content/uploads/2025/04/Managed-Kubernetes-Service-150x150.png 150w, https://blog.ovhcloud.com/wp-content/uploads/2025/04/Managed-Kubernetes-Service-70x70.png 70w" sizes="auto, (max-width: 200px) 100vw, 200px" /></figure>



<p>By default, the <strong>AlwaysPullImages</strong> Kubernetes admission plugin is enabled in your OVHcloud Managed Kubernetes (MKS) cluster.</p>



<p>⚠️ When it is enabled, this forces the imagePullPolicy of a container to be set to <strong>Always</strong>, no matter how it is specified when creating the resource.</p>



<p>This is useful in a multitenant cluster so that users can be assured that their private images can only be used by those who have the credentials to pull them. Without this admission controller, once an image has been pulled to a node, any pod from any user can use it by knowing the image&#8217;s name (assuming the Pod is scheduled onto the right node), without any authorization check against the image.</p>



<p>But, it can cause a lot of pull requests to the Docker Hub and you can reach the rate limits.</p>



<p>So a solution can be to deactivate the AlwaysPullImages admission plugin in your MKS cluster.</p>



<p>In this blog post, we will deactivate it in the OVHcloud Control Panel.</p>



<h5 class="wp-block-heading">Enable/Disable MKS admission plugins</h5>



<p>Log in the OVHcloud Control Panel. In the left sidebar, click on the <strong>Managed Kubernetes Service</strong> and then click on the wanted MKS cluster.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="777" src="https://blog.ovhcloud.com/wp-content/uploads/2025/04/Capture-decran-2025-04-10-a-15.35.01-1024x777.png" alt="" class="wp-image-28687" srcset="https://blog.ovhcloud.com/wp-content/uploads/2025/04/Capture-decran-2025-04-10-a-15.35.01-1024x777.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2025/04/Capture-decran-2025-04-10-a-15.35.01-300x227.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2025/04/Capture-decran-2025-04-10-a-15.35.01-768x582.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2025/04/Capture-decran-2025-04-10-a-15.35.01-1536x1165.png 1536w, https://blog.ovhcloud.com/wp-content/uploads/2025/04/Capture-decran-2025-04-10-a-15.35.01.png 2044w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>In the <strong>Cluster information</strong> section, scroll down and click on <strong>Enable/disable plugin</strong>. A popup will appear.</p>



<p>Then click on <strong>Disable</strong> for the Always Pull Images plugin and click on the <strong>Save</strong> button.</p>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" width="896" height="1024" src="https://blog.ovhcloud.com/wp-content/uploads/2025/04/image-36-896x1024.png" alt="" class="wp-image-28691" style="width:387px;height:auto" srcset="https://blog.ovhcloud.com/wp-content/uploads/2025/04/image-36-896x1024.png 896w, https://blog.ovhcloud.com/wp-content/uploads/2025/04/image-36-262x300.png 262w, https://blog.ovhcloud.com/wp-content/uploads/2025/04/image-36-768x878.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2025/04/image-36.png 936w" sizes="auto, (max-width: 896px) 100vw, 896px" /></figure>



<p>⚠️ Any changes on the Admission plugins require a redeployment of the MKS cluster API server (without data loss) so the API server can be potentially not available during the redeployment.</p>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" width="541" height="1024" src="https://blog.ovhcloud.com/wp-content/uploads/2025/04/image-37-541x1024.png" alt="" class="wp-image-28695" style="width:228px;height:auto" srcset="https://blog.ovhcloud.com/wp-content/uploads/2025/04/image-37-541x1024.png 541w, https://blog.ovhcloud.com/wp-content/uploads/2025/04/image-37-159x300.png 159w, https://blog.ovhcloud.com/wp-content/uploads/2025/04/image-37.png 572w" sizes="auto, (max-width: 541px) 100vw, 541px" /></figure>



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



<p>To learn more about how to use and configure <a href="https://help.ovhcloud.com/csm/fr-documentation-public-cloud-containers-orchestration-managed-private-registry?id=kb_browse_cat&amp;kb_id=574a8325551974502d4c6e78b7421938&amp;kb_category=7939e6a464282d10476b3689cb0d0ed7&amp;spa=1" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">OVHcloud private registries</a> and <a href="https://help.ovhcloud.com/csm/world-documentation-public-cloud-containers-orchestration-managed-kubernetes-k8s?id=kb_browse_cat&amp;kb_id=574a8325551974502d4c6e78b7421938&amp;kb_category=f334d555f49801102d4ca4d466a7fdd2&amp;spa=1" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">OVHcloud MKS clusters</a>, don&#8217;t hesitate to follow our guides.</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%2Fsolutions-at-ovhcloud-to-overcome-the-docker-hub-pull-rate-limits%2F&amp;action_name=Solutions%20at%20OVHcloud%20to%20overcome%20the%20Docker%20Hub%20pull%20rate%20limits&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>Enhancing Kubernetes Security: Detecting Threats in OVHcloud Managed Kubernetes cluster (MKS) Audit Logs with Falco</title>
		<link>https://blog.ovhcloud.com/enhancing-kubernetes-security-detecting-threats-in-ovhcloud-managed-kubernetes-cluster-mks-audit-logs-with-falco/</link>
		
		<dc:creator><![CDATA[Aurélie Vache]]></dc:creator>
		<pubDate>Tue, 11 Feb 2025 08:58:40 +0000</pubDate>
				<category><![CDATA[OVHcloud Engineering]]></category>
		<category><![CDATA[Tranches de Tech & co]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[OVHcloud]]></category>
		<category><![CDATA[Security]]></category>
		<guid isPermaLink="false">https://blog.ovhcloud.com/?p=27886</guid>

					<description><![CDATA[Several month ago we discovered Falco, a Cloud Native near real-time threats detection tool, and we saw how to install it on an OVHcloud MKS cluster. Today we will connect our Falco instance to a MKS cluster in order to retrieve Kubernetes Audit Logs events and watch if everything is OK in our cluster. Concretely, [&#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%2Fenhancing-kubernetes-security-detecting-threats-in-ovhcloud-managed-kubernetes-cluster-mks-audit-logs-with-falco%2F&amp;action_name=Enhancing%20Kubernetes%20Security%3A%20Detecting%20Threats%20in%20OVHcloud%20Managed%20Kubernetes%20cluster%20%28MKS%29%20Audit%20Logs%20with%20Falco&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="484" src="https://blog.ovhcloud.com/wp-content/uploads/2025/02/falco-blogpost-plugin-mks-1-1024x484.jpg" alt="" class="wp-image-28194" srcset="https://blog.ovhcloud.com/wp-content/uploads/2025/02/falco-blogpost-plugin-mks-1-1024x484.jpg 1024w, https://blog.ovhcloud.com/wp-content/uploads/2025/02/falco-blogpost-plugin-mks-1-300x142.jpg 300w, https://blog.ovhcloud.com/wp-content/uploads/2025/02/falco-blogpost-plugin-mks-1-768x363.jpg 768w, https://blog.ovhcloud.com/wp-content/uploads/2025/02/falco-blogpost-plugin-mks-1-1536x725.jpg 1536w, https://blog.ovhcloud.com/wp-content/uploads/2025/02/falco-blogpost-plugin-mks-1.jpg 1749w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Several month ago we discovered <a href="https://falco.org/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Falco</a>, a Cloud Native near real-time threats detection tool, and we saw <a href="https://blog.ovhcloud.com/near-real-time-threats-detection-with-falco-on-ovhcloud-managed-kubernetes/" data-wpel-link="internal">how to install it on an OVHcloud MKS cluster</a>.</p>



<p>Today we will connect our Falco instance to a MKS cluster in order to retrieve <strong>Kubernetes Audit Logs</strong> events and watch if everything is OK in our cluster.</p>



<p>Concretely, in this blog post we will:</p>



<ul class="wp-block-list">
<li>deploy an OVHcloud LDP (Logs Data Platform)</li>



<li>create a data stream into this LDP</li>



<li>connect an OVHcloud MKS cluster to the data stream (to send Audit Logs into it)</li>



<li>use the <strong>k8saudit-ovh</strong> Falco plugin to retrieve in realtime the Audit Logs of a MKS cluster</li>



<li>test a rule and detect security events based on MKS audit logs activity</li>
</ul>



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



<p>This blog post presupposes that you already have a working&nbsp;<a href="https://www.ovhcloud.com/fr/public-cloud/kubernetes/" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external">OVHcloud Managed Kubernetes</a>&nbsp;(MKS) cluster, and a running instance of Falco.</p>



<p>If it is not the case, follow the <a href="https://blog.ovhcloud.com/near-real-time-threats-detection-with-falco-on-ovhcloud-managed-kubernetes/" data-wpel-link="internal">Near real-time threats detection with Falco on OVHcloud Managed Kubernetes</a> blog post.</p>



<h2 class="wp-block-heading">Deploying a Logs Data Platform (LDP)</h2>



<p>LDP is the managed platform for collecting, processing, analyzing and storing your logs of the OVHcloud products. To be able to access to our Kubernetes clusters Audit Logs we need to deploy a LDP.</p>



<p>Find more information on our&nbsp;dedicated<a href="https://www.ovhcloud.com/en/identity-security-operations/logs-data-platform/" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external">&nbsp;LDP page</a>.</p>



<p>We can deploy a LDP through the OVHcloud Control Panel and the API. In this blog post, we will deploy it through the Control Panel.</p>



<p>First, you have to log in to the&nbsp;<a href="https://www.ovh.com/manager/#/dedicated/dbaas/logs/order" target="_blank" rel="noreferrer noopener" data-wpel-link="exclude">OVHcloud Control Panel</a>, click on the <strong>Bare Metal Cloud</strong> section located at the top in the header and then click on the <strong>Logs Data Platform</strong> in the sidebar.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="529" src="https://blog.ovhcloud.com/wp-content/uploads/2025/01/image-1-1024x529.png" alt="" class="wp-image-27901" srcset="https://blog.ovhcloud.com/wp-content/uploads/2025/01/image-1-1024x529.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2025/01/image-1-300x155.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2025/01/image-1-768x396.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2025/01/image-1-1536x793.png 1536w, https://blog.ovhcloud.com/wp-content/uploads/2025/01/image-1-2048x1057.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Choose the LDP plan you want: <em>Standard</em> (free) or <em>Enterprise</em> one, depending on your needs.</p>



<p>Select a <strong>region</strong> (<em>North America</em> or <em>Europe</em>). We will choose &#8220;<strong>GRA</strong>&#8221; for this blog post, click on <strong>Order</strong> button and follow the instructions.</p>



<p>After several minutes your LDP will be created. </p>



<p>Refresh the page, click on the new deployed LDP, then enter a password and click on the <strong>Save</strong> button.</p>



<h2 class="wp-block-heading">Creating a Data stream and retrieving the Websocket URL</h2>



<p>Our Kubernetes Audit Logs will be stored in a data stream so click on the <strong>Data stream</strong> tab and then click on the <strong>Add data stream</strong> button.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="466" src="https://blog.ovhcloud.com/wp-content/uploads/2025/01/image-3-1024x466.png" alt="" class="wp-image-27905" srcset="https://blog.ovhcloud.com/wp-content/uploads/2025/01/image-3-1024x466.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2025/01/image-3-300x137.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2025/01/image-3-768x350.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2025/01/image-3-1536x700.png 1536w, https://blog.ovhcloud.com/wp-content/uploads/2025/01/image-3-2048x933.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Choose a name of the data stream. On my side I like to call it with the name of my MKS cluster following by &#8220;-audit-logs&#8221; to know easily what it is this data stream for. My MKS cluster&#8217;s name is &#8220;my-rancher-mks-cluster&#8221; so let&#8217;s name it &#8220;my-rancher-mks-cluster-audit-logs&#8221;. Fill the description (mandatory).</p>



<p>The OVHcloud Audit Logs Falco plugin you will use receive the audit logs through Websocket so you need to enable <strong>Websocket broadcasting</strong> then click on the <strong>Save</strong> button.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="730" src="https://blog.ovhcloud.com/wp-content/uploads/2025/01/image-5-1024x730.png" alt="" class="wp-image-27909" srcset="https://blog.ovhcloud.com/wp-content/uploads/2025/01/image-5-1024x730.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2025/01/image-5-300x214.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2025/01/image-5-768x548.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2025/01/image-5-1536x1095.png 1536w, https://blog.ovhcloud.com/wp-content/uploads/2025/01/image-5-2048x1460.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Now, to retrieve the Websocket URL of your data stream, click on the<strong> Data stream</strong> tab, then click on the<strong> &#8230;</strong> button (located at the right in the line of your data stream), and click on <strong>Monitor in real time</strong> action.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="674" src="https://blog.ovhcloud.com/wp-content/uploads/2025/01/image-6-1024x674.png" alt="" class="wp-image-27913" srcset="https://blog.ovhcloud.com/wp-content/uploads/2025/01/image-6-1024x674.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2025/01/image-6-300x197.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2025/01/image-6-768x505.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2025/01/image-6-1536x1011.png 1536w, https://blog.ovhcloud.com/wp-content/uploads/2025/01/image-6-2048x1347.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Finally, click on the <strong>Action</strong> button and in the <strong>Copy Websocket address</strong>, then save the LDP Websocket URL somewhere ;-).</p>



<p>Note that the Websocket address have this kind of format: <code>w<em>ss://&lt;region&gt;.logs.ovh.com/tail/?tk=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx</em></code></p>



<h2 class="wp-block-heading">Connect a MKS cluster to a LDP data stream</h2>



<p>Now we need to send the Kubernetes Audit Logs of our MKS cluster in the data stream. </p>



<p>For that, in the OVHcloud Control Panel, click on the <strong>Public Cloud</strong> section in the header and then in <strong>Managed Kubernetes Service</strong> in the sidebar.</p>



<p>Click on your Kubernetes cluster (my-rancher-mks-cluster for example), then in the <strong>Logs</strong> tab and click on the <strong>Subscribe</strong> button.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="500" src="https://blog.ovhcloud.com/wp-content/uploads/2025/01/image-7-1024x500.png" alt="" class="wp-image-27917" srcset="https://blog.ovhcloud.com/wp-content/uploads/2025/01/image-7-1024x500.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2025/01/image-7-300x146.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2025/01/image-7-768x375.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2025/01/image-7-1536x750.png 1536w, https://blog.ovhcloud.com/wp-content/uploads/2025/01/image-7.png 2040w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Click on the <strong>Add data stream</strong> button to visualize in real time the Audit Logs of your cluster. Then select the LDP instance and click on the <strong>Subscribe</strong> button for the data stream your created:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="544" src="https://blog.ovhcloud.com/wp-content/uploads/2025/01/image-8-1024x544.png" alt="" class="wp-image-27918" srcset="https://blog.ovhcloud.com/wp-content/uploads/2025/01/image-8-1024x544.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2025/01/image-8-300x159.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2025/01/image-8-768x408.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2025/01/image-8-1536x815.png 1536w, https://blog.ovhcloud.com/wp-content/uploads/2025/01/image-8.png 2046w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading">Retrieve the MKS Audit Logs with Falco</h2>



<p>Falco can receive <strong>Events</strong>, compare them to a set of <strong>Rules</strong> to determine the actions to perform and generate <strong>Alerts</strong> to different endpoints. </p>



<p>Thanks to the <strong>k8saudit-ovh</strong> plugin, Falco can receive a new sort of <strong>Events</strong>: the Audit Logs of your MKS cluster. These events have also some <a href="https://github.com/falcosecurity/plugins/blob/main/plugins/k8saudit/rules/k8s_audit_rules.yaml" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">rules to follow</a>.</p>



<p>Concretely, when an user will execute some <strong>kubectl</strong> commands in an OVHcloud MKS cluster, Audit Logs will be generated. Falco is listening from them and depending on the configured rules, it will generate some alerts.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="961" height="327" src="https://blog.ovhcloud.com/wp-content/uploads/2025/02/image.png" alt="" class="wp-image-28190" srcset="https://blog.ovhcloud.com/wp-content/uploads/2025/02/image.png 961w, https://blog.ovhcloud.com/wp-content/uploads/2025/02/image-300x102.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2025/02/image-768x261.png 768w" sizes="auto, (max-width: 961px) 100vw, 961px" /></figure>



<p>Let&#8217;s install or update a Falco configuration running in a MKS cluster and use this plugin.</p>



<p>Create a <strong>values.yaml</strong> file with the following content:</p>



<pre class="wp-block-code"><code class="">tty: true<br>kubernetes: false<br><br># Just a Deployment with 1 replica (instead of a Daemonset) to have only one Pod that pulls the MKS Audit Logs from a OVHcloud LDP<br>controller:<br>  kind: deployment<br>  deployment:<br>    replicas: 1<br><br>falco:<br>  rule_matching: all<br>  rules_files:<br>    - /etc/falco/k8s_audit_rules.yaml<br>    - /etc/falco/rules.d<br>  plugins:<br>    - name: k8saudit-ovh<br>      library_path: libk8saudit-ovh.so<br>      open_params: "&lt;region&gt;.logs.ovh.com/tail/?tk=&lt;ID&gt;" # Replace with your LDP Websocket URL<br>    - name: json<br>      library_path: libjson.so<br>      init_config: ""<br>  # Plugins that Falco will load. Note: the same plugins are installed by the falcoctl-artifact-install init container.<br>  load_plugins: [k8saudit-ovh, json]<br><br>driver:<br>  enabled: false<br>collectors:<br>  enabled: false<br><br># use falcoctl to install automatically the plugin and the rules<br>falcoctl:<br>  artifact:<br>    install:<br>      enabled: true<br>    follow:<br>      enabled: true<br>  config:<br>    indexes:<br>    - name: falcosecurity<br>      url: https://falcosecurity.github.io/falcoctl/index.yaml<br>    artifact:<br>      allowedTypes:<br>        - plugin<br>        - rulesfile<br>      install:<br>        resolveDeps: false<br>        refs: [k8saudit-rules:0, k8saudit-ovh:0.1, json:0]<br>      follow:<br>        refs: [k8saudit-rules:0]</code></pre>



<p>This <strong>values.yaml </strong>file will install Falco with the <strong>k8saudit-ovh</strong> and the <strong>json</strong> plugins. </p>



<p>Install the latest version of Falco with&nbsp;<code>helm install</code>&nbsp;command:</p>



<pre class="wp-block-code"><code class="">$ helm install falco --create-namespace --namespace falco --values=values.yaml falcosecurity/falco</code></pre>



<p>This command will install the latest version of Falco, with the k8saudit-ovh and json plugins, and create a new&nbsp;<code>falco</code>&nbsp;namespace:</p>



<pre class="wp-block-code"><code class="">$ helm install falco --create-namespace --namespace falco --values=values.yaml falcosecurity/falco

NAME: falco
LAST DEPLOYED: Mon Feb 10 10:15:20 2025
NAMESPACE: falco
STATUS: deployed
REVISION: 1
NOTES:
No further action should be required.</code></pre>



<p>Or if you already have Falco deployed in a Kubernetes cluster, you can use the <code>helm update</code> command instead:</p>



<pre class="wp-block-code"><code class="">$ helm upgrade falco --create-namespace --namespace falco --values=values.yaml falcosecurity/falco</code></pre>



<p>You can check if the Falco pods are correctly running:</p>



<pre class="wp-block-code"><code class="">$ kubectl get pods -n falco

NAME                                      READY   STATUS    RESTARTS   AGE
falco-6b8bc77d8b-v24jr                    2/2     Running   0          96s
falco-falcosidekick-67877d6946-4hmbn      1/1     Running   0          96s
falco-falcosidekick-67877d6946-tpjk6      1/1     Running   0          96s
falco-falcosidekick-ui-78b96fd57d-4wb6q   1/1     Running   0          96s
falco-falcosidekick-ui-78b96fd57d-v7rnm   1/1     Running   0          96s
falco-falcosidekick-ui-redis-0            1/1     Running   0          96s</code></pre>



<p>Wait and execute the command again if the pods are in “Init” or “ContainerCreating” state.</p>



<p>Once the Falco pod is ready, run the following command to see the logs:</p>



<pre class="wp-block-code"><code class="">kubectl logs -l app.kubernetes.io/name=falco -n falco -c falco</code></pre>



<p>You should see logs like that:</p>



<pre class="wp-block-code"><code class="">$ kubectl logs -l app.kubernetes.io/name=falco -n falco -c falco

Mon Feb 10 09:15:35 2025:    /etc/falco/k8s_audit_rules.yaml | schema validation: ok
Mon Feb 10 09:15:35 2025: Hostname value has been overridden via environment variable to: my-pool-1-node-921b61
Mon Feb 10 09:15:35 2025: The chosen syscall buffer dimension is: 8388608 bytes (8 MBs)
Mon Feb 10 09:15:35 2025: Starting health webserver with threadiness 2, listening on 0.0.0.0:8765
Mon Feb 10 09:15:35 2025: Loaded event sources: syscall, k8s_audit
Mon Feb 10 09:15:35 2025: Enabled event sources: k8s_audit
Mon Feb 10 09:15:35 2025: Opening 'k8s_audit' source with plugin 'k8saudit-ovh'
{"hostname":"my-pool-1-node-921b61","output":"09:15:40.698757000: Warning K8s Operation performed by user not in allowed list of users (user=csi-cinder-controller target=csi-6afb06dce281b86b7bab718b5d966dc261b2b1554941ae449519a128cb2e3fb3/volumeattachments verb=patch uri=/apis/storage.k8s.io/v1/volumeattachments/csi-6afb06dce281b86b7bab718b5d966dc261b2b1554941ae449519a128cb2e3fb3/status resp=200)","output_fields":{"evt.time":1739178940698757000,"ka.response.code":"200","ka.target.name":"csi-6afb06dce281b86b7bab718b5d966dc261b2b1554941ae449519a128cb2e3fb3","ka.target.resource":"volumeattachments","ka.uri":"/apis/storage.k8s.io/v1/volumeattachments/csi-6afb06dce281b86b7bab718b5d966dc261b2b1554941ae449519a128cb2e3fb3/status","ka.user.name":"csi-cinder-controller","ka.verb":"patch"},"priority":"Warning","rule":"Disallowed K8s User","source":"k8s_audit","tags":["k8s"],"time":"2025-02-10T09:15:40.698757000Z"}
{"hostname":"my-pool-1-node-921b61","output":"09:15:57.508657000: Warning K8s Operation performed by user not in allowed list of users (user=yacht target=my-pool-1.18051c0a88716868/events verb=patch uri=/api/v1/namespaces/default/events/my-pool-1.18051c0a88716868 resp=403)","output_fields":{"evt.time":1739178957508657000,"ka.response.code":"403","ka.target.name":"my-pool-1.18051c0a88716868","ka.target.resource":"events","ka.uri":"/api/v1/namespaces/default/events/my-pool-1.18051c0a88716868","ka.user.name":"yacht","ka.verb":"patch"},"priority":"Warning","rule":"Disallowed K8s User","source":"k8s_audit","tags":["k8s"],"time":"2025-02-10T09:15:57.508657000Z"}
{"hostname":"my-pool-1-node-921b61","output":"09:15:57.807013000: Warning K8s Operation performed by user not in allowed list of users (user=yacht target=my-pool-1/nodepools verb=update uri=/apis/kube.cloud.ovh.com/v1alpha1/nodepools/my-pool-1/status resp=200)","output_fields":{"evt.time":1739178957807013000,"ka.response.code":"200","ka.target.name":"my-pool-1","ka.target.resource":"nodepools","ka.uri":"/apis/kube.cloud.ovh.com/v1alpha1/nodepools/my-pool-1/status","ka.user.name":"yacht","ka.verb":"update"},"priority":"Warning","rule":"Disallowed K8s User","source":"k8s_audit","tags":["k8s"],"time":"2025-02-10T09:15:57.807013000Z"}</code></pre>



<p>The logs confirm that Falco <strong>k8saudit-ovh</strong> plugin and the <strong>k8saudit</strong> rules have been loaded correctly 💪.</p>



<h2 class="wp-block-heading"> Testing Falco</h2>



<p>In order to test Falco we need to know which rules are installed by default. In our case, as we defined it in the values.yaml file, the <strong>k8saudit-ovh</strong> plugin follow the <a href="https://github.com/falcosecurity/plugins/blob/main/plugins/k8saudit/rules/k8s_audit_rules.yaml" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">k8s_audit_rules.yaml</a> file. You can take a look at them in order to know them.</p>



<p>In this blog post we will test one of well-known default k8s audit rules:</p>



<pre class="wp-block-code"><code class="">- rule: Attach/Exec Pod
  desc: &gt;
    Detect any attempt to attach/exec to a pod
  condition: kevt_started and pod_subresource and (kcreate or kget) and ka.target.subresource in (exec,attach) and not user_known_exec_pod_activities
  output: Attach/Exec to pod (user=%ka.user.name pod=%ka.target.name resource=%ka.target.resource ns=%ka.target.namespace action=%ka.target.subresource command=%ka.uri.param[command])
  priority: NOTICE
  source: k8s_audit
  tags: [k8s]</code></pre>



<p>This rule is interesting because an event will be generated if/when an user execute commands in a pod.</p>



<p>Let&#8217;s test the rule!</p>



<p>In a tab of your terminal, watch the coming logs:</p>



<pre class="wp-block-code"><code class="">$ kubectl logs -l app.kubernetes.io/name=falco -n falco -c falco -f</code></pre>



<p>In an another tab of your terminal, create a Nginx pod and execute a command into it:</p>



<pre class="wp-block-code"><code class="">$ kubectl run nginx --image=nginx<br><br>$ kubectl exec -it nginx -- cat /etc/shadow</code></pre>



<p>Several seconds later, in the logs you should see this you will see this <strong>Attach/Exec to pod</strong> logs:</p>



<pre class="wp-block-code"><code class="">...
{"hostname":"my-pool-1-node-921b61","output":"09:29:46.302906000: Notice Attach/Exec to pod (user=kubernetes-admin pod=nginx-676b6c5bbc-4xc6t resource=pods ns=hello-app action=exec command=cat)","output_fields":{"evt.time":1739179786302906000,"ka.target.name":"nginx-676b6c5bbc-4xc6t","ka.target.namespace":"hello-app","ka.target.resource":"pods","ka.target.subresource":"exec","ka.uri.param[command]":"cat","ka.user.name":"kubernetes-admin"},"priority":"Notice","rule":"Attach/Exec Pod","source":"k8s_audit","tags":["k8s"],"time":"2025-02-10T09:29:46.302906000Z"}
...</code></pre>



<p>🎉</p>



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



<p>Ensuring the security of Kubernetes clusters is important and in general we have a lot of information in the Audit Logs but we don&#8217;t use them so don&#8217;t hesitate to use this new plugin.</p>



<p>We installed the new k8saudit-ovh plugin in an OVHcloud MKS cluster but note that you can deploy it in a Kubernetes cluster in another Cloud provider and even in a Falco instance running locally 💪.</p>



<p>We visualized the logs/the events in the terminal but you can also visualize them in the <a href="https://github.com/falcosecurity/falcosidekick" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">sidekick</a> UI, create a custom rule and even use <a href="https://github.com/falcosecurity/falco-talon" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Talon</a> to execute some actions.</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%2Fenhancing-kubernetes-security-detecting-threats-in-ovhcloud-managed-kubernetes-cluster-mks-audit-logs-with-falco%2F&amp;action_name=Enhancing%20Kubernetes%20Security%3A%20Detecting%20Threats%20in%20OVHcloud%20Managed%20Kubernetes%20cluster%20%28MKS%29%20Audit%20Logs%20with%20Falco&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>Empowering Healthcare Efficiency</title>
		<link>https://blog.ovhcloud.com/empowering-healthcare-efficiency/</link>
		
		<dc:creator><![CDATA[Leonard Pommereau]]></dc:creator>
		<pubDate>Thu, 09 Jan 2025 16:40:33 +0000</pubDate>
				<category><![CDATA[OVHcloud Startup Program]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[HDS]]></category>
		<category><![CDATA[Infrastructure]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[Managed Rancher Services]]></category>
		<category><![CDATA[MongoDB]]></category>
		<category><![CDATA[OVHcloud]]></category>
		<category><![CDATA[Public Cloud]]></category>
		<category><![CDATA[SecNumCloud]]></category>
		<category><![CDATA[Startup Program]]></category>
		<guid isPermaLink="false">https://blog.ovhcloud.com/?p=27935</guid>

					<description><![CDATA[Startup highlight: Interview with Thomas Foricher, CTO at Silbo At OVHcloud’s Startup Program, we are proud to support innovative startups like Silbo that are reshaping industries.Today, we speak with Thomas Foricher, CTO of Silbo, a groundbreaking company transforming patient flow management in healthcare. Can you introduce Silbo and its mission? Silbo was founded in 2018 [&#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%2Fempowering-healthcare-efficiency%2F&amp;action_name=Empowering%20Healthcare%20Efficiency&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[
<h4 class="wp-block-heading"><strong><em>Startup highlight:</em></strong> <strong>Interview with Thomas Foricher, CTO at Silbo</strong></h4>



<p>At OVHcloud’s Startup Program, we are proud to support innovative startups like Silbo that are reshaping industries.<br>Today, we speak with <strong>Thomas Foricher</strong>, CTO of <a href="https://silbo.com/en/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer"><strong>Silbo</strong></a>, a groundbreaking company transforming patient flow management in healthcare.</p>



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



<p><strong>Can you introduce Silbo and its mission?</strong></p>



<p>Silbo was founded in 2018 by Antoine Bohuon with a clear mission: to serve those who care for others by enabling healthcare professionals to focus on their core mission—delivering quality care.</p>



<p>Our platform addresses the complexities of hospital bed management, facilitating the allocation of beds to patients, improving information sharing among healthcare providers, and optimizing patient trajectories. By offering an intuitive, all-in-one solution, Silbo empowers hospitals to efficiently manage patient flows while enhancing the quality of care provided to patients.</p>



<figure class="wp-block-image aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="466" height="436" src="https://blog.ovhcloud.com/wp-content/uploads/2025/01/Picture1.jpg" alt="" class="wp-image-27936" style="width:316px;height:auto" srcset="https://blog.ovhcloud.com/wp-content/uploads/2025/01/Picture1.jpg 466w, https://blog.ovhcloud.com/wp-content/uploads/2025/01/Picture1-300x281.jpg 300w" sizes="auto, (max-width: 466px) 100vw, 466px" /></figure>



<p></p>



<p><strong>What challenges did Silbo face before partnering with OVHcloud?</strong></p>



<p>Our primary need was to find a sovereign hosting provider with strong expertise in modern technologies such as Kubernetes, MongoDB, and Redis. Additionally, compliance with <a href="https://www.ovhcloud.com/en-ie/compliance/hds/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">HDS certification</a> and a guaranteed SLA were critical due to the nature of our work in healthcare.</p>



<p>Managing and securing servers at scale requires highly specialized expertise. With increasing technical interdependencies, ensuring constant security and availability is a dedicated profession. For us, relying on experts like OVHcloud allows us to focus on what we do best—improving healthcare efficiency.</p>



<p><strong>How did OVHcloud help Silbo address these challenges?</strong></p>



<p>OVHcloud was the clear choice. It is the only hosting provider in France that offers a public cloud with high-quality services, combined with <a href="https://www.ovhcloud.com/en/compliance/hds/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">HDS</a> and <a href="https://www.ovhcloud.com/en-ie/compliance/secnumcloud/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">SecNumCloud</a> compliance. Additionally, its strategic vision of deploying local datacenters across Europe aligns with the needs of countries seeking to keep sensitive data, such as health information, close to healthcare institutions.</p>



<p>We use several managed services, including <a href="https://www.ovhcloud.com/en/public-cloud/kubernetes/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Kubernetes</a>, <a href="https://www.ovhcloud.com/en/public-cloud/object-storage/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Object Storage</a>, <a href="https://www.ovhcloud.com/en/public-cloud/mongodb/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">MongoDB</a>, and Redis. These services are comparable to those offered by other providers, but OVHcloud’s standout feature was <a href="https://www.ovhcloud.com/en/public-cloud/managed-rancher-service/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Rancher</a>, which we beta-tested. Rancher allowed us to monitor on-premise Kubernetes deployments effectively, with support from OVHcloud’s engineering team.</p>



<p>With the help of OVHcloud experts, we improved our knowledge of Kubernetes. By adopting their best practices, we successfully deployed Kubernetes on-premise and leveraged <a href="https://www.ovhcloud.com/en-ie/public-cloud/managed-rancher-service/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">Rancher</a> for effective monitoring. This expertise has significantly enhanced our ability to scale infrastructure while maintaining high security and reliability.</p>



<p><strong>What tangible results has Silbo achieved through this partnership?</strong></p>



<p>Since partnering with OVHcloud, we’ve seen our infrastructure costs cut in half compared to other providers without public cloud capabilities. Our platform is now faster, providing a noticeably better experience for end-users.</p>



<p>From a development perspective, on-demand Kubernetes allows us to execute large computational jobs and parallelize analyses. This accelerates our deployment workflows and optimizes our processes.</p>



<p>By outsourcing infrastructure management to OVHcloud, we’ve freed up resources to focus on developing new features and enhancing our platform. This enables us to deliver even greater value to our users and maintain our commitment to innovation.</p>



<p><strong>What’s next for Silbo?</strong></p>



<p>Our ambitions are closely aligned with OVHcloud’s vision: expanding across Europe while providing secure, localized services compliant with both international and local regulations.<br>One of our main challenges will be managing multiple instances that comply with the specific regulations of different countries. Cloud solutions will be key in helping us navigate this complexity while maintaining high standards of security and efficiency.</p>



<figure class="wp-block-image aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="682" src="https://blog.ovhcloud.com/wp-content/uploads/2025/01/Picture3-1024x682.jpg" alt="" class="wp-image-27945" style="width:458px;height:auto" srcset="https://blog.ovhcloud.com/wp-content/uploads/2025/01/Picture3-1024x682.jpg 1024w, https://blog.ovhcloud.com/wp-content/uploads/2025/01/Picture3-300x200.jpg 300w, https://blog.ovhcloud.com/wp-content/uploads/2025/01/Picture3-768x512.jpg 768w, https://blog.ovhcloud.com/wp-content/uploads/2025/01/Picture3-1536x1023.jpg 1536w, https://blog.ovhcloud.com/wp-content/uploads/2025/01/Picture3.jpg 1600w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p></p>



<p><strong>What advice would you give to startups exploring cloud solutions?</strong></p>



<p>Focus on two key aspects: identifying your user’s problem and solving it as simply and efficiently as possible.<br>Leverage existing, standardized solutions wherever possible. Avoid reinventing the wheel—your priorities should always align with your clients’ needs, not internal assumptions or preferences.</p>



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



<figure class="wp-block-image size-full"><a href="https://startup.ovhcloud.com/en" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer"><img loading="lazy" decoding="async" width="1024" height="275" src="https://blog.ovhcloud.com/wp-content/uploads/2024/12/Email-signature-StartupProgram_2-1024x275-1.png" alt="" class="wp-image-27809" srcset="https://blog.ovhcloud.com/wp-content/uploads/2024/12/Email-signature-StartupProgram_2-1024x275-1.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2024/12/Email-signature-StartupProgram_2-1024x275-1-300x81.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2024/12/Email-signature-StartupProgram_2-1024x275-1-768x206.png 768w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p></p>



<p><strong>Join the OVHcloud Startup Program</strong></p>



<p>Silbo’s success highlights the transformative power of leveraging OVHcloud’s Startup Program.<br>Are you ready to take your startup to the next level? Join a growing community of innovators and benefit from tailored cloud solutions, expert guidance, and a global ecosystem.<br>Learn more about <a href="https://startup.ovhcloud.com/en-ie/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer"><strong>OVHcloud’s Startup Program</strong></a> and get started on your journey today!</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%2Fempowering-healthcare-efficiency%2F&amp;action_name=Empowering%20Healthcare%20Efficiency&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>
