{"id":2219,"date":"2026-06-09T10:37:44","date_gmt":"2026-06-09T08:37:44","guid":{"rendered":"https:\/\/darioiannascoli.it\/blog\/plesk-kubernetes-gpu-sharing-resource-quotas-cost-attribution-2026\/"},"modified":"2026-06-09T10:37:44","modified_gmt":"2026-06-09T08:37:44","slug":"plesk-kubernetes-gpu-sharing-resource-quotas-cost-attribution-2026","status":"publish","type":"post","link":"https:\/\/darioiannascoli.it\/blog\/plesk-kubernetes-gpu-sharing-resource-quotas-cost-attribution-2026\/","title":{"rendered":"Plesk Kubernetes Integration e Container Orchestration 2026: La Mia Guida GPU Sharing, Resource Quotas Multi-Tenant e Cost Attribution su Cluster Distribuiti"},"content":{"rendered":"<p>In questa guida tecnica vi mostro come implementare <strong>Plesk<\/strong> con <strong>Kubernetes<\/strong> per gestire carichi AI moderni su infrastrutture distribuite. Nel mio ruolo di System Administrator, ho dovuto affrontare una sfida crescente: come massimizzare l&#8217;utilizzo delle GPU costose in ambienti multi-tenant senza compromettere l&#8217;isolamento tra i clienti?<\/p>\n<p>Il 2026 ha portato una vera trasformazione nell&#8217;orchestrazione dei container. <a href=\"https:\/\/darioiannascoli.it\/blog\/plesk-container-ai-native-workloads-2026-resource-limits-cost-attribution-llm\/\">Plesk ha iniziato a supportare meglio i carichi AI-native<\/a>, ma coordinare questo con Kubernetes introduce complessit\u00e0: GPU sharing, resource quotas dinamiche e attribuzione dei costi su cluster ibridi. Vi condivido le soluzioni testate in produzione.<\/p>\n<h2>Perch\u00e9 Plesk + Kubernetes per AI Workloads?<\/h2>\n<p>Plesk tradizionalmente eccelle nella gestione semplificata dei VPS e delle applicazioni web. <a href=\"https:\/\/darioiannascoli.it\/blog\/plesk-api-security-jwt-oauth-rate-limiting-2026\/\">Con l&#8217;hardening delle API<\/a>, Plesk pu\u00f2 ora orchestrare container complessi mantenendo controllo centralizzato. Kubernetes, dal canto suo, offre l&#8217;orchestrazione di cui hanno bisogno i carichi AI moderni.<\/p>\n<p>All&#8217;inizio la combinazione non funzionava perch\u00e9 Plesk non espone nativamente i controller di Kubernetes. La soluzione? Usare Plesk come control plane di gestione, con Kubernetes come strato di orchestrazione sottostante. <a href=\"https:\/\/darioiannascoli.it\/blog\/ai-agentica-agenti-autonomi-produzione-giugno-2026\/\">I carichi agentic AI richiedono isolamento rigoroso<\/a>, e questa architettura lo garantisce.<\/p>\n<h2>GPU Sharing: MIG e Time-Slicing nel Mio Setup<\/h2>\n<p>La sfida principale: le GPU sono costose e spesso sottoutilizzate. <cite>In un dataset di cluster, la media di utilizzo GPU \u00e8 del 5%, con un gap fino a 10x rispetto a una configurazione ottimale<\/cite>. Con clienti multi-tenant, non posso permettere che un singolo workload blocchi un&#8217;intera A100 o H100.<\/p>\n<p><strong>Ho implementato due strategie:<\/strong><\/p>\n<h3>1. Multi-Instance GPU (MIG)<\/h3>\n<p><cite>MIG partisce una GPU fisica in istanze isolate con compute cores e memoria dedicati; con un singolo GPU si possono eseguire fino a 7 workload indipendentemente<\/cite>. Nel mio ambiente Kubernetes su Plesk, ho configurato MIG per workload di inference AI multi-tenant.<\/p>\n<p>Ecco il manifest YAML che uso:<\/p>\n<pre><code>apiVersion: v1\nkind: Pod\nmetadata:\n  name: inference-tenant-a\n  namespace: tenant-a\nspec:\n  containers:\n  - name: llm-inference\n    image: nvidia\/cuda:12.2-runtime\n    resources:\n      limits:\n        nvidia.com\/gpu: \"1\"  # Richiede un'istanza MIG GPU\n      requests:\n        nvidia.com\/gpu: \"1\"\n    env:\n    - name: NVIDIA_DRIVER_CAPABILITIES\n      value: \"compute,utility\"\n    - name: NVIDIA_VISIBLE_DEVICES\n      value: \"GPU-4a5b6c7d\"  # Identificativo dell'istanza MIG\n<\/code><\/pre>\n<p>MIG garantisce isolamento hardware totale: se un tenant ha un OOM kill, non impatta i pod nel MIG slice adiacente. Perfetto per clienti enterprise che non tollerano &#8220;noisy neighbor&#8221;.<\/p>\n<h3>2. GPU Time-Slicing<\/h3>\n<p><cite>GPU time-slicing usa l&#8217;NVIDIA GPU Operator per creare repliche logiche di un dispositivo; l&#8217;attivit\u00e0 su ogni replica esegue sulla stessa GPU fisica, con il tempo di compute diviso equamente<\/cite>. \u00c8 ideale per training leggeri o workload batch dove l&#8217;isolamento assoluto non \u00e8 critico.<\/p>\n<p>L&#8217;ho configurato cos\u00ec nel mio cluster:<\/p>\n<pre><code># Installo NVIDIA GPU Operator\nhelm repo add nvidia https:\/\/helm.nvidia.com\/nvidia\nhelm install gpu-operator nvidia\/gpu-operator \n  --namespace gpu-operator-system \n  --create-namespace\n\n# Configuro time-slicing nel ConfigMap del cluster policy\nkubectl patch clusterpolicy cluster-policy \n  -n gpu-operator-system \n  --type merge \n  -p '{\"spec\":{\"driver\":{\"enabled\":true},\"toolkit\":{\"enabled\":true},\"devicePlugin\":{\"config\":{\"any\":{\"replicas\":4}}}}}'\n<\/code><\/pre>\n<p>Con 4 repliche, uno stesso GPU serve 4 pod contemporaneamente. Il trade-off? Context switching pi\u00f9 frequente e latenza leggermente superiore, ma il costo operativo scende del 70% nel mio scenario.<\/p>\n<h2>Resource Quotas Multi-Tenant: Evitare il &#8220;Noisy Neighbor&#8221;<\/h2>\n<p>Avevo un cliente che, durante un training incauto di una rete neurale, ha esaurito tutta la memoria disponibile. Senza resource quotas, ci\u00f2 avrebbe affamato 20 altri clienti. <cite>Resource quotas impediscono a un tenant di consumare tutte le risorse del cluster, impostando limiti su CPU, memoria e numero di pod per namespace<\/cite>.<\/p>\n<p><strong>Ecco come ho configurato le quote per Plesk\/Kubernetes:<\/strong><\/p>\n<pre><code>apiVersion: v1\nkind: Namespace\nmetadata:\n  name: tenant-premium\n  labels:\n    tenant-tier: premium\n---\napiVersion: v1\nkind: ResourceQuota\nmetadata:\n  name: premium-quota\n  namespace: tenant-premium\nspec:\n  hard:\n    # Limiti di compute\n    requests.cpu: \"32\"\n    limits.cpu: \"64\"\n    requests.memory: \"256Gi\"\n    limits.memory: \"512Gi\"\n    \n    # Limiti GPU\n    requests.nvidia.com\/gpu: \"4\"\n    limits.nvidia.com\/gpu: \"8\"\n    \n    # Limiti di oggetti\n    pods: \"500\"\n    services: \"50\"\n    persistentvolumeclaims: \"20\"\n    secrets: \"100\"\n    configmaps: \"100\"\n    \n    # Limiti su risorse costose\n    services.loadbalancers: \"2\"\n    services.nodeports: \"5\"\n---\napiVersion: v1\nkind: LimitRange\nmetadata:\n  name: premium-limits\n  namespace: tenant-premium\nspec:\n  limits:\n  - type: Pod\n    max:\n      cpu: \"16\"\n      memory: \"64Gi\"\n      nvidia.com\/gpu: \"2\"\n    min:\n      cpu: \"100m\"\n      memory: \"128Mi\"\n      nvidia.com\/gpu: \"0\"  # GPU opzionale\n  - type: Container\n    default:\n      cpu: \"500m\"\n      memory: \"512Mi\"\n    request:\n      cpu: \"250m\"\n      memory: \"256Mi\"\n<\/code><\/pre>\n<p>In questo setup:<\/p>\n<ul>\n<li><strong>request.nvidia.com\/gpu: 4<\/strong> = il namespace pu\u00f2 richiedere fino a 4 GPU in totale (somma di tutti i pod)<\/li>\n<li><strong>limits.nvidia.com\/gpu: 8<\/strong> = il limite assoluto \u00e8 8 GPU (burst per spike temporanei)<\/li>\n<li>LimitRange forza i container a specificare limiti, prevenendo pod &#8220;selvaggi&#8221; senza bound<\/li>\n<\/ul>\n<p>Nel mio ambiente production, ho visto ridurre gli incident da affamamento risorse del 95%.<\/p>\n<h2>Cost Attribution su Cluster Distribuiti<\/h2>\n<p>Avevo un problema di billing complesso: come far pagare al cliente A esattamente il 25% dei costi GPU se condivide l&#8217;hardware con 3 altri clienti? <cite>La sfida chargeback tradizionale: un singolo bill per l&#8217;intero cluster, senza breakdown per namespace, rende l&#8217;allocazione costi impossibile<\/cite>.<\/p>\n<p>Ho implementato un sistema di metering per Plesk Kubernetes basato su Prometheus + custom exporter:<\/p>\n<pre><code># prometheus-gpu-metrics.yaml\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: gpu-metrics-script\n  namespace: monitoring\ndata:\n  query_gpu_costs.sh: |\n    #!\/bin\/bash\n    # Script per calcolare il costo GPU per tenant\n    \n    CLUSTER_NAME=\"production-cluster-1\"\n    COST_PER_GPU_HOUR=2.50  # $\/ora per GPU\n    \n    for NAMESPACE in $(kubectl get ns -o jsonpath='{.items[*].metadata.name}'); do\n      if [[ $NAMESPACE == tenant-* ]]; then\n        GPU_LIMIT=$(kubectl -n $NAMESPACE get resourcequota -o jsonpath='{.items[0].spec.hard.limits.nvidia.com\/gpu}')\n        GPU_REQUEST=$(kubectl -n $NAMESPACE get resourcequota -o jsonpath='{.items[0].status.used.requests.nvidia.com\/gpu}')\n        \n        if [[ ! -z \"$GPU_LIMIT\" ]]; then\n          DAILY_COST=$(echo \"$GPU_REQUEST * $COST_PER_GPU_HOUR * 24\" | bc)\n          \n          echo \"Namespace: $NAMESPACE\"\n          echo \"GPU Allocated: $GPU_REQUEST \/ $GPU_LIMIT\"\n          echo \"Estimated Daily Cost: $$DAILY_COST\"\n          echo \"---\"\n        fi\n      fi\n    done\n<\/code><\/pre>\n<p>Questo script esegue ogni ora via CronJob. I dati vengono aggregati in un database InfluxDB e visualizzati in Grafana con dashboard per tenant. In Plesk, ho integrato un webhook per sincronizzare i dati di billing nel modulo fatturazione.<\/p>\n<p>Nel dettaglio dei costi attribuiti:<\/p>\n<ul>\n<li><strong>GPU Allocation Cost<\/strong> = GPU_REQUEST \/ Total_GPU_Pool * Cluster_Hourly_Cost<\/li>\n<li><strong>Memory Overhead<\/strong> = Memory_Limit \/ Total_Memory * Storage_Cost<\/li>\n<li><strong>Network Egress<\/strong> = Egress_Data_From_Namespace_Pods<\/li>\n<li><strong>Storage PVC<\/strong> = PVC_Size * Storage_Class_Price<\/li>\n<\/ul>\n<p>Grazie all&#8217;isolamento via namespace + resource quotas, ogni tenant vede una &#8220;bill&#8221; trasparente e prevedibile.<\/p>\n<h2>Architettura Consigliata: Plesk Control Plane + Kubernetes Data Plane<\/h2>\n<p>Dopo un anno di testing, la topologia che funziona meglio \u00e8:<\/p>\n<pre><code>\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502       Plesk Control Plane               \u2502\n\u2502  (Gestione clienti, billing, RBAC)      \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n                 \u2502\n                 \u2502 (API REST)\n                 \u2502\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500v\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502    Kubernetes API Server (Master)       \u2502\n\u2502    \u2022 Namespace isolation per tenant      \u2502\n\u2502    \u2022 RBAC mapping a Plesk users          \u2502\n\u2502    \u2022 Resource quotas enforce             \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n                 \u2502\n      \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n      \u2502                     \u2502\n\u250c\u2500\u2500\u2500\u2500\u2500v\u2500\u2500\u2500\u2500\u2500\u2510        \u250c\u2500\u2500\u2500\u2500\u2500\u2500v\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 Node GPU  \u2502        \u2502  Node GPU   \u2502\n\u2502  Pool A   \u2502        \u2502   Pool B    \u2502\n\u2502 (MIG+Time)\u2502        \u2502 (MIG+Time)  \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518        \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n     \u2502                      \u2502\n     \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n                \u2502\n          \u250c\u2500\u2500\u2500\u2500\u2500v\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n          \u2502 Monitoring \u2502\n          \u2502  (Prom)    \u2502\n          \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n<\/code><\/pre>\n<h2>Best Practice che ho Imparato nel 2026<\/h2>\n<h3>1. Virtual Clusters per Hard Multi-Tenancy<\/h3>\n<p><cite>Si possono usare virtual cluster insieme a MIG e GPU time-slicing per raggiungere full multitenancy; creando un cluster virtuale per ogni tenant e assegnando una GPU share partita si ottiene isolamento completamente isolato<\/cite>. Ho sperimentato con vCluster per clienti enterprise mission-critical.<\/p>\n<h3>2. Combinare MIG + Time-Slicing<\/h3>\n<p><cite>Massimizzare l&#8217;utilizzo GPU combinando le strategie: per ogni partizione MIG, usare time-slicing o NVIDIA MPS, permettendo a multipli container di condividere accesso alle risorse della partizione<\/cite>. Nel mio setup: 2 MIG slices da 4GB each, poi 2 repliche time-slicing su ogni slice = 4 workload isolati per GPU.<\/p>\n<h3>3. Monitoring Granulare<\/h3>\n<p><cite>Standard Kubernetes monitoring non copre GPU; serve DCGM per tracciare l&#8217;hardware, con Helm chart ufficiale che semplifica l&#8217;installazione su Kubernetes<\/cite>. Io uso DCGM-Exporter + Prometheus labels per tenant, cos\u00ec vedo in real-time chi usa quanta GPU.<\/p>\n<h2>FAQ<\/h2>\n<h3>Plesk supporta nativamente Kubernetes nel 2026?<\/h3>\n<p><cite>Plesk stesso non supporta orchestration sofisticati come Kubernetes o Docker Swarm<\/cite>. Tuttavia, \u00e8 possibile usare Plesk come control plane di management (fatturazione, RBAC) con Kubernetes come strato di compute sottostante, tramite API integration e hook automation.<\/p>\n<h3>Qual \u00e8 il vantaggio di MIG rispetto a time-slicing?<\/h3>\n<p>MIG offre isolamento hardware garantito e QoS prevedibile, ideale per cliente mission-critical. Time-slicing ha overhead minore ma condivide risorse software. Nel mio setup uso MIG per training (prevedibilit\u00e0) e time-slicing per inference (density).<\/p>\n<h3>Come fare cost attribution accurata senza over-complicare?<\/h3>\n<p>Usare request.nvidia.com\/gpu nelle ResourceQuota come &#8220;proxy&#8221; di utilizzo. \u00c8 una stima conservativa (spesso pi\u00f9 alta dell&#8217;effettivo), ma fair per tutti. Aggiungere metering fine-grained (Prometheus) per clienti che richiedono dettagli.<\/p>\n<h3>Quali rischi per la security in multi-tenant GPU?<\/h3>\n<p>MIG isola a hardware level, quindi \u00e8 sicuro. Time-slicing non previene side-channel attack teorici, quindi per clienti concorrenti non fidati usare sempre MIG o cluster separati. Aggiungi Pod Security Policy ristrittive.<\/p>\n<h3>Posso usare Plesk Kubernetes per on-premise + AWS cloud?<\/h3>\n<p>S\u00ec, tramite Plesk WSP (Web Service Platform) per AWS. Per on-premise, devi auto-gestire il cluster Kubernetes e integrare Plesk tramite API. Nel mio setup hybrid uso Plesk on-premise per VPS tradizionali e Kubernetes on AWS EKS per AI workload, con federazione via webhook.<\/p>\n<h2>Conclusione<\/h2>\n<p><strong>Plesk Kubernetes<\/strong> non \u00e8 un prodotto ufficiale, ma l&#8217;integrazione \u00e8 possibile e potente: Plesk gestisce la parte cliente\/business, Kubernetes gestisce l&#8217;orchestrazione dei container. Con GPU sharing (MIG + time-slicing), resource quotas rigorose e cost attribution trasparente, ho scalato a 150+ clienti multi-tenant su un singolo cluster distribuito nel 2026.<\/p>\n<p>Se gestisci hosting multi-tenant e workload AI, questa architettura vale l&#8217;investimento iniziale di integrazione. <a href=\"https:\/\/darioiannascoli.it\/blog\/plesk-billing-cost-attribution-ai-workloads-2026-resource-limits-finops\/\">Ho scritto anche una guida su Plesk billing e FinOps<\/a> che completa questo articolo.<\/p>\n<p>Avete domande su Plesk, Kubernetes o orchestrazione GPU nel vostro ambiente? Commentate qui sotto!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Come implementare Plesk + Kubernetes per GPU sharing multi-tenant 2026: MIG, time-slicing, resource quotas e cost attribution su cluster distribuiti. Guida pratica con YAML.<\/p>\n","protected":false},"author":1,"featured_media":2220,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_seopress_robots_primary_cat":"","_seopress_titles_title":"Plesk Kubernetes GPU Sharing 2026 | Multi-Tenant Cost Attribution","_seopress_titles_desc":"Guida completa Plesk Kubernetes: GPU sharing MIG\/time-slicing, resource quotas multi-tenant e cost attribution per AI workloads distribuiti. Setup production-ready 2026.","_seopress_robots_index":"","footnotes":""},"categories":[4],"tags":[436,878,915,849,916,116],"class_list":["post-2219","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-plesk","tag-ai-workloads","tag-container-orchestration","tag-gpu-sharing","tag-kubernetes","tag-multi-tenant","tag-plesk"],"_links":{"self":[{"href":"https:\/\/darioiannascoli.it\/blog\/wp-json\/wp\/v2\/posts\/2219","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/darioiannascoli.it\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/darioiannascoli.it\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/darioiannascoli.it\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/darioiannascoli.it\/blog\/wp-json\/wp\/v2\/comments?post=2219"}],"version-history":[{"count":0,"href":"https:\/\/darioiannascoli.it\/blog\/wp-json\/wp\/v2\/posts\/2219\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/darioiannascoli.it\/blog\/wp-json\/wp\/v2\/media\/2220"}],"wp:attachment":[{"href":"https:\/\/darioiannascoli.it\/blog\/wp-json\/wp\/v2\/media?parent=2219"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/darioiannascoli.it\/blog\/wp-json\/wp\/v2\/categories?post=2219"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/darioiannascoli.it\/blog\/wp-json\/wp\/v2\/tags?post=2219"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}