Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
Karpenter
Suggerimento
Esplora le
Karpenter
-
Monitora i pod che lo scheduler Kubernetes non può pianificare a causa di vincoli di risorse.
-
Valuta i requisiti di pianificazione (richieste di risorse, selettori di nodi, affinità, tolleranze, ecc.) dei pod non programmabili.
-
Effettua il provisioning di nuovi nodi che soddisfino i requisiti di tali pod.
-
Rimuovi i nodi quando non sono più necessari.
Con Karpenter, è possibile definire NodePools vincoli sul provisioning dei nodi, ad esempio limiti, etichette, requisiti (tipi di istanza, zone, ecc.) e limiti sul totale delle risorse assegnate. Quando si distribuiscono carichi di lavoro, è possibile specificare vari vincoli di pianificazione nelle specifiche del pod, come risorse, selettori di nodi requests/limits, affinità, tolleranze e vincoli di diffusione della topologia. node/pod Karpenter fornirà quindi nodi della giusta dimensione in base a queste specifiche.
Motivi per utilizzare Karpenter
Prima del lancio di Karpenter, gli utenti di Kubernetes si affidavano principalmente ai gruppi Amazon EC2 Auto Scaling e al Kubernetes Cluster
Karpenter consolida le responsabilità di orchestrazione delle istanze in un unico sistema, che è più semplice, stabile e compatibile con i cluster. Karpenter è stato progettato per superare alcune delle sfide presentate da Cluster Autoscaler fornendo modi semplificati per:
-
Esegui il provisioning dei nodi in base ai requisiti del carico di lavoro.
-
Crea diverse configurazioni di nodi per tipo di istanza, utilizzando opzioni flessibiliNodePool . Invece di gestire molti gruppi di nodi personalizzati specifici, Karpenter potrebbe consentirti di gestire diverse capacità di carico di lavoro con un'unica soluzione flessibile. NodePool
-
Ottieni una migliore pianificazione dei pod su larga scala avviando rapidamente i nodi e pianificando i pod.
Per informazioni e documentazione sull'uso di Karpenter, visita il sito karpenter.sh. https://karpenter.sh/
Raccomandazioni
Le migliori pratiche sono suddivise in sezioni su Karpenter stesso e sulla pianificazione dei pod NodePools.
Le migliori pratiche di Karpenter
Le seguenti best practice riguardano argomenti relativi a Karpenter stesso.
Blocca le AMI nei cluster di produzione
Ti consigliamo vivamente di aggiungere Amazon Machine Images (AMI) note utilizzate da Karpenter per i cluster di produzione. L'utilizzo amiSelector con un alias impostato su@latest, o l'utilizzo di un altro metodo che comporti la distribuzione di AMI non testate non appena vengono rilasciate, comporta il rischio di guasti del carico di lavoro e tempi di inattività nei cluster di produzione. Di conseguenza, consigliamo vivamente di aggiungere le versioni funzionanti testate delle AMI ai cluster di produzione mentre testate le versioni più recenti in cluster non di produzione. Ad esempio, puoi impostare un alias nel tuo come segue: NodeClass
amiSelectorTerms - alias: al2023@v20240807
Per informazioni sulla gestione e il blocco delle AMI in Karpenter, vedi Gestione delle AMI
Usa Karpenter per carichi di lavoro con esigenze di capacità variabili
Karpenter avvicina la gestione della scalabilità alle API native di Kubernetes rispetto agli Autoscaling Groups (ASG) e ai Managed Node Groups (MNG).
Karpenter rimuove un livello di astrazione di AWS per portare parte della flessibilità direttamente in Kubernetes. Karpenter è ideale per i cluster con carichi di lavoro che incontrano periodi di domanda elevata e intensa o hanno requisiti di elaborazione diversi. MNG e ASG sono ideali per i cluster che eseguono carichi di lavoro che tendono ad essere più statici e coerenti. È possibile utilizzare una combinazione di nodi gestiti dinamicamente e staticamente, a seconda delle esigenze.
Prendi in considerazione altri progetti di scalabilità automatica quando...
Hai bisogno di funzionalità che sono ancora in fase di sviluppo in Karpenter. Poiché Karpenter è un progetto relativamente nuovo, per il momento prendi in considerazione altri progetti di scalabilità automatica se hai bisogno di funzionalità che non fanno ancora parte di Karpenter.
Esegui il controller Karpenter su EKS Fargate o su un nodo di lavoro che appartiene a un gruppo di nodi
Karpenter viene installato utilizzando un diagramma Helm. https://karpenter.sh/docs/getting-started/getting-started-with-karpenter/#4-install-karpenterkarpenter In questo modo, tutti i pod distribuiti in questo namespace verranno eseguiti su EKS Fargate. Non eseguire Karpenter su un nodo gestito da Karpenter.
Karpenter non supporta modelli di avvio personalizzati
Non è disponibile alcun supporto per modelli di avvio personalizzati con le API v1. È possibile utilizzare dati utente personalizzati specificando and/or direttamente le AMI personalizzate in. EC2NodeClass Ulteriori informazioni su come eseguire questa operazione sono disponibili all'indirizzo. NodeClasses
Escludi i tipi di istanza che non si adattano al tuo carico di lavoro
Valuta la possibilità di escludere tipi di istanze specifici dalla node.kubernetes.io/instance-type chiave se non sono richiesti dai carichi di lavoro in esecuzione nel cluster.
L'esempio seguente mostra come evitare il provisioning di istanze Graviton di grandi dimensioni.
- key: node.kubernetes.io/instance-type operator: NotIn values: - m6g.16xlarge - m6gd.16xlarge - r6g.16xlarge - r6gd.16xlarge - c6g.16xlarge
Abilita la gestione delle interruzioni quando usi Spot
Karpenter supporta la gestione nativa delle interruzioni --interruption-queue CLI con il nome della coda SQS predisposta a tale scopo. Non è consigliabile utilizzare la gestione delle interruzioni di Karpenter insieme a Node Termination Handler, come spiegato qui. https://karpenter.sh/docs/faq/#interruption-handling
I pod che richiedono un checkpoint o altre forme di drenaggio graduale, che richiedono 2 minuti prima dello spegnimento, dovrebbero consentire a Karpenter la gestione delle interruzioni nei propri cluster.
Cluster privato Amazon EKS senza accesso a Internet in uscita
Quando esegui il provisioning di un cluster EKS in un VPC senza accesso a Internet, devi assicurarti di aver configurato il tuo ambiente in conformità ai requisiti del cluster privato indicati nella documentazione EKS. Inoltre, devi assicurarti di aver creato un endpoint regionale STS VPC nel tuo VPC. In caso contrario, vedrai errori simili a quelli visualizzati di seguito.
{"level":"FATAL","time":"2024-02-29T14:28:34.392Z","logger":"controller","message":"Checking EC2 API connectivity, WebIdentityErr: failed to retrieve credentials\ncaused by: RequestError: send request failed\ncaused by: Post \"https://sts.<region>.amazonaws.com/\": dial tcp 54.239.32.126:443: i/o timeout","commit":"596ea97"}
Queste modifiche sono necessarie in un cluster privato perché Karpenter Controller utilizza IAM Roles for Service Accounts (IRSA). I pod configurati con IRSA acquisiscono le credenziali chiamando l'API AWS Security Token Service (AWS STS). Se non c'è accesso a Internet in uscita, devi creare e utilizzare un endpoint AWS STS VPC nel tuo VPC.
I cluster privati richiedono anche la creazione di un endpoint VPC per SSM. Quando Karpenter tenta di eseguire il provisioning di un nuovo nodo, interroga le configurazioni del modello Launch e un parametro SSM. Se non hai un endpoint SSM VPC nel tuo VPC, causerà il seguente errore:
{"level":"ERROR","time":"2024-02-29T14:28:12.889Z","logger":"controller","message":"Unable to hydrate the AWS launch template cache, RequestCanceled: request context canceled\ncaused by: context canceled","commit":"596ea97","tag-key":"karpenter.k8s.aws/cluster","tag-value":"eks-workshop"} ... {"level":"ERROR","time":"2024-02-29T15:08:58.869Z","logger":"controller.nodeclass","message":"discovering amis from ssm, getting ssm parameter \"/aws/service/eks/optimized-ami/1.27/amazon-linux-2/recommended/image_id\", RequestError: send request failed\ncaused by: Post \"https://ssm.<region>.amazonaws.com/\": dial tcp 67.220.228.252:443: i/o timeout","commit":"596ea97","ec2nodeclass":"default","query":"/aws/service/eks/optimized-ami/1.27/amazon-linux-2/recommended/image_id"}
Non esiste un endpoint VPC per l'API Price List Query. https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/using-pelong.html Di conseguenza, i dati sui prezzi diventeranno obsoleti nel tempo. Karpenter risolve questo problema includendo i dati sui prezzi su richiesta nel suo formato binario, ma li aggiorna solo quando Karpenter viene aggiornato. Le richieste non riuscite di dati sui prezzi genereranno i seguenti messaggi di errore:
{"level":"ERROR","time":"2024-02-29T15:08:58.522Z","logger":"controller.pricing","message":"retreiving on-demand pricing data, RequestError: send request failed\ncaused by: Post \"https://api.pricing.<region>.amazonaws.com/\": dial tcp 18.196.224.8:443: i/o timeout; RequestError: send request failed\ncaused by: Post \"https://api.pricing.<region>.amazonaws.com/\": dial tcp 18.185.143.117:443: i/o timeout","commit":"596ea97"}
Fai riferimento a questa documentazione
Creando NodePools
Le seguenti best practice riguardano argomenti relativi alla creazione NodePools.
Creane più NodePools quando...
Quando team diversi condividono un cluster e devono eseguire i propri carichi di lavoro su nodi di lavoro diversi o hanno requisiti di sistema operativo o tipo di istanza diversi, creane più NodePools. Ad esempio, un team potrebbe voler utilizzare Bottlerocket, mentre un altro potrebbe voler utilizzare Amazon Linux. Allo stesso modo, un team potrebbe avere accesso a costosi hardware GPU che non sarebbero necessari a un altro team. L'utilizzo di più risorse NodePools assicura che le risorse più appropriate siano disponibili per ogni team.
Creazioni NodePools che si escludono a vicenda o sono ponderate
Si consiglia di creare NodePools che si escludano a vicenda o ponderate per fornire un comportamento di pianificazione coerente. Se non lo sono e più NodePools corrispondono, Karpenter sceglierà in modo casuale quale utilizzare, provocando risultati inaspettati. Di seguito sono riportati alcuni esempi utili per la creazione di più NodePools elementi:
Creare una NodePool GPU e consentire l'esecuzione di carichi di lavoro speciali solo su questi (costosi) nodi:
# NodePool for GPU Instances with Taints apiVersion: karpenter.sh/v1 kind: NodePool metadata: name: gpu spec: disruption: consolidateAfter: 1m consolidationPolicy: WhenEmptyOrUnderutilized template: metadata: {} spec: nodeClassRef: group: karpenter.k8s.aws kind: EC2NodeClass name: default expireAfter: Never requirements: - key: node.kubernetes.io/instance-type operator: In values: - p3.8xlarge - p3.16xlarge - key: kubernetes.io/os operator: In values: - linux - key: kubernetes.io/arch operator: In values: - amd64 - key: karpenter.sh/capacity-type operator: In values: - on-demand taints: - effect: NoSchedule key: nvidia.com/gpu value: "true"
Implementazione con tolleranza per la contaminazione:
# Deployment of GPU Workload will have tolerations defined apiVersion: apps/v1 kind: Deployment metadata: name: inflate-gpu spec: spec: tolerations: - key: "nvidia.com/gpu" operator: "Exists" effect: "NoSchedule"
Per una distribuzione generale per un altro team, le NodePool specifiche potrebbero includere NodeAffinity. Una distribuzione potrebbe quindi utilizzare il nodo corrispondente. SelectorTerms billing-team
# NodePool for regular EC2 instances apiVersion: karpenter.sh/v1 kind: NodePool metadata: name: generalcompute spec: template: metadata: labels: billing-team: my-team spec: nodeClassRef: group: karpenter.k8s.aws kind: EC2NodeClass name: default expireAfter: Never requirements: - key: node.kubernetes.io/instance-type operator: In values: - m5.large - m5.xlarge - m5.2xlarge - c5.large - c5.xlarge - c5a.large - c5a.xlarge - r5.large - r5.xlarge - key: kubernetes.io/os operator: In values: - linux - key: kubernetes.io/arch operator: In values: - amd64 - key: karpenter.sh/capacity-type operator: In values: - on-demand
Distribuzione tramite NodeAffinity:
# Deployment will have spec.affinity.nodeAffinity defined kind: Deployment metadata: name: workload-my-team spec: replicas: 200 spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: "billing-team" operator: "In" values: ["my-team"]
Usa i timer (TTL) per eliminare automaticamente i nodi dal cluster
È possibile utilizzare i timer sui nodi su cui è stato effettuato il provisioning per impostare quando eliminare i nodi privi di workload pod o che hanno raggiunto una data di scadenza. La scadenza dei nodi può essere utilizzata come metodo di aggiornamento, in modo che i nodi vengano ritirati e sostituiti con versioni aggiornate. Vedi Scadenza spec.template.spec
Evita di limitare eccessivamente i tipi di istanza di cui Karpenter può eseguire il provisioning, specialmente quando utilizzi Spot
Quando utilizza Spot, Karpenter utilizza la strategia di allocazione Price Capacity Optimized per il provisioning delle istanze EC2. Questa strategia indica a EC2 di effettuare il provisioning delle istanze dai pool più profondi in base al numero di istanze che stai avviando e che presentano il minor rischio di interruzione. EC2 Fleet richiede quindi le istanze Spot dal prezzo più basso di questi pool. Più tipi di istanze consenti a Karpenter di utilizzare, migliore sarà l'ottimizzazione del runtime dell'istanza spot da parte di EC2. Per impostazione predefinita, Karpenter utilizzerà tutti i tipi di istanza offerti da EC2 nella regione e nelle zone di disponibilità in cui è distribuito il cluster. Karpenter sceglie in modo intelligente dall'insieme di tutti i tipi di istanze in base ai pod in sospeso per assicurarsi che i pod siano pianificati su istanze di dimensioni e equipaggiate in modo appropriato. Ad esempio, se il pod non richiede una GPU, Karpenter non programmerà il pod su un tipo di istanza EC2 che supporti una GPU. Se non sei sicuro dei tipi di istanze da utilizzare, puoi eseguire Amazon ec2-instance-selector per generare un elenco di tipi di istanze che soddisfano i tuoi requisiti
$ ec2-instance-selector --memory 4 --vcpus 2 --cpu-architecture x86_64 -r ap-southeast-1 c5.large c5a.large c5ad.large c5d.large c6i.large t2.medium t3.medium t3a.medium
Non dovreste imporre troppi vincoli a Karpenter quando usate le istanze Spot, perché così facendo potreste influire sulla disponibilità delle vostre applicazioni. Supponiamo, ad esempio, che tutte le istanze di un particolare tipo vengano recuperate e non siano disponibili alternative adeguate per sostituirle. I tuoi pod rimarranno in sospeso fino al ripristino della capacità spot per i tipi di istanza configurati. Puoi ridurre il rischio di errori di capacità insufficiente distribuendo le istanze in diverse zone di disponibilità, poiché i pool spot sono diversi tra gli AZ. Detto questo, la best practice generale è consentire a Karpenter di utilizzare un set diversificato di tipi di istanze quando si utilizza Spot.
Pianificazione dei pod
Le seguenti best practice riguardano la distribuzione dei pod in un cluster utilizzando Karpenter per il provisioning dei nodi.
Segui le best practice di EKS per l'alta disponibilità
Se hai bisogno di eseguire applicazioni ad alta disponibilità, segui le raccomandazioni generali sulle best practice di EKS. Consulta la documentazione di Topology Spread
Utilizza i vincoli a più livelli per limitare le funzionalità di elaborazione disponibili dal tuo provider cloud
Il modello di vincoli a più livelli di Karpenter consente di creare un set complesso di vincoli di distribuzione NodePool e pod per ottenere le migliori corrispondenze possibili per la pianificazione dei pod. Alcuni esempi di vincoli che una specifica del pod può richiedere sono i seguenti:
-
Necessità di funzionare in zone di disponibilità in cui sono disponibili solo applicazioni particolari. Supponiamo, ad esempio, di avere un pod che deve comunicare con un'altra applicazione in esecuzione su un'istanza EC2 che risiede in una particolare zona di disponibilità. Se il tuo obiettivo è ridurre il traffico cross-AZ nel tuo VPC, potresti voler collocare contemporaneamente i pod nell'AZ in cui si trova l'istanza EC2. Questo tipo di targeting viene spesso realizzato utilizzando selettori di nodi. Per ulteriori informazioni sui selettori dei nodi
, consulta la documentazione di Kubernetes. -
Richiede determinati tipi di processori o altro hardware. Consulta la sezione
Acceleratori della documentazione di Karpenter per un esempio di specifiche del pod che richiede il funzionamento del pod su una GPU.
Crea allarmi di fatturazione per monitorare la tua spesa informatica
Quando configuri il cluster per la scalabilità automatica, dovresti creare allarmi di fatturazione per avvisarti quando la spesa ha superato una soglia e aggiungere limiti di risorse alla tua configurazione Karpenter. L'impostazione dei limiti delle risorse con Karpenter è simile all'impostazione della capacità massima di un gruppo di scalabilità automatica AWS, in quanto rappresenta la quantità massima di risorse di calcolo che possono essere istanziate da un Karpenter. NodePool
Nota
Non è possibile impostare un limite globale per l'intero cluster. I limiti si applicano a specifici NodePools.
Lo snippet seguente indica a Karpenter di fornire solo un massimo di 1000 core CPU e 1000 Gi di memoria. Karpenter interromperà l'aggiunta di capacità solo quando il limite sarà raggiunto o superato. Quando viene superato un limite, il controller Karpenter memory resource usage of 1001 exceeds limit of 1000 scriverà un messaggio simile nei log del controller. Se stai indirizzando i log del contenitore ai CloudWatch log, puoi creare un filtro metrico per cercare modelli o termini specifici nei tuoi log e quindi creare un CloudWatch allarme per avvisarti quando la soglia delle metriche configurate viene superata.
Per ulteriori informazioni sull'utilizzo dei limiti con Karpenter, consulta Impostazione dei limiti delle risorse nella documentazione di Karpenter.
spec: limits: cpu: 1000 memory: 1000Gi
Se non utilizzi limiti o vincoli i tipi di istanza di cui Karpenter può eseguire il provisioning, Karpenter continuerà ad aggiungere capacità di calcolo al cluster in base alle necessità. La configurazione di Karpenter in questo modo consente al cluster di scalare liberamente, ma può anche avere implicazioni significative in termini di costi. È per questo motivo che consigliamo di configurare gli allarmi di fatturazione. Gli allarmi di fatturazione ti consentono di essere avvisato e avvisato in modo proattivo quando gli addebiti stimati calcolati nei tuoi account superano una soglia definita. Per ulteriori informazioni, consulta Configurazione di un allarme di CloudWatch fatturazione Amazon per monitorare in modo proattivo gli addebiti stimati.
Potresti anche voler abilitare Cost Anomaly Detection, una funzionalità di AWS Cost Management che utilizza l'apprendimento automatico per monitorare continuamente i costi e l'utilizzo per rilevare spese insolite. Ulteriori informazioni sono disponibili nella guida introduttiva di AWS Cost Anomaly Detection. Se sei arrivato al punto di creare un budget in AWS Budgets, puoi anche configurare un'azione per notificarti quando viene superata una soglia specifica. Con le azioni relative al budget puoi inviare un'email, pubblicare un messaggio su un argomento SNS o inviare un messaggio a un chatbot come Slack. Per ulteriori informazioni, consulta Configurazione delle azioni di AWS Budgets.
Usa il karpenter. sh/do-not-disrupt annotazione per impedire a Karpenter di deprovisionare un nodo
Se si esegue un'applicazione critica su un Karpenter-provisioned nodo, ad esempio un processo batch di lunga durata o un'applicazione stateful, e il TTL del nodo è scaduto, l'applicazione verrà interrotta quando l'istanza viene terminata. Aggiungendo un'karpenter.sh/do-not-disruptannotazione al pod, si indica a Karpenter di conservare il nodo fino alla chiusura del Pod o alla rimozione dell'annotazione. karpenter.sh/do-not-disrupt Per ulteriori informazioni, consulta la documentazione di Distruption.
Se gli unici pod non daemonset rimasti su un nodo sono quelli associati ai job, Karpenter è in grado di indirizzare e terminare quei nodi purché lo stato del job sia riuscito o fallito.
Configura requests=limits per tutte le risorse non basate sulla CPU quando si utilizza il consolidamento
Consolidamento e pianificazione in generale del lavoro confrontando le richieste di risorse dei pod con la quantità di risorse allocabili su un nodo. I limiti delle risorse non vengono considerati. Ad esempio, i pod con un limite di memoria superiore alla richiesta di memoria possono superare la richiesta. Se più pod sullo stesso nodo si esauriscono contemporaneamente, ciò può causare la chiusura di alcuni pod a causa di una condizione di memoria insufficiente (OOM). Il consolidamento può aumentare la probabilità che ciò si verifichi, in quanto consente di impacchettare i pod nei nodi solo considerando le loro richieste.
LimitRanges Da utilizzare per configurare i valori predefiniti per le richieste e i limiti delle risorse
Poiché Kubernetes non imposta richieste o limiti predefiniti, il consumo di risorse da parte di un container dall'host, dalla CPU e dalla memoria sottostanti non è vincolato. Lo scheduler Kubernetes esamina il totale delle richieste di un pod (il valore più alto tra le richieste totali dai contenitori del pod o il totale delle risorse dai contenitori Init del pod) per determinare su quale nodo di lavoro pianificare il pod. Analogamente, Karpenter considera le richieste di un pod per determinare il tipo di istanza fornito. È possibile utilizzare un intervallo limite per applicare un valore predefinito ragionevole per un namespace, nel caso in cui le richieste di risorse non siano specificate da alcuni pod.
Vedi Configurazione delle richieste e dei limiti di memoria predefiniti per un namespace
Applica richieste di risorse accurate a tutti i carichi di lavoro
Karpenter è in grado di avviare i nodi che meglio si adattano ai carichi di lavoro quando le informazioni sui requisiti dei carichi di lavoro sono accurate. Ciò è particolarmente importante se si utilizza la funzionalità di consolidamento di Karpenter.
Vedi Configurazione e dimensionamento delle risorse Requests/Limits per tutti i carichi di lavoro
Consigli CoreDNS
Aggiorna la configurazione di CoreDNS per mantenere l'affidabilità
Quando si implementano i pod CoreDNS sui nodi gestiti da Karpenter, data la natura dinamica di Karpenter nei nodi rapidamente terminating/creating nuovi per allinearsi alla domanda, è consigliabile attenersi alle seguenti best practice:
Ciò garantirà che le richieste DNS non vengano indirizzate a un CoreDNS Pod che non è ancora pronto o è stato terminato.
Progetti Karpenter
Poiché Karpenter adotta un approccio incentrato sulle applicazioni per fornire capacità di calcolo al piano dati Kubernetes, ci sono scenari di carico di lavoro comuni che potresti chiederti come configurarli correttamente. Karpenter Blueprints