Creare e personalizzare un pool di nodi

Questa pagina mostra come creare un pool di nodi in GKE su AWS e come personalizzare la configurazione dei nodi utilizzando un file di configurazione.

Per creare un pool di nodi, devi fornire le seguenti risorse:

  • Il nome di un cluster AWS esistente in cui creare il pool di nodi
  • Un profilo istanza IAM per le VM del pool di nodi
  • Una subnet in cui verranno eseguite le VM del pool di nodi

Se vuoi l'accesso SSH ai tuoi nodi, puoi creare una coppia di chiavi EC2.

Questa pagina è rivolta agli amministratori IT e agli operatori che vogliono configurare, monitorare e gestire l'infrastruttura cloud. Per scoprire di più sui ruoli comuni e sulle attività di esempio a cui facciamo riferimento nei contenuti, consulta la pagina Ruoli e attività comuni degli utenti GKE. Google Cloud

Crea un pool di nodi standard

Una volta disponibili queste risorse, puoi creare un pool di nodi con questo comando:

gcloud container aws node-pools create NODE_POOL_NAME \
    --cluster CLUSTER_NAME \
    --instance-type INSTANCE_TYPE \
    --root-volume-size ROOT_VOLUME_SIZE \
    --iam-instance-profile NODEPOOL_PROFILE \
    --node-version NODE_VERSION \
    --min-nodes MIN_NODES \
    --max-nodes MAX_NODES \
    --max-pods-per-node MAX_PODS_PER_NODE \
    --location GOOGLE_CLOUD_LOCATION \
    --subnet-id NODEPOOL_SUBNET \
    --ssh-ec2-key-pair SSH_KEY_PAIR_NAME \
    --config-encryption-kms-key-arn CONFIG_KMS_KEY_ARN \
    --tags "Name=CLUSTER_NAME-NODE_POOL_NAME"

Sostituisci quanto segue:

  • NODE_POOL_NAME: un nome a tua scelta per il pool di nodi
  • CLUSTER_NAME: il nome del cluster a cui collegare il pool di nodil.
  • INSTANCE_TYPE: il tipo di istanza macchina AWS desiderato per questo node pool, ad esempio m5.large
  • ROOT_VOLUME_SIZE: le dimensioni desiderate per il volume di root di ogni nodo, in GB
  • NODEPOOL_PROFILE: il profilo dell'istanza IAM per le VM del pool di nodi. Per informazioni dettagliate su come aggiornare un profilo istanza IAM, vedi Aggiorna il profilo istanza AWS IAM.
  • NODE_VERSION: la versione di Kubernetes da installare su ogni nodo del pool di nodi (ad es. "1.32.4-gke.200")
  • MIN_NODES: il numero minimo di nodi che il pool di nodi può contenere
  • MAX_NODES: il numero massimo di nodi che il pool di nodi può contenere
  • MAX_PODS_PER_NODE: il numero massimo di pod che possono essere creati su un singolo nodo del pool
  • GOOGLE_CLOUD_LOCATION: il nome della località Google Cloud da cui verrà gestito questo pool di nodi
  • NODEPOOL_SUBNET: l'ID della subnet su cui verrà eseguito il pool di nodi.
    • Non deve esserci alcuna sovrapposizione tra gli intervalli IP di pod/servizi del cluster e la rete della subnet del pool di nodi. Per maggiori informazioni sulla selezione degli intervalli IP di pod e servizi per il cluster, consulta Selezionare gli intervalli CIDR per il cluster.
    • Se questa subnet si trova al di fuori del blocco CIDR principale del VPC, sono necessari alcuni passaggi aggiuntivi. Per ulteriori informazioni, vedi Gruppi di sicurezza.
  • SSH_KEY_PAIR_NAME: il nome della coppia di chiavi SSH AWS creata per l'accesso SSH (facoltativo)
  • CONFIG_KMS_KEY_ARN: l'Amazon Resource Name (ARN) della chiave AWS KMS che cripta i dati utente

Se presente, il parametro --tags applica il tag specificato a tutti i nodi nel tuo pool di nodil. Questo esempio tagga tutti i nodi nel pool con i nomi del cluster e del pool di nodi a cui appartiene il nodo.

