Aggiorna cluster

Dopo aver creato un cluster con bmctl, puoi modificare alcuni aspetti della configurazione del cluster eseguendo la sequenza di azioni seguente:

  1. Modifica i valori di alcuni campi nel file di configurazione del cluster, che per impostazione predefinita si trova qui: bmctl-workspace/CLUSTER-NAME/CLUSTER-NAME.yaml.

  2. Aggiorna il cluster eseguendo il comando bmctl update.

In questo modo, puoi, ad esempio, aggiungere o rimuovere nodi in un cluster oppure sostituire i nodi in un cluster. Questo documento descrive come eseguire questi e altri aggiornamenti a un cluster.

Tuttavia, è importante notare che molti aspetti della configurazione del cluster sono immutabili e non possono essere aggiornati dopo aver creato il cluster. Per un elenco completo dei campi modificabili e immutabili, consulta il riferimento sui campi di configurazione del cluster. Il riferimento del campo è una tabella ordinabile. Fai clic sulle intestazioni delle colonne per modificare l'ordine. Fai clic sul nome di un campo per visualizzarne la descrizione.

Aggiungi o rimuovi nodi in un cluster

Un pool di nodi è un gruppo di nodi all'interno di un cluster con la stessa configurazione. Tieni presente che un nodo appartiene sempre a un pool di nodi. Per aggiungere un nuovo nodo a un cluster, devi aggiungerlo a un determinato pool di nodi. La rimozione di un nodo da un pool di nodi equivale alla rimozione completa del nodo dal cluster.

Esistono tre tipi di pool di nodi in GDCV per Bare Metal: piano di controllo, bilanciatore del carico e pool di nodi worker.

Puoi aggiungere o rimuovere un nodo da un pool di nodi aggiungendo o rimuovendo l'indirizzo IP del nodo in una sezione specifica del file di configurazione del cluster. Il seguente elenco mostra la sezione da modificare per un determinato pool di nodi:

  • Pool di nodi worker: aggiungi o rimuovi l'indirizzo IP del nodo nella sezione spec.nodes della specifica NodePool.
  • Pool di nodi del piano di controllo: aggiungi o rimuovi l'indirizzo IP del nodo nella sezione spec.controlPlane.nodePoolSpec.nodes della specifica Cluster.
  • Pool di nodi del bilanciatore del carico: aggiungi o rimuovi l'indirizzo IP del nodo nella sezione spec.loadBalancer.nodePoolSpec.nodes della specifica Cluster.

Esempio: come rimuovere un nodo worker

Ecco un file di configurazione del cluster di esempio che mostra le specifiche di due nodi worker:

---
apiVersion: baremetal.cluster.gke.io/v1
kind: NodePool
metadata:
  name: nodepool1
  namespace: cluster-cluster1
spec:
  clusterName: cluster1
  nodes:
  - address: 172.18.0.5
  - address: 172.18.0.6

Per rimuovere un nodo:

  1. (Facoltativo) Se il nodo che stai rimuovendo esegue pod critici, imposta prima il nodo in modalità di manutenzione.

    Puoi monitorare il processo di svuotamento dei nodi per i nodi worker visualizzando i campi status.nodesDrained e status.nodesDraining nella risorsa NodePool.

  2. Modifica il file di configurazione del cluster per eliminare la voce dell'indirizzo IP per il nodo.

  3. Aggiorna il cluster:

    bmctl update cluster -c CLUSTER_NAME \
        --kubeconfig=ADMIN_KUBECONFIG
    

    Sostituisci quanto segue:

    • CLUSTER_NAME: il nome del cluster che vuoi aggiornare.
    • ADMIN_KUBECONFIG: il percorso del file kubeconfig del cluster di amministrazione.

    Dopo la corretta esecuzione del comando bmctl update, occorre un po' di tempo per completare i job machine-preflight e machine-init. Puoi visualizzare lo stato dei nodi e dei rispettivi pool di nodi eseguendo i comandi descritti nella sezione Verifica gli aggiornamenti di questo documento.

