Posiziona i pod GKE in zone specifiche


Questa pagina mostra come indicare a Google Kubernetes Engine (GKE) di eseguire i pod sui nodi in zone specifiche utilizzando la topologia zonale. Google Cloud Questo tipo di posizionamento è utile in situazioni come le seguenti:

  • I pod devono accedere ai dati archiviati in un disco permanente di Compute Engine zonale.
  • I pod devono essere eseguiti insieme ad altre risorse di zona, come le istanze Cloud SQL.

Puoi anche utilizzare il posizionamento zonale con il routing del traffico sensibile alla topologia per ridurre la latenza tra client e workload. Per informazioni dettagliate sul routing del traffico in base alla topologia, vedi Routing in base alla topologia.

L'utilizzo della topologia zonale per controllare il posizionamento dei pod è un meccanismo avanzato di Kubernetes che devi utilizzare solo se la tua situazione richiede che i pod vengano eseguiti in zone specifiche. Nella maggior parte degli ambienti di produzione, ti consigliamo di utilizzare risorse regionali, ovvero l'impostazione predefinita di GKE, quando possibile.

Metodi di posizionamento zonale

La topologia zonale è integrata in Kubernetes con l'etichetta del nodo topology.kubernetes.io/zone: ZONE. Per indicare a GKE di posizionare un pod in una zona specifica, utilizza uno dei seguenti metodi:

  • nodeAffinity: specifica una regola nodeAffinity nella specifica del pod per una o più zone Google Cloud . Questo metodo è più flessibile di un nodeSelector perché ti consente di posizionare i pod in più zone.
  • nodeSelector: specifica un nodeSelector nella specifica del pod per una singola zona. Google Cloud

  • Classi di calcolo: configura il pod in modo che utilizzi una classe di calcolo GKE. Questo approccio ti consente di definire un elenco prioritario di insiemi di Google Cloud zone. Consente di spostare dinamicamente il workload nel set di zone preferito quando i nodi sono disponibili in queste zone. Per ulteriori informazioni, consulta Informazioni sulle classi di calcolo personalizzate.

Considerazioni

Il posizionamento dei pod a livello di zona utilizzando la topologia a livello di zona presenta le seguenti considerazioni:

  • Il cluster deve trovarsi nella stessa regione Google Cloud delle zone richieste.
  • Nei cluster Standard, devi utilizzare il provisioning automatico dei nodi o creare node pool con nodi nelle zone richieste. I cluster Autopilot gestiscono automaticamente questo processo.
  • I cluster standard devono essere cluster regionali.

Prezzi

La topologia zonale è una funzionalità di pianificazione di Kubernetes e viene offerta senza costi aggiuntivi in GKE.

Per i dettagli sui prezzi, consulta Prezzi di GKE.

Prima di iniziare

Prima di iniziare, assicurati di aver eseguito le seguenti operazioni:

  • Attiva l'API Google Kubernetes Engine.
  • Attiva l'API Google Kubernetes Engine
  • Se vuoi utilizzare Google Cloud CLI per questa attività, installala e poi inizializzala. Se hai già installato gcloud CLI, scarica l'ultima versione eseguendo gcloud components update.
  • Assicurati di avere un cluster GKE esistente nella stessa regioneGoogle Cloud delle zone in cui vuoi posizionare i pod. Per creare un nuovo cluster, consulta Crea un cluster Autopilot.

Posizionare i pod in più zone utilizzando nodeAffinity

Kubernetes nodeAffinity fornisce un meccanismo di controllo della pianificazione flessibile che supporta più selettori di etichette e operatori logici. Utilizza nodeAffinity se vuoi consentire l'esecuzione dei pod in una delle zone di un insieme (ad esempio, in us-central1-a o us-central1-f).

  1. Salva il seguente manifest come multi-zone-affinity.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: nginx-multi-zone
      template:
        metadata:
          labels:
            app: nginx-multi-zone
        spec:
          containers:
          - name: nginx
            image: nginx:latest
            ports:
            - containerPort: 80
          affinity:
            nodeAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                nodeSelectorTerms:
                - matchExpressions:
                  - key: topology.kubernetes.io/zone
                    operator: In
                    values:
                    - us-central1-a
                    - us-central1-f
    

    Questo manifest crea un deployment con tre repliche e posiziona i pod in us-central1-a o us-central1-f in base alla disponibilità dei nodi.

    Assicurati che il cluster si trovi nella regione us-central1. Se il cluster si trova in un'altra regione, modifica le zone nel campo dei valori del manifest in zone valide nella regione del cluster.

  2. Crea il deployment:

    kubectl create -f multi-zone-affinity.yaml
    

    GKE crea i pod nei nodi in una delle zone specificate. Più pod possono essere eseguiti sullo stesso nodo. Se vuoi, puoi utilizzare l'anti-affinità dei pod per indicare a GKE di posizionare ogni pod su un nodo separato.