Personalizzare la configurazione del sistema di nodi

Puoi personalizzare la configurazione dei nodi utilizzando vari metodi. Ad esempio, puoi specificare parametri come il limite di CPU del pod quando crei un pool di nodi.

Puoi utilizzare una configurazione del sistema dei nodi per specificare impostazioni personalizzate per l'agente dei nodi Kubernetes (kubelet) e configurazioni del kernel Linux di basso livello (sysctl) nei tuoi pool di nodi.

Configura l'agente kubelet

Per personalizzare la configurazione dei nodi utilizzando kubelet, utilizza Google Cloud CLI o Terraform.

gcloud

Puoi specificare impostazioni personalizzate per l'agente del nodo Kubernetes (kubelet) quando crei i node pool. Ad esempio, per configurare kubelet in modo che utilizzi la policy di gestione della CPU statica, esegui questo comando:

  gcloud container aws node-pools create POOL_NAME \
       --cluster CLUSTER_NAME \
       --location=LOCATION \
       --kubelet_config_cpu_manager_policy=static

Sostituisci quanto segue:

  • POOL_NAME: il nome del tuo pool di nodi.
  • CLUSTER_NAME: il nome del cluster a cui vuoi aggiungere un pool di nodi.
  • LOCATION: la zona di computing o la regione del cluster.

Per un elenco completo dei campi che puoi aggiungere al comando precedente, vedi Opzioni di configurazione di Kubelet.

Terraform

Puoi scoprire di più su Terraform in un ambiente AWS nella documentazione di riferimento pool di nodi Terraform.

  1. Imposta le variabili Terraform includendo il seguente blocco nel file variables.tf:

    variable "node_pool_kubelet_config_cpu_manager" {
      default     = "none"
    }
    
    variable "node_pool_kubelet_config_cpu_cfs_quota" {
      default     = "true"
    }
    
    variable "node_pool_kubelet_config_cpu_cfs_quota_period" {
      default     = "100ms"
    }
    
    variable "node_pool_kubelet_config_pod_pids_limit" {
      default     = -1
    }
    
  2. Aggiungi il seguente blocco alla configurazione Terraform:

    resource "google_container_aws_node_pool" "NODE_POOL_RESOURCE_NAME" {
     provider           = google
     cluster            = CLUSTER_NAME
     name               = POOL_NAME
     subnet_id          = SUBNET_ID
     version            = CLUSTER_VERSION
     location           = CLUSTER_LOCATION
    
     kubelet_config {
       cpu_manager_policy = var.node_pool_kubelet_config_cpu_manager
       cpu_cfs_quota = var.node_pool_kubelet_config_cpu_cfs_quota
       cpu_cfs_quota_period = var.node_pool_kubelet_config_cpu_cfs_quota_period
       pod_pids_limit = var.node_pool_kubelet_config_pod_pids_limit
     }
    }
    

    Sostituisci quanto segue:

    • NODE_POOL_RESOURCE_NAME: il nome della risorsa del pool di nodi nel modello Terraform.
    • CLUSTER_NAME: il nome del cluster esistente.
    • POOL_NAME: il nome del pool di nodi da personalizzare.
    • SUBNET_ID: la subnet assegnata al pool di nodi.
    • CLUSTER_VERSION: la versione per il control plane e i nodi del cluster GKE su AWS.
    • CLUSTER_LOCATION: la regione o zona di Compute Engine del cluster.

Configura l'utilità sysctl

Per personalizzare la configurazione del sistema di nodi utilizzando sysctl, effettua una richiesta POST al metodo awsClusters.awsNodePools.create. Questa richiesta POST crea un pool di nodi con le personalizzazioni specificate. Nell'esempio seguente, i parametri busy_poll e busy_read sono configurati su 5000 microsecondi ciascuno:

POST https://ENDPOINT/v1/projects/PROJECT_ID/locations/GOOGLE_CLOUD_LOCATION/CLUSTER_NAME/awsNodePools