Forzare la rimozione di un nodo

Se il comando bmctl update non è in grado di rimuovere un nodo, potresti dover forzarne la rimozione dal cluster. Per maggiori dettagli, consulta Forzare la rimozione dei nodi rotti.

Sostituisci i nodi del piano di controllo ad alta disponibilità

Puoi sostituire i nodi del piano di controllo ad alta disponibilità nei cluster di amministrazione, utente, autonomi e ibridi.

Per sostituire un nodo in un cluster, segui questi passaggi:

  1. Rimuovi l'indirizzo IP del nodo dal file di configurazione del cluster.
  2. Aggiorna il cluster.
  3. Controlla lo stato dei nodi nel cluster.
  4. Aggiungi l'indirizzo IP di un nuovo nodo allo stesso file di configurazione del cluster.
  5. Aggiorna il cluster.

Il resto di questa sezione illustra un esempio.

Ecco un file di configurazione del cluster di esempio che mostra tre nodi del piano di controllo in un cluster utente:

---
apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
 name: user-cluster
 namespace: cluster-user-cluster
spec:
  controlPlane:
   nodePoolSpec:
     nodes:
     - address: 10.200.0.11
     - address: 10.200.0.12
     - address: 10.200.0.13

Per sostituire l'ultimo nodo elencato nella sezione spec.controlPlane.nodePoolSpec.nodes, segui questi passaggi:

  1. Rimuovi il nodo eliminando la relativa voce di indirizzo IP nel file di configurazione del cluster. Dopo aver apportato questa modifica, il file di configurazione del cluster dovrebbe avere un aspetto simile a questo:

    ---
    apiVersion: baremetal.cluster.gke.io/v1
    kind: Cluster
    metadata:
     name: user-cluster
     namespace: cluster-user-cluster
    spec:
      controlPlane:
       nodePoolSpec:
         nodes:
         - address: 10.200.0.11
         - address: 10.200.0.12
    
  2. Aggiorna il cluster eseguendo questo comando:

    bmctl update cluster -c CLUSTER_NAME \
        --kubeconfig=KUBECONFIG
    

    Apporta le seguenti modifiche:

    • Sostituisci CLUSTER_NAME con il nome del cluster che vuoi aggiornare.
    • Se il cluster è a gestione autonoma (ad esempio un cluster di amministrazione o autonomo), sostituisci KUBECONFIG con il percorso del file kubeconfig del cluster. Se il cluster è un cluster utente, come in questo esempio, sostituisci KUBECONFIG con il percorso del file kubeconfig del cluster admin.
  3. Dopo la corretta esecuzione del comando bmctl update, il completamento dei job machine-preflight e machine-init richiede un po' di tempo. Puoi visualizzare lo stato dei nodi e dei rispettivi pool di nodi eseguendo i comandi descritti nella sezione Verifica i tuoi aggiornamenti di questo documento. Quando il pool di nodi e i nodi sono in stato Pronto, puoi andare al passaggio successivo.

  4. Aggiungi un nuovo nodo del piano di controllo al pool di nodi aggiungendo l'indirizzo IP del nuovo nodo del piano di controllo alla sezione spec.controlPlane.nodePoolSpec.nodes del file di configurazione del cluster. Dopo aver apportato questa modifica, il file di configurazione del cluster dovrebbe avere il seguente aspetto:

    ---
    apiVersion: baremetal.cluster.gke.io/v1
    kind: Cluster
    metadata:
     name: user-cluster
     namespace: cluster-user-cluster
    spec:
      controlPlane:
       nodePoolSpec:
         nodes:
         - address: 10.200.0.11
         - address: 10.200.0.12
         - address: 10.200.0.14
    
  5. Aggiorna il cluster eseguendo questo comando:

    bmctl update cluster -c CLUSTER_NAME \
        --kubeconfig=KUBECONFIG
    

    Apporta le seguenti modifiche:

    • Sostituisci CLUSTER_NAME con il nome del cluster che vuoi aggiornare.
    • Se il cluster è a gestione autonoma (ad esempio un cluster di amministrazione o autonomo), sostituisci KUBECONFIG con il percorso del file kubeconfig del cluster. Se il cluster è un cluster utente, come in questo esempio, sostituisci KUBECONFIG con il percorso del file kubeconfig del cluster admin.