Posizionare i pod in un'unica zona utilizzando un nodeSelector

Per posizionare i pod in una singola zona, utilizza un nodeSelector nella specifica del pod. Un nodeSelector equivale a una regola di nodeAffinity con una sola zona specificata.requiredDuringSchedulingIgnoredDuringExecution

  1. Salva il seguente manifest come single-zone-selector.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-singlezone
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: nginx-singlezone
      template:
        metadata:
          labels:
            app: nginx-singlezone
        spec:
          nodeSelector:
            topology.kubernetes.io/zone: "us-central1-a"
          containers:
          - name: nginx
            image: nginx:latest
            ports:
            - containerPort: 80
    

    Questo manifest indica a GKE di inserire tutte le repliche nel deployment nella zona us-central1-a.

  2. Crea il deployment:

    kubectl create -f single-zone-selector.yaml
    

Dai la priorità al posizionamento dei pod nelle zone selezionate utilizzando una classe di computing

Le classi di calcolo GKE forniscono un meccanismo di controllo che ti consente di definire un elenco di priorità di configurazione dei nodi. Le preferenze a livello di zona ti consentono di definire le zone in cui vuoi che GKE posizioni i pod. La definizione delle preferenze di zona nelle classi di calcolo richiede GKE versione 1.33.1-gke.1545000 o successive.

L'esempio seguente crea una classe di calcolo che specifica un elenco di zone preferite per i pod.

Questi passaggi presuppongono che il cluster si trovi nella regione us-central1. Se il tuo cluster si trova in un'altra regione, modifica i valori delle zone nel manifest in modo che corrispondano a zone valide nella regione del cluster.

  1. Salva il seguente manifest come zones-custom-compute-class.yaml:

    apiVersion: cloud.google.com/v1
    kind: ComputeClass
    metadata:
      name: zones-custom-compute-class
    spec:
      priorities:
      - location:
        zones: [us-central1-a, us-central1-b]
      - location:
        zones: [us-central1-c]
      activeMigration:
        optimizeRulePriority: true
      nodePoolAutoCreation:
        enabled: true
      whenUnsatisfiable: ScaleUpAnyway
    

    Questo manifest della classe di calcolo modifica il comportamento di scalabilità come segue:

    1. GKE tenta di inserire i pod in us-central1-a o in us-central1-b.
    2. Se us-central1-a e us-central1-b non hanno capacità disponibile, GKE tenta di inserire i pod in us-central1-c.
    3. Se us-central1-c non ha capacità disponibile, il campo whenUnsatisfiable: ScaleUpAnyway fa in modo che GKE posizioni i pod in qualsiasi zona disponibile nella regione.
    4. Se una zona con priorità più alta nella classe di computing diventa disponibile in un secondo momento, il campo activeMigration.optimizeRulePriority: true fa in modo che GKE sposti i pod in quella zona da qualsiasi zona con priorità inferiore. Questa migrazione utilizza il budget per l'interruzione dei pod per garantire la disponibilità del servizio.
  2. Crea la classe di calcolo personalizzata:

    kubectl create -f zones-custom-compute-class.yaml
    

    GKE crea una classe di calcolo personalizzata a cui i tuoi carichi di lavoro possono fare riferimento.

  3. Salva il seguente manifest come custom-compute-class-deployment.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-zonal-preferences
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: nginx-zonal-preferences
      template:
        metadata:
          labels:
            app: nginx-zonal-preferences
        spec:
          nodeSelector:
            cloud.google.com/compute-class: "zones-custom-compute-class"
          containers:
          - name: nginx
            image: nginx:latest
            ports:
            - containerPort: 80
    
  4. Crea il deployment:

    kubectl create -f custom-compute-class-deployment.yaml
    

Verifica il posizionamento del pod

Per verificare il posizionamento dei pod, elenca i pod e controlla le etichette dei nodi. In un singolo nodo potrebbero essere eseguiti più pod, quindi potresti non vedere i pod distribuiti su più zone se hai utilizzato nodeAffinity.

  1. Elenca i tuoi pod:

    kubectl get pods -o wide
    

    L'output è un elenco di pod in esecuzione e del nodo GKE corrispondente.

  2. Descrivi i nodi:

    kubectl describe node NODE_NAME | grep "topology.kubernetes.io/zone"
    

    Sostituisci NODE_NAME con il nome del nodo.

    L'output è simile al seguente:

    topology.kubernetes.io/zone: us-central1-a
    

Se vuoi che GKE distribuisca i pod in modo uniforme su più zone per un failover migliorato su più domini di errore, utilizza topologySpreadConstraints.

Passaggi successivi