{
    "name": NODE_POOL_NAME,
    "version": CLUSTER_VERSION,
    "config": {
        "linuxNodeConfig": {
            "sysctls": {
                "net.core.busy_poll": "5000",
                "net.core.busy_read": "5000",
            }
        }
    }
}

Sostituisci quanto segue:

  • ENDPOINT: il tuo Google Cloud endpoint di servizio.
  • PROJECT_ID: il tuo ID progetto Google Cloud .
  • GOOGLE_CLOUD_LOCATION: la Google Cloud posizione del cluster.
  • CLUSTER_NAME: il nome del cluster a cui vuoi aggiungere un pool di nodi.
  • NODE_POOL_NAME: il nome del tuo pool di nodi.
  • CLUSTER_VERSION: il numero di versione del cluster, ad esempio 1.31.0-gke.500.

Per un elenco completo delle coppie chiave-valore che puoi aggiungere alla richiesta JSON precedente, consulta Opzioni di configurazione di Sysctl.

Opzioni di configurazione per l'agente kubelet

La tabella seguente mostra le opzioni di kubelet che puoi modificare.

Impostazioni di configurazione di Kubelet Limitazioni Impostazione predefinita Descrizione
kubelet_config_cpu_manager_policy Il valore deve essere none o static "none" Questa impostazione controlla le norme di gestione della CPU di kubelet. Il valore predefinito è none, ovvero lo schema di affinità della CPU predefinito, che non fornisce affinità oltre a quella che lo scheduler del sistema operativo esegue automaticamente.

Se imposti questo valore su static, i pod nella classe QoS Guaranteed con richieste di CPU intere possono essere assegnati all'uso esclusivo delle CPU.
kubelet_config_cpu_cfs_quota Il valore deve essere true o false true Questa impostazione applica il limite della CPU del pod. Se imposti questo valore su false, i limiti della CPU per i pod vengono ignorati.

Ignorare i limiti di CPU potrebbe essere auspicabile in determinati scenari in cui i pod sono sensibili ai limiti di CPU. Il rischio di disattivare cpuCFSQuota è che un pod non autorizzato possa consumare più risorse CPU del previsto.
kubelet_config_cpu_cfs_quota_period Il valore deve essere una durata di tempo "100ms" Questa impostazione imposta il valore del periodo di quota CFS della CPU, cpu.cfs_period_us, che specifica il periodo di riallocazione dell'accesso di un cgroup alle risorse della CPU. Questa opzione ti consente di regolare il comportamento di limitazione della CPU.
kubelet_config_pod_pids_limit Il valore deve essere compreso tra 1024 e 4194304 -1 Questa impostazione definisce il numero massimo di ID processo (PID) che ogni pod può utilizzare. Se impostato sul valore predefinito, il limite di PID viene scalato automaticamente in base alle dimensioni della macchina sottostante.

Opzioni di configurazione per l'utilità sysctl

Per ottimizzare le prestazioni del sistema, puoi modificare i seguenti attributi:

Node pool di istanze spot

GKE su AWS supporta i pool di nodi istanze spot AWS come funzionalità di anteprima. I pool di nodi di istanze spot sono pool di istanze spot Amazon EC2 disponibili su AWS a un costo inferiore.

Le istanze spot possono consentire di risparmiare sui costi per applicazioni stateless, a tolleranza di errore e flessibili. Tuttavia, non sono adatti a workload inflessibili, stateful, tolleranti agli errori o strettamente accoppiati tra i nodi delle istanze. Le istanze spot possono essere interrotte da Amazon EC2 quando EC2 ha bisogno di capacità e sono quindi soggette a fluttuazioni nel mercato spot. Se i tuoi workload richiedono capacità garantita e non possono tollerare periodi occasionali di mancata disponibilità, scegli un pool di nodi standard anziché un pool di nodi di istanze spot.

La strategia di allocazione utilizzata in GKE su AWS si concentra sulla selezione di pool di istanze spot con la massima disponibilità di capacità, riducendo al minimo il rischio di interruzioni. Questo approccio è particolarmente vantaggioso per i carichi di lavoro con un costo di interruzione più elevato, come il rendering di immagini e contenuti multimediali o il deep learning. In particolare, è stata implementata la strategia di allocazione capacityOptimized, come descritto in Strategie di allocazione per le istanze spot.

