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 accedere ai tuoi nodi tramite SSH, 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 Google Cloud contenuti, consulta Ruoli e attività utente comuni di GKE Enterprise.

Creare un pool di nodi standard

Una volta che queste risorse sono disponibili, 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 scelto per il pool di nodi
  • CLUSTER_NAME: il nome del cluster a cui collegare il pool di nodi
  • INSTANCE_TYPE: il tipo di istanza macchina AWS preferito per questo node pool, ad esempio m5.large
  • ROOT_VOLUME_SIZE: la dimensione desiderata per il volume radice di ogni nodo, in GB
  • NODEPOOL_PROFILE: il profilo istanza IAM per le VM del pool di nodi. Per informazioni dettagliate su come aggiornare un profilo istanza IAM, consulta Aggiornare il profilo istanza AWS IAM.
  • NODE_VERSION: la versione di Kubernetes da installare su ogni nodo del pool di nodi (ad es. "1.31.4-gke.500")
  • 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 Google Cloud posizione 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 ulteriori informazioni sulla selezione degli intervalli IP di pod e servizi per il cluster, consulta Selezionare gli intervalli CIDR per il cluster.
    • Se questa subnet non è all'interno del blocco CIDR principale del VPC, sono necessari alcuni passaggi aggiuntivi. Per ulteriori informazioni, consulta 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 KMS di AWS che cripta i dati utente

Se presente, il parametro --tags applica il tag specificato a tutti i nodi del pool di nodi. Questo esempio tagga tutti i nodi del 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 del nodo utilizzando vari metodi. Ad esempio, puoi specificare parametri come il limite della CPU del pod quando crei un pool di nodi.

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

Configura l'agente kubelet

Per personalizzare la configurazione del nodo utilizzando kubelet, utilizza Google Cloud CLI o Terraform.

gcloud

Puoi specificare impostazioni personalizzate per l'agente dei nodi Kubernetes (kubelet) quando crei i pool di nodi. Ad esempio, per configurare kubelet in modo che utilizzi il criterio di gestione della CPU statica, esegui il seguente 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 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, consulta Opzioni di configurazione di Kubelet.

Terraform

Puoi scoprire di più su Terraform in un ambiente AWS nel riferimento al 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 di 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 la zona Compute Engine del cluster.

Configurare l'utilità sysctl

Per personalizzare la configurazione del sistema di nodi utilizzando sysctl, invia una richiesta POST al metodo awsClusters.awsNodePools.create. Questa richiesta POST crea un pool di nodi con le personalizzazioni specificate. Nel seguente esempio, 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 del 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 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 precedente richiesta JSON, consulta Opzioni di configurazione di sysctl.

Opzioni di configurazione per l'agente kubelet

La tabella seguente mostra le opzioni kubelet che puoi modificare.

Impostazioni di configurazione del kubelet Limitazioni Impostazione predefinita Descrizione
kubelet_config_cpu_manager_policy Il valore deve essere none o static "none" Questa impostazione controlla il Criterio di gestione della CPU di kubelet. Il valore predefinito è none, che è lo schema di affinità della CPU predefinito e non fornisce alcuna affinità oltre a quella eseguita automaticamente dallo schedulatore del sistema operativo.

Se imposti questo valore su static, ai pod della classe QoS garantita con richieste di CPU intere viene assegnato l'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.

L'ignorare i limiti della CPU potrebbe essere auspicabile in determinati scenari in cui i pod sono sensibili ai limiti della CPU. Il rischio di disattivare cpuCFSQuota è che un pod malintenzionato possa consumare più risorse della CPU del previsto.
kubelet_config_cpu_cfs_quota_period Il valore deve essere una durata "100ms" Questa impostazione imposta il valore del periodo della quota CFS della CPU, cpu.cfs_period_us, che specifica la frequenza con cui l'accesso di un cgroup alle risorse della CPU deve essere riallocato. Questa opzione ti consente di ottimizzare il comportamento di throttling della CPU.
kubelet_config_pod_pids_limit Il valore deve essere compreso tra 1024 e 4194304 -1 Questa impostazione imposta 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 il rendimento del sistema, puoi modificare i seguenti attributi:

Node pool di istanze spot

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

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

La strategia di allocazione utilizzata in GKE su AWS si concentra sulla selezione di pool di istanze Spot con la disponibilità di capacità più elevata, 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. Nello specifico, è 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 istanze a spot, esegui il seguente 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 da assegnare a questo pool di nodi.
  • CLUSTER_NAME: il nome del cluster a cui vuoi collegare questo pool di nodi.
  • INSTANCE_TYPE_LIST: un elenco separato da virgole di tipi di istanze AWS EC2. Il pool di nodi esegue il provisioning di istanze spot con questi tipi di istanze. I tipi di istanze 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 Selettore di istanze Amazon EC2 per trovare tipi di istanze con configurazioni di CPU e memoria identiche.
  • ROOT_VOLUME_SIZE: la dimensione desiderata per il volume radice 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.31.4-gke.500")
  • 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 Google Cloud posizione 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 ulteriori informazioni sulla selezione degli intervalli IP di pod e servizi per il cluster, consulta Selezionare gli intervalli CIDR per il cluster.
    • Se questa subnet non è all'interno del blocco CIDR principale del VPC, sono necessari alcuni passaggi aggiuntivi. Per ulteriori informazioni, consulta 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 KMS di AWS che cripta i dati utente

La best practice consiste nell'elencare un numero di tipi di istanze nel INSTANCE_TYPE_LIST campo. 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 è mutuamente esclusivo rispetto al campo instance-type. Ciò significa che puoi fornire solo uno di questi campi e non entrambi.