Verificare gli aggiornamenti

Puoi visualizzare lo stato dei nodi e dei rispettivi pool di nodi con il comando kubectl get.

Ad esempio, il comando seguente mostra lo stato dei pool di nodi nello spazio dei nomi del cluster cluster-my-cluster:

kubectl -n cluster-my-cluster get nodepools.baremetal.cluster.gke.io

Il sistema restituisce risultati simili ai seguenti:

NAME                    READY   RECONCILING   STALLED   UNDERMAINTENANCE   UNKNOWN
cluster-my-cluster      3       0             0         0                  0
cluster-my-cluster-lb   2       0             0         0                  0
np1                     3       0             0         0                  0

Reconciling=1 significa che il passaggio di riconciliazione è ancora in corso. Devi attendere che lo stato passi a Reconciling=0.

Puoi anche controllare lo stato dei nodi in un cluster eseguendo questo comando:

kubectl get nodes --kubeconfig=KUBECONFIG

Se hai bisogno di ulteriori informazioni su come diagnosticare i cluster, consulta Creare snapshot per la diagnostica dei cluster.

Funzionalità che puoi modificare con un aggiornamento

Oltre ad aggiungere, rimuovere o sostituire nodi, puoi utilizzare il comando bmctl update per modificare determinati valori di campi modificabili, risorse personalizzate (CR) e annotazioni nel file di configurazione del cluster.

Per aggiornare una risorsa cluster, modifica il file di configurazione del cluster e utilizza bmctl update per applicare le modifiche.

Le seguenti sezioni descrivono alcuni esempi comuni per l'aggiornamento di un cluster esistente mediante la modifica di un valore di campo, di una RP o di un'annotazione.

loadBalancer.addressPools

La sezione addressPools contiene i campi per specificare i pool di bilanciamento del carico per i bilanciatori del carico in bundle. Puoi aggiungere altri pool di indirizzi di bilanciamento del carico in qualsiasi momento, ma non puoi rimuovere o modificare alcun pool di indirizzi esistente.

addressPools:
- name: pool1
  addresses:
  - 192.168.1.0-192.168.1.4
  - 192.168.1.240/28
- name: pool2
  addresses:
  - 192.168.1.224/28

Impedisci l'eliminazione involontaria del cluster

Se aggiungi l'annotazione baremetal.cluster.gke.io/prevent-deletion: "true" al file di configurazione del cluster, non potrai eliminare il cluster. Ad esempio, l'esecuzione di kubectl delete cluster o bmctl reset cluster genera un errore.

apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
  name: ci-10c3c6f4d9c698e
  namespace: cluster-ci-10c3c6f4d9c698e
  annotations:
    baremetal.cluster.gke.io/prevent-deletion: "true"
spec:
  clusterNetwork:

bypassPreflightCheck

Il valore predefinito del campo bypassPreflightCheck è false. Se imposti questo campo su true nel file di configurazione del cluster, i controlli preflight interni vengono ignorati se applichi risorse ai cluster esistenti.

apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
  name: cluster1
  namespace: cluster-cluster1
  annotations:
    baremetal.cluster.gke.io/private-mode: "true"
spec:
  bypassPreflightCheck: true

loginUser

Puoi impostare il campo loginUser nella configurazione dell'accesso al nodo. Questo campo supporta la funzionalità sudo senza password per l'accesso alle macchine.

apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
  name: cluster1
  namespace: cluster-cluster1
  annotations:
    baremetal.cluster.gke.io/private-mode: "true"