Crea un pool di nodi Spot

Per creare un pool di nodi Spot Instance, esegui questo comando:

gcloud container aws node-pools create NODE_POOL_NAME \
    --cluster CLUSTER_NAME \
    --spot-instance-types INSTANCE_TYPE_LIST \
    --root-volume-size ROOT_VOLUME_SIZE \
    --iam-instance-profile NODEPOOL_PROFILE \
    --node-version NODE_VERSION \
    --min-nodes MIN_NODES \
    --max-nodes MAX_NODES \
    --max-pods-per-node MAX_PODS_PER_NODE \
    --location GOOGLE_CLOUD_LOCATION \
    --subnet-id NODEPOOL_SUBNET \
    --ssh-ec2-key-pair SSH_KEY_PAIR_NAME \
    --config-encryption-kms-key-arn CONFIG_KMS_KEY_ARN \
    --tags "Name=CLUSTER_NAME-NODE_POOL_NAME"

Sostituisci quanto segue:

  • NODE_POOL_NAME: il nome che vuoi assegnare a questo node pool.
  • CLUSTER_NAME: il nome del cluster a cui vuoi collegare questopool di nodil.
  • INSTANCE_TYPE_LIST: un elenco separato da virgole dei tipi di istanze AWS EC2. Il pool di nodi esegue il provisioning delle istanze spot con questi tipi di istanza. I tipi di istanza devono avere la stessa architettura della CPU, lo stesso numero di CPU e la stessa quantità di memoria. Ad esempio: "c6g.large,c6gd.large,c6gn.large,c7g.large,t4g.medium". Puoi utilizzare lo strumento Amazon EC2 Instance Selector per trovare tipi di istanza con configurazioni di CPU e memoria identiche.
  • ROOT_VOLUME_SIZE: le dimensioni desiderate per il volume di root di ogni nodo, in GB
  • NODEPOOL_PROFILE: il profilo istanza IAM per le VM del pool di nodi
  • NODE_VERSION: la versione di Kubernetes da installare su ogni nodo del pool di nodi (ad es. "1.32.4-gke.200")
  • MIN_NODES: il numero minimo di nodi che il pool di nodi può contenere
  • MAX_NODES: il numero massimo di nodi che il pool di nodi può contenere
  • MAX_PODS_PER_NODE: il numero massimo di pod che possono essere creati su un singolo nodo del pool
  • GOOGLE_CLOUD_LOCATION: il nome della località Google Cloud da cui verrà gestito questo pool di nodi
  • NODEPOOL_SUBNET: l'ID della subnet su cui verrà eseguito il pool di nodi.
    • Non deve esserci alcuna sovrapposizione tra gli intervalli IP di pod/servizi del cluster e la rete della subnet del pool di nodi. Per maggiori informazioni sulla selezione degli intervalli IP di pod e servizi per il cluster, consulta Selezionare gli intervalli CIDR per il cluster.
    • Se questa subnet si trova al di fuori del blocco CIDR principale del VPC, sono necessari alcuni passaggi aggiuntivi. Per ulteriori informazioni, vedi Gruppi di sicurezza.
  • SSH_KEY_PAIR_NAME: il nome della coppia di chiavi SSH AWS creata per l'accesso SSH (facoltativo)
  • CONFIG_KMS_KEY_ARN: l'Amazon Resource Name (ARN) della chiave AWS KMS che cripta i dati utente

La best practice consiste nell'elencare un numero di tipi di istanza nel campo INSTANCE_TYPE_LIST. Questa best practice è importante perché se un pool di nodi è configurato con un solo tipo di istanza e questo tipo di istanza non è disponibile in nessuna delle zone di disponibilità desiderate, il pool di nodi non può eseguire il provisioning di nuovi nodi. Ciò può influire sulla disponibilità delle tue applicazioni e causare interruzioni del servizio.

Tieni presente che il campo spot-instance-types si esclude a vicenda con il campo instance-type. Ciò significa che puoi fornire solo uno di questi campi e non entrambi.