{"id":97982,"date":"2020-10-23T14:42:15","date_gmt":"2020-10-23T12:42:15","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/devyat-sovetov-po-povysheniyu-proizvoditelnosti-kubernetes"},"modified":"2020-11-18T00:58:47","modified_gmt":"2020-11-17T22:58:47","slug":"devyat-sovetov-po-povysheniyu-proizvoditelnosti-kubernetes","status":"publish","type":"post","link":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/devyat-sovetov-po-povysheniyu-proizvoditelnosti-kubernetes","title":{"rendered":"Nove consigli per migliorare le prestazioni di Kubernetes","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Nove consigli per migliorare le prestazioni di Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/92dc510aa9d785a31d310816b18bf854.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Ciao a tutti! Mi chiamo Oleg Sidorenko, lavoro per l'azienda DomClick come responsabile del team infrastrutturale. Da pi\u00f9 di tre anni utilizziamo 'Kubik' in produzione e in questo periodo abbiamo attraversato molti momenti interessanti con esso. Oggi vi racconter\u00f2 come, con un approccio corretto, si pu\u00f2 estrarre ancora pi\u00f9 prestazioni da un Kubernetes 'vanilla' per il vostro cluster. Pronti, partenza, via! <\/p>\n<p>Tutti voi sapete bene che Kubernetes \u00e8 un sistema scalabile open source per l'orchestrazione di container; o meglio, 5 binari che fanno magia gestendo il ciclo di vita dei vostri microservizi in un ambiente server. Inoltre, \u00e8 uno strumento piuttosto flessibile, che pu\u00f2 essere assemblato come un costruttore Lego, per una massima personalizzazione in base a diverse esigenze.<\/p>\n<p>E sembrerebbe tutto a posto: aggiungi i server al cluster, come legna da ardere in un caminetto, e non preoccuparti. Ma se ti preme l'ecologia, potresti pensare: \"Come posso mantenere il fuoco acceso nel camino e allo stesso tempo preservare la foresta?\". In altre parole, come trovare modi per migliorare l'infrastruttura e ridurre i costi.<\/p>\n<h2>1. Monitora le risorse dei team e delle applicazioni<\/h2>\n<p><img decoding=\"async\" alt=\"Nove consigli per migliorare le prestazioni di Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/91e2e60b47ee985b024532c8b685230c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Uno dei metodi pi\u00f9 banali ma efficaci \u00e8 l'introduzione di requests\/limits. Suddividi le applicazioni per namespaces, e i namespaces per team di sviluppo. Imposta i valori di consumo di tempo CPU, memoria e storage effimero per l'applicazione prima della distribuzione.<\/p>\n<pre><code>resources:\n   requests:\n     memory: 2Gi\n     cpu: 250m\n   limits:\n     memory: 4Gi\n     cpu: 500m<\/code><\/pre>\n<p>Sperimentando, abbiamo concluso che non vale la pena gonfiare le richieste dai limiti di oltre due volte. Il volume del cluster \u00e8 calcolato in base alle richieste, e se imposti per le applicazioni differenze nelle risorse, ad esempio, da 5 a 10 volte, immagina cosa succeder\u00e0 al tuo nodo quando si riempir\u00e0 di pod e ricever\u00e0 improvvisamente un carico. Niente di buono. Al minimo, throttling; al massimo, ti dirai addio al worker e avrai un carico ciclico sugli altri nodi dopo che i pod inizieranno a migrare.<\/p>\n<p>Inoltre, utilizzando <code>limitranges<\/code> puoi impostare fin da subito i valori delle risorse per il container \u2014 minimi, massimi e predefiniti:<\/p>\n<pre><code>\u279c  ~ kubectl descrivi limitranges --namespace ops\nNome:       limit-range\nNamespace:  ops\nTipo       Risorsa              Min   Max   Richiesta Predefinita  Limite Predefinito  Rapporto Massimo Limite\/Richiesta\n----       --------              ---   ---   -------------------  ----------------  --------------------------\nContainer   cpu                   50m   10    100m                100m              2\nContainer   ephemeral-storage     12Mi  8Gi   128Mi               4Gi               -\nContainer   memory                64Mi  40Gi  128Mi               128Mi             2<\/code><\/pre>\n<p>Non dimenticate di limitare le risorse del namespace affinch\u00e9 un team non possa utilizzare tutte le risorse del cluster:<\/p>\n<pre><code>\u279c  ~ kubectl descrivi resourcequotas --namespace ops\nNome:                   resource-quota\nNamespace:              ops\nRisorsa                Utilizzato       Massimo\n--------                ----             ----\nlimits.cpu              77250m         80\nlimits.memory           124814367488   150Gi\npods                    31             45\nrequests.cpu            53850m         80\nrequests.memory         75613234944    150Gi\nservices                26             50\nservices.loadbalancers  0              0\nservices.nodeports      0              0<\/code><\/pre>\n<p>Come si evince dalla descrizione <code>resourcequotas<\/code>, se il team ops desidera distribuire pod che consumeranno altri 10 cpu, il pianificatore non consentir\u00e0 di farlo e restituir\u00e0 un errore:<\/p>\n<pre><code>Errore durante la creazione: i pod \"nginx-proxy-9967d8d78-nh4fs\" sono vietati: superato il limite: resource-quota, richiesto: limits.cpu=5, requests.cpu=5, utilizzato: limits.cpu=77250m, requests.cpu=53850m, limitato: limits.cpu=10, requests.cpu=10<\/code><\/pre>\n<p>Per risolvere un problema simile si pu\u00f2 scrivere uno strumento, ad esempio, come <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/pauljamm\/team-operator\">questo<\/a><\/noindex>, in grado di memorizzare e impegnare lo stato delle risorse dei team.<\/p>\n<h2>2. Scegliete uno storage ottimale<\/h2>\n<p><img decoding=\"async\" alt=\"Nove consigli per migliorare le prestazioni di Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/c7f8bdbf5490acc9061695a6d608015e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Qui vorrei affrontare il tema dei volumi persistenti e del sottosistema di archiviazione delle worker node di Kubernetes. Spero che nessuno utilizzi \"Cube\" su HDD in produzione, ma a volte anche un SSD comune non \u00e8 sufficiente. Ci siamo imbattuti in problemi in cui i log saturavano il disco per le operazioni di input\/output, e le possibilit\u00e0 di risoluzione non sono molte: <\/p>\n<ul>\n<li>\n<p>Utilizzare SSD ad alte prestazioni o passare a NVMe (se gestite il vostro hardware).<\/p>\n<\/li>\n<li>\n<p>Ridurre il livello di registrazione.<\/p>\n<\/li>\n<li>\n<p>Effettuare un bilanciamento \"intelligente\" dei pod che sovraccaricano il disco (<code>podAntiAffinity<\/code>).<\/p>\n<\/li>\n<\/ul>\n<p>Lo screenshot sopra mostra cosa succede al disco del nginx-ingress-controller quando \u00e8 attivata la registrazione dei access_logs (~12 mila registrazioni\/sec.). Questo stato, naturalmente, pu\u00f2 portare a una degradazione di tutte le applicazioni su questa node.<\/p>\n<p>Per quanto riguarda i PV, purtroppo, non ho testato tutti <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/concepts\/storage\/persistent-volumes\/#types-of-persistent-volumes\">tipi<\/a><\/noindex> Volume Persistenti. Utilizza l'opzione migliore che si adatta a te. Storicamente, abbiamo avuto una piccola parte di servizi che richiedono volumi RWX, e da tempo \u00e8 stata utilizzata una memoria NFS per questo scopo. Economica e... sufficiente. Certo, abbiamo avuto delle esperienze spiacevoli con essa, ma abbiamo imparato a ottimizzarla, e ora non abbiamo pi\u00f9 problemi. E se possibile, passa a uno storage object come S3.<\/p>\n<h2>3. Raccogliete immagini ottimizzate<\/h2>\n<p><img decoding=\"async\" alt=\"Nove consigli per migliorare le prestazioni di Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/c25ce405d1eb4c01f031e18b0bfa4836.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>\u00c8 meglio utilizzare immagini ottimizzate per i container, affinch\u00e9 Kubernetes possa recuperarle pi\u00f9 rapidamente ed eseguirle in modo pi\u00f9 efficiente.&nbsp;<\/p>\n<p>Ottimizzazione significa che le immagini:<\/p>\n<ul>\n<li>\n<p>contengono solo una applicazione o svolgono solo una funzione;<\/p>\n<\/li>\n<li>\n<p>sono di dimensioni ridotte, perch\u00e9 le immagini grandi si trasferiscono peggio attraverso la rete;<\/p>\n<\/li>\n<li>\n<p>hanno endpoint per il controllo dello stato e della disponibilit\u00e0, con i quali Kubernetes pu\u00f2 intraprendere azioni in caso di inattivit\u00e0;<\/p>\n<\/li>\n<li>\n<p>utilizzano sistemi operativi friendly per i container (come Alpine o CoreOS), che sono pi\u00f9 resistenti agli errori di configurazione;<\/p>\n<\/li>\n<li>\n<p>utilizzano build multistep, affinch\u00e9 possiate distribuire solo le applicazioni compile e non i relativi sorgenti.<\/p>\n<\/li>\n<\/ul>\n<p>Ci sono molti strumenti e servizi che consentono di controllare e ottimizzare le immagini al volo. \u00c8 importante mantenerli sempre aggiornati e controllati per la sicurezza. Alla fine si ottiene: <\/p>\n<ol>\n<li>\n<p>Riduzione del carico di rete su tutto il cluster.<\/p>\n<\/li>\n<li>\n<p>Diminuzione del tempo di avvio del container.<\/p>\n<\/li>\n<li>\n<p>Volume ridotto del vostro intero Docker registry.<\/p>\n<\/li>\n<\/ol>\n<h2>4. Utilizzate la cache DNS<\/h2>\n<p><img decoding=\"async\" alt=\"Nove consigli per migliorare le prestazioni di Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/9f4384462a77dc528d7911c56f684f2d.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Quando si tratta di carichi pesanti, senza ottimizzazione del sistema DNS del cluster la situazione \u00e8 piuttosto difficile. Un tempo, gli sviluppatori di Kubernetes supportavano la loro soluzione kube-dns. \u00c8 stata implementata anche da noi, ma questo software non \u00e8 stato ottimizzato e non forniva la performance richiesta, anche se, a prima vista, sembrava un compito semplice. Poi \u00e8 arrivato coredns, al quale ci siamo trasferiti, e non abbiamo avuto pi\u00f9 problemi, diventando poi il servizio DNS predefinito in K8s. A un certo punto siamo arrivati a 40.000 rps per il sistema DNS, e anche questa soluzione \u00e8 diventata insufficiente. Ma, per un caso fortunato, \u00e8 stato introdotto Nodelocaldns, conosciuto anche come cache locale del nodo, noto anche come <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/tasks\/administer-cluster\/nodelocaldns\/\">NodeLocal DNSCache<\/a><\/noindex>.<\/p>\n<p>Perch\u00e9 lo utilizziamo? Nel kernel Linux c'\u00e8 un bug che, quando si verifica un accesso multiplo tramite conntrack NAT su UDP, porta a una condizione di gara per la scrittura nelle tabelle conntrack, causando la perdita di una parte del traffico tramite NAT (ogni accesso tramite il servizio \u00e8 NAT). Nodelocaldns risolve questo problema eliminando il NAT e aggiornando la connessione a TCP verso i DNS upstream, oltre a effettuare il caching locale delle richieste DNS agli upstream (incluso un breve caching negativo di 5 secondi).<\/p>\n<h2>5. Scala automaticamente i pod orizzontalmente e verticalmente<\/h2>\n<p><img decoding=\"async\" alt=\"Nove consigli per migliorare le prestazioni di Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/3804a14685a55160fa7d9f3226eab1fa.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Puoi dire con sicurezza che tutti i tuoi microservizi sono pronti per una crescita del carico di lavoro di due o tre volte? Come allocare correttamente le risorse alle tue applicazioni? Mantenere attivi alcuni pod oltre il carico di lavoro pu\u00f2 risultare superfluo, mentre averne pochi potrebbe comportare un'interruzione a causa di un'improvvisa crescita del traffico sul servizio. La soluzione a questo problema \u00e8 fornita da servizi come <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/tasks\/run-application\/horizontal-pod-autoscale\/\">Horizontal Pod Autoscaler<\/a><\/noindex> e <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/kubernetes\/autoscaler\/tree\/master\/vertical-pod-autoscaler\">Vertical Pod Autoscaler<\/a><\/noindex>. <\/p>\n<p><strong>VPA<\/strong> permette di aumentare automaticamente i requests\/limits dei tuoi container nel pod in base all'uso effettivo. Come pu\u00f2 essere utile? Se hai pod che non possono essere scalati orizzontalmente per qualche motivo (il che non \u00e8 proprio affidabile), puoi provare a delegare la modifica delle loro risorse al VPA. Il suo punto forte \u00e8 un sistema di raccomandazioni basato su dati storici e attuali dal metric-server, quindi, se non vuoi cambiare automaticamente i requests\/limits, puoi semplicemente monitorare le risorse consigliate per i tuoi container e ottimizzare le impostazioni per risparmiare CPU e memoria nel cluster. <\/p>\n<p><img decoding=\"async\" alt=\"Nove consigli per migliorare le prestazioni di Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/3965950aa3315faa4bb3e3ff5bd61955.png\" style=\"display:block;margin: 0 auto;\" \/>Immagine presa da https:\/\/levelup.gitconnected.com\/kubernetes-autoscaling-101-cluster-autoscaler-horizontal-pod-autoscaler-and-vertical-pod-2a441d9ad231<\/p>\n<p>Il pianificatore in Kubernetes si basa sempre sui requests. Qualunque valore tu imposti, il pianificatore cercher\u00e0 un nodo adatto basandosi su di esso. I valori limits sono necessari per il kubelet per capire quando limitare o terminare un pod. E poich\u00e9 l'unico parametro importante \u00e8 il valore dei requests, il VPA funzioner\u00e0 con esso. Ogni volta che imposti il ridimensionamento verticale di un'applicazione, stai definendo quali dovrebbero essere i requests. E cosa succede ai limits? Questo parametro sar\u00e0 anch'esso scalato in proporzione.<\/p>\n<p>Ad esempio, ecco le impostazioni tipiche di un pod:<\/p>\n<pre><code>risorse:\n   richieste:\n     memoria: 250Mi\n     cpu: 200m\n   limiti:\n     memoria: 500Mi\n     cpu: 350m<\/code><\/pre>\n<p>Il meccanismo di raccomandazione stabilisce che alla tua applicazione servono 300m di CPU e 500Mi per funzionare normalmente. Riceverai queste impostazioni:<\/p>\n<pre><code>risorse:\n   richieste:\n     memoria: 500Mi\n     cpu: 300m\n   limiti:\n     memoria: 1000Mi\n     cpu: 525m<\/code><\/pre>\n<p>Come accennato precedentemente, questa \u00e8 una scalabilit\u00e0 proporzionale basata sul rapporto tra richieste e limiti nel manifesto:<\/p>\n<ul>\n<li>\n<p>CPU: 200m \u2192 300m: rapporto 1:1.75;<\/p>\n<\/li>\n<li>\n<p>Memoria: 250Mi \u2192 500Mi: rapporto 1:2.<\/p>\n<\/li>\n<\/ul>\n<p>Per quanto riguarda <strong>HPA<\/strong>, quindi qui il meccanismo di lavoro \u00e8 pi\u00f9 trasparente. Vengono impostati valori soglia delle metriche, ad esempio, per CPU e memoria, e se la media di tutte le repliche supera la soglia, l'applicazione si scala di +1 pod fino a quando il valore non scende al di sotto della soglia, o fino a quando non viene raggiunto il numero massimo di repliche.<\/p>\n<p><img decoding=\"async\" alt=\"Nove consigli per migliorare le prestazioni di Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/f7a3fa28177d66be925867e38f5bbed6.png\" style=\"display:block;margin: 0 auto;\" \/>Immagine presa da https:\/\/levelup.gitconnected.com\/kubernetes-autoscaling-101-cluster-autoscaler-horizontal-pod-autoscaler-and-vertical-pod-2a441d9ad231<\/p>\n<p>Oltre alle metriche standard, come CPU e memoria, puoi impostare soglie sulle tue metriche personalizzate da Prometheus e lavorare con esse se ritieni che sia la definizione pi\u00f9 precisa di quando scalare la tua applicazione. Una volta che l'applicazione si stabilizza al di sotto del limite di soglia delle metriche, HPA inizier\u00e0 a ridurre i pod fino al numero minimo di repliche o fino a quando il carico soddisfer\u00e0 il limite stabilito.<\/p>\n<h2>6. Non dimenticare l'affinit\u00e0 tra nodi e pod<\/h2>\n<p><img decoding=\"async\" alt=\"Nove consigli per migliorare le prestazioni di Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/e718191d9e8ff25fd3b2d65cba9b3b73.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Non tutti i nodi operano su hardware identico e non tutti i pod devono eseguire applicazioni che richiedono intensivi calcoli. Kubernetes consente di definire la specializzazione di nodi e pod tramite <strong>affinit\u00e0 del nodo<\/strong> e <strong>affinit\u00e0 del pod<\/strong>.<\/p>\n<p>Se hai nodi adatti per operazioni ad alta intensit\u00e0 di calcolo, \u00e8 meglio associare le applicazioni ai nodi appropriati per massimizzare l'efficienza. A tal fine, utilizza <code>nodeSelector<\/code> con etichetta del nodo.<\/p>\n<p>Supponiamo di avere due nodi: uno con <code>CPUType=HIGHFREQ<\/code> e un gran numero di core veloci, l'altro con <code>MemoryType=HIGHMEMORY<\/code> una grande quantit\u00e0 di memoria e una maggiore rapidit\u00e0. Il modo pi\u00f9 semplice per assegnare il deployment del pod al nodo <code>HIGHFREQ<\/code>, aggiungendo nella sezione <code>spec<\/code> il seguente selettore:<\/p>\n<pre><code>\u2026\nnodeSelector:\n\tCPUType: HIGHFREQ<\/code><\/pre>\n<p>Un modo pi\u00f9 costoso e specifico per farlo \u00e8 utilizzare <code>nodeAffinity<\/code> nel campo <code>affinity<\/code> della sezione <code>spec<\/code>. Ci sono due opzioni:<\/p>\n<ul>\n<li>\n<p><code>requiredDuringSchedulingIgnoredDuringExecution<\/code>: impostazione rigida (il pianificatore distribuir\u00e0 i pod solo su nodi specifici (e non altrove));<\/p>\n<\/li>\n<li>\n<p><code>preferredDuringSchedulingIgnoredDuringExecution<\/code>: configurazione morbida (il pianificatore cercher\u00e0 di distribuire su nodi specifici, e se non ci riesce, cercher\u00e0 di distribuire sul nodo disponibile successivo).<\/p>\n<\/li>\n<\/ul>\n<p>Puoi specificare una sintassi particolare per il controllo delle etichette dei nodi, ad esempio, <code>In<\/code>, <code>NotIn<\/code>, <code>Esiste<\/code>, <code>NonEsiste<\/code>, <code>Gt<\/code> o <code>Lt<\/code>. Tuttavia, tieni presente che metodi complessi in lunghi elenchi di etichette rallenteranno le decisioni in situazioni critiche. In altre parole, non appesantirli.<\/p>\n<p>Come accennato sopra, Kubernetes consente di specificare l'affinit\u00e0 dei pod attuali. Cio\u00e8, puoi fare in modo che determinati pod lavorino insieme ad altri pod nella stessa zona di disponibilit\u00e0 (rilevante per il cloud) o nodi.<\/p>\n<p>In <code>podAffinity<\/code> campi <code>affinity<\/code> della sezione <code>spec<\/code> sono disponibili gli stessi campi come nel caso di <code>nodeAffinity<\/code>: <code>requiredDuringSchedulingIgnoredDuringExecution<\/code><strong> <\/strong>e <code>preferredDuringSchedulingIgnoredDuringExecution<\/code>. L'unica differenza \u00e8 che <code>matchExpressions<\/code> collegher\u00e0 i pod al nodo su cui \u00e8 gi\u00e0 in esecuzione un pod con quella etichetta.<\/p>\n<p>Inoltre, Kubernetes offre un campo <code>podAntiAffinity<\/code>, che invece non collega il pod a nodi con determinati pod.<\/p>\n<p>Per quanto riguarda le espressioni <code>nodeAffinity<\/code> puoi dare lo stesso consiglio: cerca di mantenere la semplicit\u00e0 e la coerenza delle regole, non cercare di sovraccaricare la specifica dei pod con un insieme complesso di regole. \u00c8 molto facile creare una regola che non soddisfer\u00e0 le condizioni del cluster, causando un carico eccessivo sul pianificatore e riducendo le prestazioni complessive.<\/p>\n<h2>7. Taints &amp; Tolerations<\/h2>\n<p>C'\u00e8 un altro modo per gestire il pianificatore. Se hai un grande cluster con centinaia di nodi e migliaia di microservizi, \u00e8 molto difficile non consentire a determinati pod di essere collocati in determinati nodi.<\/p>\n<p>Questo \u00e8 assistito dal meccanismo dei taints \u2014 regole restrittive. Ad esempio, in determinati scenari, puoi vietare a determinati nodi di eseguire pod al loro interno. Per applicare un taint a un nodo specifico, devi usare l'opzione <code>taint<\/code> in kubectl. Specifica la chiave e il valore, e poi il taint come <code>NoSchedule<\/code> o <code>NoExecute<\/code>:<\/p>\n<pre><code>$ kubectl taint nodes node10 node-role.kubernetes.io\/ingress=true:NoSchedule<\/code><\/pre>\n<p>Vale la pena notare che il meccanismo dei taint supporta tre effetti principali: <code>NoSchedule<\/code>, <code>NoExecute<\/code> e <code>PreferNoSchedule<\/code><strong>. <\/strong><\/p>\n<ul>\n<li>\n<p><code>NoSchedule<\/code><strong> <\/strong>significa che finch\u00e9 non ci sar\u00e0 una voce corrispondente nella specifica del pod <code>tolerations<\/code>, non potr\u00e0 essere distribuito su un nodo (in questo esempio <code>node10<\/code>).<\/p>\n<\/li>\n<li>\n<p><code>PreferNoSchedule <\/code>\u2014 una versione semplificata <code>NoSchedule<\/code>. In questo caso, il pianificatore cercher\u00e0 di non distribuire i pod che non hanno la voce corrispondente <code>tolerations<\/code> sul nodo, ma non \u00e8 un vincolo rigido. Se nel cluster non ci saranno risorse, i pod inizieranno a distribuire su quel nodo.<\/p>\n<\/li>\n<li>\n<p><code>NoExecute<\/code><strong> <\/strong>\u2014 questo effetto attiva l'evacuazione immediata dei pod che non hanno una registrazione corrispondente <code>tolerations<\/code>.<\/p>\n<\/li>\n<\/ul>\n<p>\u00c8 curioso notare che questo comportamento pu\u00f2 essere annullato tramite meccanismi di tolerations. Questo \u00e8 comodo quando esiste un nodo \"vietato\" e hai bisogno di posizionare solo servizi infrastrutturali su di esso. Come fare? Consentire solo i pod per i quali esiste una toleration adeguata.<\/p>\n<p>Ecco come apparir\u00e0 la specifica del pod:<\/p>\n<pre><code>spec:\n   tolerations:\n     - key: \"node-role.kubernetes.io\\\/ingress\"\n        operator: \"Equal\"\n        value: \"true\"\n        effect: \"NoSchedule\"<\/code><\/pre>\n<p>Questo non significa che al prossimo ridistribuzione il pod andr\u00e0 su questo nodo, non \u00e8 un meccanismo di Node Affinity e <code>nodeSelector<\/code>. Ma combinando pi\u00f9 funzionalit\u00e0, puoi ottenere una configurazione molto flessibile del pianificatore.<\/p>\n<h2>8. Configura la priorit\u00e0 dei deployment dei pod<\/h2>\n<p>Il fatto che tu abbia configurato il binding dei pod ai nodi non significa che tutti i pod debbano essere elaborati con la stessa priorit\u00e0. Ad esempio, potresti voler distribuire alcuni pod prima di altri.<\/p>\n<p>Kubernetes offre diversi modi per configurare la priorit\u00e0 dei pod (Pod Priority and Preemption). La configurazione consiste in diverse parti: l'oggetto <code>PriorityClass<\/code><strong> <\/strong>e la descrizione del campo <code>priorityClassName<\/code><strong> <\/strong>nella specifica del pod. Vediamo un esempio:<\/p>\n<pre><code>apiVersion: scheduling.k8s.io\\\/v1\nkind: PriorityClass\nmetadata:\n  name: high-priority\nvalue: 99999\nglobalDefault: false\ndescription: \"Questa classe di priorit\u00e0 dovrebbe essere utilizzata solo per pod molto importanti\"<\/code><\/pre>\n<p>Stiamo creando <code>PriorityClass<\/code>, impostando un nome, una descrizione e un valore.<strong> <\/strong>Pi\u00f9 alto \u00e8 <code>value<\/code>, maggiore sar\u00e0 la priorit\u00e0. Il valore pu\u00f2 essere qualsiasi numero intero a 32 bit, minore o uguale a 1.000.000.000. Valori pi\u00f9 elevati sono riservati per pod di sistema critici, che di norma non possono essere espulsi.<strong> <\/strong>L'espulsione avverr\u00e0 solo se il pod ad alta priorit\u00e0 non ha altro posto dove distribuirsi, allora alcuni pod di un determinato nodo verranno evacuati. Se questo meccanismo \u00e8 troppo rigido per te, puoi aggiungere l'opzione <code>preemptionPolicy: Never<\/code>, e cos\u00ec non ci sar\u00e0 espulsione, il pod sar\u00e0 il primo in coda e attender\u00e0 che il pianificatore trovi risorse libere per lui.<\/p>\n<p>Successivamente, creiamo un pod in cui specifichiamo il nome <code>priorityClassName<\/code>:<\/p>\n<pre><code>apiVersion: v1\nkind: Pod\nmetadata:\n  name: static-web\n  labels:\n    role: myrole\n spec:\n  containers:\n    - name: web\n      image: nginx\n      ports:\n        - name: web\n          containerPort: 80\n          protocol: TCP\n  priorityClassName: high-priority\n          <\/code><\/pre>\n<p>\u00c8 possibile creare un numero illimitato di classi di priorit\u00e0, anche se si consiglia di non esagerare (ad esempio, limitarsi a priorit\u00e0 bassa, media e alta). <\/p>\n<p>In questo modo, se necessario, potrai aumentare l'efficienza del deployment dei servizi critici, come nginx-ingress-controller, coredns, ecc.<\/p>\n<h2>9. Ottimizza il cluster ETCD<\/h2>\n<p><img decoding=\"async\" alt=\"Nove consigli per migliorare le prestazioni di Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/f5917adfa943c789b6c784f43305851b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>L'ETCD pu\u00f2 essere considerato il cervello dell'intero cluster. \u00c8 molto importante mantenere questo DB funzionante a un alto livello, poich\u00e9 da esso dipende la velocit\u00e0 delle operazioni nel \"Kube\". Una soluzione abbastanza standard e, allo stesso tempo, valida \u00e8 mantenere il cluster ETCD sui nodi master, per avere una latenza minima fino al kube-apiserver. Se non \u00e8 possibile farlo, posiziona l'ETCD il pi\u00f9 vicino possibile, assicurandoti una buona larghezza di banda tra i partecipanti. Fai anche attenzione a quante nodi dell'ETCD possono cadere senza danneggiare il cluster.<\/p>\n<p><img decoding=\"async\" alt=\"Nove consigli per migliorare le prestazioni di Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/cdd2c32eefed253c6ff774899c367ccc.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Tieni presente che l'aumento eccessivo del numero di partecipanti nel cluster pu\u00f2 aumentare la tolleranza ai guasti a scapito delle prestazioni; tutto deve essere fatto con moderazione.<\/p>\n<p>Parlando della configurazione del servizio, le raccomandazioni sono poche:<\/p>\n<ol>\n<li>\n<p>Avere un buon hardware, a seconda delle dimensioni del cluster (puoi leggere <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/etcd-io\/etcd\/blob\/master\/Documentation\/op-guide\/hardware.md\">qui<\/a><\/noindex>).<\/p>\n<\/li>\n<li>\n<p>Regolare alcuni parametri, se hai distribuito il cluster tra un paio di DC o se la tua rete e i tuoi dischi lasciano a desiderare (puoi leggere <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/etcd-io\/etcd\/blob\/master\/Documentation\/tuning.md\">qui<\/a><\/noindex>).<\/p>\n<\/li>\n<\/ol>\n<h2>Conclusione<\/h2>\n<p>In questo articolo sono descritti i punti che il nostro team cerca di seguire. Non si tratta di una descrizione passo passo delle azioni, ma di opzioni che possono essere utili per ottimizzare i costi operativi del cluster. \u00c8 chiaro che ogni cluster \u00e8 unico a modo suo e le soluzioni di configurazione possono variare notevolmente, quindi sarebbe interessante ricevere da voi dei feedback: come monitorate il vostro cluster Kubernetes, con cosa migliorate le sue prestazioni? Condividete la vostra esperienza nei commenti, sar\u00e0 interessante conoscerla. <\/p>\n<p>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/domclick\/blog\/520968\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041e\u043b\u0435\u0433 \u0421\u0438\u0434\u043e\u0440\u0435\u043d\u043a\u043e\u0432, \u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0414\u043e\u043c\u041a\u043b\u0438\u043a \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b. \u041c\u044b \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0438\u0440\u0443\u0435\u043c \u00ab\u041a\u0443\u0431\u0438\u043a\u00bb \u0432 \u043f\u0440\u043e\u0434\u0435 \u0443\u0436\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u0442\u0440\u0451\u0445 \u043b\u0435\u0442, \u0438 \u0437\u0430 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u0435\u0440\u0435\u0436\u0438\u043b\u0438 \u0441 \u043d\u0438\u043c \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u0432. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u043f\u043e\u0432\u0435\u0434\u0430\u044e \u0432\u0430\u043c, \u043a\u0430\u043a \u043f\u0440\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u0435 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0436\u0430\u0442\u044c \u0438\u0437 \u00ab\u0432\u0430\u043d\u0438\u043b\u044c\u043d\u043e\u0433\u043e\u00bb Kubernetes \u0435\u0449\u0451 \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0432\u0430\u0448\u0435\u0433\u043e \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430. Ready steady [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":97983,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-97982","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442!\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/devyat-sovetov-po-povysheniyu-proizvoditelnosti-kubernetes\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0414\u0435\u0432\u044f\u0442\u044c \u0441\u043e\u0432\u0435\u0442\u043e\u0432 \u043f\u043e \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 Kubernetes | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442!\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/devyat-sovetov-po-povysheniyu-proizvoditelnosti-kubernetes\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-10-23T12:42:15+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-11-17T22:58:47+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Nove consigli per migliorare le prestazioni di Kubernetes | ProHoster","description":"Ciao a tutti!","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/devyat-sovetov-po-povysheniyu-proizvoditelnosti-kubernetes","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0414\u0435\u0432\u044f\u0442\u044c \u0441\u043e\u0432\u0435\u0442\u043e\u0432 \u043f\u043e \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 Kubernetes | ProHoster","og:description":"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442!","og:url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/devyat-sovetov-po-povysheniyu-proizvoditelnosti-kubernetes","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-10-23T12:42:15+00:00","article:modified_time":"2020-11-17T22:58:47+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"97982","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 10:08:27","updated":"2022-09-30 17:30:03","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/97982","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=97982"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/97982\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/97983"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=97982"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=97982"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=97982"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}