spec:
  nodeAccess:
    loginUser: abm

NetworkGatewayGroup

La risorsa personalizzata NetworkGatewayGroup viene utilizzata per fornire indirizzi IP mobili per funzionalità di networking avanzate, come il gateway NAT in uscita o la funzionalità di bilanciamento del carico in bundle con BGP. Per utilizzare la risorsa personalizzata NetworkGatewayGroup e le relative funzionalità di networking, devi impostare clusterNetwork.advancedNetworking su true quando crei i cluster.

apiVersion: networking.gke.io/v1
kind: NetworkGatewayGroup
  name: default
  namespace: cluster-bm
spec:
  floatingIPs:
  - 10.0.1.100
  - 10.0.2.100

BGPLoadBalancer

Quando configuri i bilanciatori del carico in bundle con BGP, il bilanciamento del carico del piano dati utilizza, per impostazione predefinita, gli stessi peer esterni specificati per il peering del piano di controllo. In alternativa, puoi configurare separatamente il bilanciamento del carico del piano dati utilizzando la risorsa personalizzata BGPLoadBalancer (e la risorsa personalizzata BGPPeer). Per ulteriori informazioni, consulta Configurare i bilanciatori del carico in bundle con BGP.

apiVersion: networking.gke.io/v1
kind: BGPLoadBalancer
metadata:
  name: default
  namespace: cluster-bm
spec:
  peerSelector:
    cluster.baremetal.gke.io/default-peer: "true"

BGPPeer

Quando configuri i bilanciatori del carico in bundle con BGP, il bilanciamento del carico del piano dati utilizza, per impostazione predefinita, gli stessi peer esterni specificati per il peering del piano di controllo. In alternativa, puoi configurare separatamente il bilanciamento del carico del piano dati utilizzando la risorsa personalizzata BGPPeer (e la risorsa personalizzata BGPLoadBalancer). Per ulteriori informazioni, consulta Configurare i bilanciatori del carico in bundle con BGP.

apiVersion: networking.gke.io/v1
kind: BGPPeer
metadata:
  name: bgppeer1
  namespace: cluster-bm
  labels:
    cluster.baremetal.gke.io/default-peer: "true"
spec:
  localASN: 65001
  peerASN: 65002
  peerIP: 10.0.3.254
  sessions: 2

NetworkAttachmentDefinition

Puoi utilizzare il comando bmctl update per modificare NetworkAttachmentDefinition risorse personalizzate che corrispondono alla rete.

apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
  name: gke-network-1
  namespace: cluster-my-cluster
spec:
  config: '{
  "type": "ipvlan",
  "master": "enp2342",
  "mode": "l2",
  "ipam": {
    "type": "whereabouts",
    "range": "172.120.0.0/24"

Aumenta il raggio d'azione della rete di servizi

Per creare più servizi rispetto al limite iniziale, puoi ridurre la maschera CIDR del servizio IPv4 per aumentare la rete di servizi del tuo cluster. La riduzione della maschera (il valore dopo "/") determina un intervallo di rete più ampio.

apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
  name: cluster1
  namespace: cluster-cluster1
spec:
  ...
  clusterNetwork:
    services:
      cidrBlocks:
        - 172.26.0.0/14
  ...

Puoi solo aumentare l'intervallo del CIDR del servizio IPv4. L'intervallo di rete non può essere ridotto, il che significa che la maschera (il valore dopo "/") non può essere aumentata.

Configura le impostazioni pull dell'immagine kubelet

kubelet viene eseguito su ciascun nodo del cluster. kubelet è responsabile del monitoraggio dei container su un nodo e assicurarsi che siano integri. Se necessario, kubelet esegue query ed estrae le immagini da Container Registry.

Aggiornare manualmente le configurazioni kubelet e mantenerle sincronizzate su tutti i nodi del cluster può essere difficile. Inoltre, le modifiche manuali alla configurazione di kubelet sui nodi andranno perse quando esegui l'upgrade del cluster.

Per rendere gli aggiornamenti sincronizzati più semplici e permanenti, GKE su Bare Metal consente di specificare alcune impostazioni kubelet per ciascuno dei tuoi pool di nodi cluster: nodi del piano di controllo, del bilanciatore del carico e nodi worker. Le impostazioni si applicano a tutti i nodi in un determinato pool e vengono mantenute durante gli upgrade del cluster. I campi per queste impostazioni sono modificabili, quindi puoi aggiornarli in qualsiasi momento, non solo durante la creazione del cluster.

I seguenti campi supportati controllano le operazioni di pull di Container Registry per kubelet:

  • registryBurst (valore predefinito: 10)
  • registryPullQPS (valore predefinito: 5)
  • serializeImagePulls (valore predefinito: true)

Per saperne di più su ciascuno dei campi di configurazione kubelet, consulta la sezione Riferimento sui campi di configurazione del cluster.

Puoi specificare questi campi in kubeletConfig sezioni della specifica del cluster e nella specifica del pool di nodi per i seguenti pool di nodi:

L'esempio seguente mostra i campi aggiunti con i relativi valori predefiniti nel file di configurazione del cluster. Tieni presente che l'annotazione preview.baremetal.cluster.gke.io/custom-kubelet: "enable" è obbligatoria.

apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
  name: cluster1
  namespace: cluster-cluster1
  annotations:
    preview.baremetal.cluster.gke.io/custom-kubelet: "enable"
spec:
  ...
  controlPlane:
    nodePoolSpec:
      kubeletConfig:
        registryBurst: 10
        registryPullQPS: 5
        serializeImagePulls: true
  ...
  loadBalancer:
    nodePoolSpec:
      kubeletConfig:
        registryBurst: 10
        registryPullQPS: 5
        serializeImagePulls: true
  ...
apiVersion: baremetal.cluster.gke.io/v1
kind: NodePool
metadata:
  name: node-pool-new
  namespace: cluster-cluster1
spec:
  clusterName: cluster1
  ...
  kubeletConfig:
    registryBurst: 10
    registryPullQPS: 5
    serializeImagePulls: true

In ogni caso, l'impostazione si applica a tutti i nodi nel pool.

Come utilizzarlo

Ecco alcune considerazioni per ottimizzare i pull delle immagini:

  • Poiché le immagini vengono estratte in serie per impostazione predefinita, un pull di immagini che richiede molto tempo può ritardare tutti gli altri pull di immagini pianificati su un nodo. Il ritardo di pull delle immagini può bloccare il processo di upgrade (soprattutto quando è necessario eseguire il deployment di nuove immagini GKE su Bare Metal su un nodo). Se sono interessati i ritardi di pull delle immagini, puoi impostare serializeImagePulls su false per consentire il pull parallelo delle immagini.

  • Se riscontri errori di limitazione del pull dell'immagine, come pull QPS exceeded, ti consigliamo di aumentare registryPullQPS e registryBurst per aumentare la velocità effettiva di pull dell'immagine. Questi due campi regolano la frequenza di pull e le dimensioni della coda e possono aiutare a risolvere altri problemi relativi alla limitazione. I valori negativi non sono consentiti.

Utilizza bmctl update per applicare le modifiche

Dopo aver modificato il file di configurazione, aggiorna il cluster eseguendo questo comando bmctl update:

bmctl update cluster -c CLUSTER_NAME --kubeconfig=KUBECONFIG

Apporta le seguenti modifiche:

  • Sostituisci CLUSTER_NAME con il nome del cluster che vuoi aggiornare.
  • Se il cluster è a gestione autonoma (ad esempio un cluster di amministrazione o autonomo), sostituisci KUBECONFIG con il percorso del file kubeconfig del cluster. Se il cluster è un cluster utente, sostituisci KUBECONFIG con il percorso del file kubeconfig del cluster admin.