Distribuzione di applicazioni native di Kubernetes nei cluster

Distribuire applicazioni containerizzate in IBM Cloud® Kubernetes Service utilizzando le tecniche di Kubernetes. Esegui aggiornamenti progressivi e ripristini senza tempi di inattività per i tuoi utenti.

Per saperne di più sulla creazione di file di configurazione, consultare la guida Configuration Best Practices.

Avvio del dashboard Kubernetes

Accedere alla dashboard Kubernetes per visualizzare le informazioni sul cluster e sui nodi worker tramite la console IBM Cloud o la CLI.

Prima di iniziare, verificare di avere il ruolo di accesso appropriato. Accedi al tuo account. Se applicabile, specifica il gruppo di risorse appropriato. Imposta il contesto per il tuo cluster.

Avvio della dashboard " Kubernetes " dalla console " IBM Cloud "

  1. Accedi alla console IBM Cloud.
  2. Dalla barra dei menu, seleziona l'account che vuoi utilizzare.
  3. Dal menu Icona menu, fare clic su Contenitori > Cluster.
  4. Nella pagina Cluster, fai clic sul cluster a cui vuoi accedere.
  5. Dalla pagina dei dettagli del cluster, fai clic sul pulsante Dashboard Kubernetes.

Avvio della dashboard di Kubernetes dalla CLI

Il metodo CLI consente l'automazione e l'integrazione CI/CD. Installare la CLI prima di iniziare.

  1. Ottieni le tue credenziali per “ Kubernetes ”.

    kubectl config view -o jsonpath='{.users[0].user.auth-provider.config.id-token}'
    
  2. Copiare il valore id-token dall'output.

  3. Avviare il proxy.

    kubectl proxy
    

    Output di esempio

    Starting to serve on 127.0.0.1:8001
    
  4. Accedi al dashboard.

    1. Accedi al seguente URL URL nel tuo browser:
        http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/
        ```
    2. Selezionare il metodo di autenticazione **Token** nella pagina di accesso.
    
    3. Incolla il valore **dell'id-token** nel campo " **Token** " e clicca su " **ACCEDI**".
    
    

Usare CTRL+C per uscire dal comando proxy. Eseguire nuovamente kubectl proxy per riavviare il dashboard.

Distribuzione di applicazioni con il dashboard Kubernetes

Distribuire le applicazioni attraverso la dashboard inserendo i dettagli di configurazione o caricando un file YAML.

Prima di iniziare, aprire la dashboard e verificare di avere un ruolo di accesso al servizio. Accedi al tuo account. Se applicabile, specifica il gruppo di risorse appropriato. Imposta il contesto per il tuo cluster.

Per distribuire l'applicazione

  1. Fai clic su + Crea.

  2. Scegliere un metodo di distribuzione:

    • Seleziona " Specifica i dettagli dell'app " e inserisci i dettagli.
    • Seleziona " Carica un file YAML o JSON " per caricare il file di configurazione della tua app.
  3. Fare clic su Deployments per verificare che l'applicazione sia stata distribuita correttamente.

Distribuzione di applicazioni con la CLI

Il metodo CLI fornisce un controllo preciso e consente l'automazione. Creerete file di configurazione che definiscono le risorse della vostra applicazione e che possono essere controllati in versione.

Prima di iniziare, installare la CLI e verificare di avere un ruolo di accesso al servizio. Accedi al tuo account. Se applicabile, specifica il gruppo di risorse appropriato. Imposta il contesto per il tuo cluster.

Per distribuire l'applicazione

  1. Creare un file di configurazione che includa le risorse di distribuzione, servizio e ingresso, come necessario. Ulteriori informazioni sulla protezione delle tue informazioni personali quando utilizzi le risorse Kubernetes.

  2. Applica il file di configurazione.

    kubectl apply -f config.yaml
    
  3. Verificare che sia possibile accedere all'applicazione.

Distribuzione delle applicazioni a specifici nodi di lavoro utilizzando le etichette

Quando distribuisci un'applicazione, i pod dell'applicazione vengono distribuiti indiscriminatamente ai vari nodi di lavoro nel tuo cluster. A volte, potresti voler limitare i nodi di lavoro su cui devono essere distribuiti i pod dell'applicazione. Ad esempio, potresti voler distribuire i pod dell'applicazione solo ai nodi di lavoro di un determinato pool di nodi di lavoro, in quanto tali nodi si trovano su macchine bare metal. Per indicare i nodi di lavoro a cui devono essere distribuiti tali pod dell'applicazione, aggiungi una regola di affinità alla tua distribuzione dell'applicazione.

Prima di iniziare

Per distribuire le app su nodi di lavoro specifici,

  1. Ottieni l'ID del pool di nodi di lavoro a cui desideri distribuire i pod dell'applicazione.

    ibmcloud ks worker-pool ls --cluster CLUSTER_NAME_OR_ID
    
  2. Elenca i nodi di lavoro che si trovano nel pool di nodi di lavoro e prendi nota di uno degli indirizzi IP privati.

    ibmcloud ks worker ls --cluster CLUSTER_NAME_OR_ID --worker-pool WORKER_POOL_NAME_OR_ID
    
  3. Descrivi il nodo di lavoro. Nell'output Labels, prendi nota dell'etichetta dell'ID pool di nodi di lavoro, ibm-cloud.kubernetes.io/worker-pool-id.

    I passi in questo argomento utilizzano un ID pool di nodi di lavoro per distribuire i pod dell'applicazione solo ai nodi di lavoro che si trovano all'interno di tale pool di nodi di lavoro. Per distribuire i pod dell'applicazione a specifici nodi di lavoro utilizzando un'etichetta diversa, prendi nota di questa etichetta. Ad esempio, per distribuire i pod dell'applicazione solo a nodi di lavoro su una specifica VLAN privata, utilizza l'etichetta privateVLAN=.

    kubectl describe node <worker_node_private_IP>
    

    Output di esempio

    NAME:               10.xxx.xx.xxx
    Roles:              <none>
    Labels:             arch=amd64
                        beta.kubernetes.io/arch=amd64
                        beta.kubernetes.io/instance-type=b3c.4x16.encrypted
                        beta.kubernetes.io/os=linux
                        failure-domain.beta.kubernetes.io/region=us-south
                        failure-domain.beta.kubernetes.io/zone=dal10
                        ibm-cloud.kubernetes.io/encrypted-docker-data=true
                        ibm-cloud.kubernetes.io/ha-worker=true
                        ibm-cloud.kubernetes.io/iaas-provider=softlayer
                        ibm-cloud.kubernetes.io/machine-type=b3c.4x16.encrypted
                        ibm-cloud.kubernetes.io/sgx-enabled=false
                        ibm-cloud.kubernetes.io/worker-pool-id=00a11aa1a11aa11a1111a1111aaa11aa-11a11a
                        ibm-cloud.kubernetes.io/worker-version=1.36_1534
                        kubernetes.io/hostname=10.xxx.xx.xxx
                        privateVLAN=1234567
                        publicVLAN=7654321
    Annotations:        node.alpha.kubernetes.io/ttl=0
    ...
    
  4. Aggiungi una regola di affinità per l'etichetta dell'ID del pool di worker alla distribuzione dell'app.

    YAML di esempio

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: with-node-affinity
    spec:
      template:
        spec:
          affinity:
            nodeAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                nodeSelectorTerms:
                - matchExpressions:
                  - key: ibm-cloud.kubernetes.io/worker-pool-id
                    operator: In
                    values:
                    - <worker_pool_ID>
    ...
    

    Nella sezione “affinity” dell’esempio YAML, ibm-cloud.kubernetes.io/worker-pool-id è l’ key e <worker_pool_ID> è l’ value.

  5. Applica il file di configurazione della distribuzione aggiornato.

    kubectl apply -f with-node-affinity.yaml
    
  6. Verifica che i pod dell'applicazione vengano distribuiti ai nodi di lavoro corretti.

    1. Elenca i pod nel tuo cluster.
        kubectl get pods -o wide
        ```
        Output di esempio
        ```sh {: screen}
        NAME                   READY     STATUS              RESTARTS   AGE       IP               NODE
        cf-py-d7b7d94db-vp8pq  1/1       Running             0          15d       172.30.xxx.xxx   10.176.48.78
        ```
    2. Nell'output, identifica un pod per la tua applicazione. Prendi nota dell'indirizzo IP privato **NODE** del nodo di lavoro in cui il pod è attivo.
    
        Nel precedente output di esempio, il pod dell'applicazione `cf-py-d7b7d94db-vp8pq` si trova su un nodo di lavoro con indirizzo IP `10.xxx.xx.xxx`.
    
    3. Elenca i nodi di lavoro nel pool di nodi di lavoro che hai indicato nella tua distribuzione dell'applicazione.
    
    ```sh {: pre}
        ibmcloud ks worker ls --cluster CLUSTER_NAME_OR_ID --worker-pool WORKER_POOL_NAME_OR_ID
        ```
        Output di esempio
    
        ```sh {: screen}
        ID                                                 Public IP       Private IP     Machine Type      State    Status  Zone    Version
        kube-dal10-crb20b637238bb471f8b4b8b881bbb4962-w7   169.xx.xxx.xxx  10.176.48.78   b3c.4x16          normal   Ready   dal10   1.8.6_1504
        kube-dal10-crb20b637238bb471f8b4b8b881bbb4962-w8   169.xx.xxx.xxx  10.176.48.83   b3c.4x16          normal   Ready   dal10   1.8.6_1504
        kube-dal12-crb20b637238bb471f8b4b8b881bbb4962-w9   169.xx.xxx.xxx  10.176.48.69   b3c.4x16          normal   Ready   dal12   1.8.6_1504
        ```
        Se hai creato una regola di affinità dell'applicazione basata su un altro fattore, utilizza tale valore. Ad esempio, per verificare che il pod dell'app sia stato distribuito su un nodo di lavoro in una VLAN specifica, visualizza la VLAN a cui appartiene il nodo di lavoro eseguendo il comando ` `ibmcloud ks worker get --cluster CLUSTER_NAME_OR_ID --worker WORKER_ID``.
        {: tip}
    
    4. Nell'output, verifica che il nodo di lavoro con l'indirizzo IP privato che hai identificato nel passo precedente venga distribuito in questo pool di nodi di lavoro.
    
    

Distribuzione di un'app su una macchina con GPU " NVIDIA "

Se hai un tipo di macchina GPU, puoi accelerare il tempo di elaborazione richiesto per i carichi di lavoro intensivi di calcolo come l'intelligenza artificiale, l'apprendimento automatico, l'inferenza e altro ancora.

Modifiche importanti ai driver a partire dalla versione Kubernetes 1.36: IBM Cloud Kubernetes Service non installa più i driver GPU NVIDIA sui nodi worker con GPU a partire dalla versione Kubernetes 1.36. Se si prevede di eseguire carichi di lavoro GPU su cluster della versione 1.36 o successiva, è necessario gestire l'installazione e il ciclo di vita dei driver GPU sui propri nodi worker. Per i cluster che eseguono la versione 1.35 o precedente, i driver per le GPU forniti da IBM continuano a essere disponibili. Per una guida alla migrazione, vedere Migrazione ai driver GPU NVIDIA autogestiti.

Nella seguente procedura, imparerai come distribuire i carichi di lavoro che richiedono la GPU. Tuttavia, è anche possibile distribuire applicazioni che non richiedono l'elaborazione dei carichi di lavoro sia sulla GPU che sulla CPU.

È anche possibile provare carichi di lavoro matematicamente intensivi come il TensorFlow framework di machine learning con questa Kubernetes demo.

Prerequisiti

Prima di iniziare

  • Crea un cluster o un pool di nodi di lavoro che utilizza un flavor GPU. Tieni presente che l'impostazione di una macchina bare metal può richiedere più di un giorno lavorativo per essere completata. Per un elenco dei flavor disponibili, consultare i seguenti link.

  • Assicurati di avere assegnato un ruolo di accesso al servizio che ti conceda il ruolo RBAC appropriato " Kubernetes ", in modo da poter utilizzare le risorse " Kubernetes " nel cluster.

Per Kubernetes versione 1.36 e successive: È necessario installare e gestire autonomamente lo stack di driver della GPU NVIDIA. IBM Cloud Kubernetes Service non fornisce più driver GPU preinstallati sui nodi worker. Seguire la guida all'installazione di NVIDIA GPU Operator per installare i componenti necessari:

  • NVIDIA driver del kernel
  • Componenti runtime del contenitore (ad esempio, nvidia-container-toolkit)
  • Kubernetes plugin per dispositivi

Finché il driver non viene installato, i pod che richiedono le GPU rimarranno nello stato Pending. Passeranno automaticamente a Running dopo che un driver compatibile sarà disponibile sul nodo.

Per Kubernetes versione 1.35 e precedenti: IBM- i driver GPU sono installati automaticamente sui nodi worker GPU. Non è richiesta l'installazione di alcun driver aggiuntivo.

Distribuzione di un carico di lavoro

  1. Crea un file YAML. In questo esempio, un file YAML di tipo " Job " gestisce carichi di lavoro di tipo batch creando un pod di breve durata che rimane attivo fino al completamento del comando e alla sua corretta chiusura.

    Per i carichi di lavoro su GPU, è necessario specificare il campo “ resources: limits: nvidia.com/gpu ” nel file YAML del job.

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: nvidia-devicequery
      labels:
        name: nvidia-devicequery
    spec:
      template:
        metadata:
          labels:
            name: nvidia-devicequery
        spec:
          containers:
          - name: nvidia-devicequery
            image: nvcr.io/nvidia/k8s/cuda-sample:devicequery-cuda11.7.1-ubuntu20.04
            imagePullPolicy: IfNotPresent
            resources:
              limits:
                nvidia.com/gpu: 2
          restartPolicy: Never
    
    Capire i componenti YAML
    Componente Descrizione
    Nomi etichetta e metadati Inserisci un nome e un'etichetta per il lavoro e utilizza lo stesso nome sia nei metadati del file che in quelli di spec template. Ad esempio, nvidia-devicequery.
    containers.image Fornisci l'immagine di cui il contenitore è un'istanza in esecuzione. In questo esempio, il valore è impostato per utilizzare l'immagine di query del dispositivo CUDA DockerHub:nvcr.io/nvidia/k8s/cuda-sample:devicequery-cuda11.7.1-ubuntu20.04.
    containers.imagePullPolicy Per scaricare una nuova immagine solo se questa non è attualmente presente sul nodo di lavoro, specificare IfNotPresent``.
    resources.limits

    Per le macchine GPU, devi specificare il limite della risorsa. L' Kubernetes Plug-in del dispositivo e imposta la richiesta di risorse predefinita in modo che corrisponda al limite.

    • È necessario specificare la chiave come nvidia.com/gpu.
    • Immettere il numero intero di GPU richieste, ad esempio 2. Nota che i pod del container non condividono GPU e che le GPU non possono essere eccessivamente impegnate. Ad esempio, se hai solo 1 macchina mg1c.16x128, allora hai solo 2 GPU in tale macchina e puoi specificare un massimo di 2.
  2. Applica il file YAML. Ad esempio:

    kubectl apply -f nvidia-devicequery.yaml
    
  3. Controlla il pod di lavoro filtrando i pod in base all’etichetta “ nvidia-devicequery ”. Verifica che lo STATO sia Completato.

    kubectl get pod -A -l 'name in (nvidia-devicequery)'
    

    Output di esempio

    NAME                  READY     STATUS      RESTARTS   AGE
    nvidia-devicequery-ppkd4      0/1       Completed   0          36s
    
  4. Descrivi il pod per visualizzare come il plugin del dispositivo GPU ha pianificato il pod.

    • Nei campi Limits e Requests, controlla che il limite della risorsa che hai specificato corrisponda alla richiesta che imposta automaticamente il plugin del dispositivo.
    • Negli eventi, verifica che il pod sia assegnato al tuo nodo di lavoro GPU.
        kubectl describe pod nvidia-devicequery-ppkd4
        ```
        Output di esempio
        ```sh {: screen}
        NAME:           nvidia-devicequery-ppkd4
        Namespace:      default
        ...
        Limits:
            nvidia.com/gpu:  1
        Requests:
            nvidia.com/gpu:  1
        ...
        Events:
        Type    Reason                 Age   From                     Message
        ----    ------                 ----  ----                     -------
        Normal  Scheduled              1m    default-scheduler        Successfully assigned nvidia-devicequery-ppkd4 to 10.xxx.xx.xxx
        ...
        ```
    
  5. Per verificare che il lavoro abbia utilizzato la GPU per calcolare il proprio carico di lavoro, puoi controllare i log.

    kubectl logs nvidia-devicequery-ppkd4
    

    Output di esempio

    /cuda-samples/sample Starting...
    CUDA Device Query (Runtime API) version (CUDART static linking)
    Detected 1 CUDA Capable device(s)
    Device 0: "Tesla P100-PCIE-16GB"
    CUDA Driver Version / Runtime Version          11.4 / 11.7
    CUDA Capability Major/Minor version number:    6.0
    Total amount of global memory:                 16281 MBytes (17071734784 bytes)
    (056) Multiprocessors, (064) CUDA Cores/MP:    3584 CUDA Cores
    GPU Max Clock rate:                            1329 MHz (1.33 GHz)
    Memory Clock rate:                             715 Mhz
    Memory Bus Width:                              4096-bit
    L2 Cache Size:                                 4194304 bytes
    Maximum Texture Dimension Size (x,y,z)         1D=(131072), 2D=(131072, 65536), 3D=(16384, 16384, 16384)
    Maximum Layered 1D Texture Size, (num) layers  1D=(32768), 2048 layers
    Maximum Layered 2D Texture Size, (num) layers  2D=(32768, 32768), 2048 layers
    Total amount of constant memory:               65536 bytes
    Total amount of shared memory per block:       49152 bytes
    Total shared memory per multiprocessor:        65536 bytes
    Total number of registers available per block: 65536
    Warp size:                                     32
    Maximum number of threads per multiprocessor:  2048
    Maximum number of threads per block:           1024
    Max dimension size of a thread block (x,y,z): (1024, 1024, 64)
    Max dimension size of a grid size    (x,y,z): (2147483647, 65535, 65535)
    Maximum memory pitch:                          2147483647 bytes
    Texture alignment:                             512 bytes
    Concurrent copy and kernel execution:          Yes with 2 copy engine(s)
    Run time limit on kernels:                     No
    Integrated GPU sharing Host Memory:            No
    Support host page-locked memory mapping:       Yes
    Alignment requirement for Surfaces:            Yes
    Device has ECC support:                        Enabled
    Device supports Unified Addressing (UVA):      Yes
    Device supports Managed Memory:                Yes
    Device supports Compute Preemption:            Yes
    Supports Cooperative Kernel Launch:            Yes
    Supports MultiDevice Co-op Kernel Launch:      Yes
    Device PCI Domain ID / Bus ID / location ID:   0 / 175 / 0
    Compute Mode:
    < Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >
    deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 11.4, CUDA Runtime Version = 11.7, NumDevs = 1
    Result = PASS
    

    In questo esempio, vedi che una GPU è stata utilizzata per eseguire il lavoro perché la GPU era stata pianificata nel nodo di lavoro. Se il limite è impostato su 2, vengono visualizzate solo 2 GPU.

Ora che hai distribuito un carico di lavoro GPU di test, potresti voler configurare il tuo cluster per eseguire uno strumento che si basa sull'elaborazione GPU, come IBM Maximo Visual Inspection.

Migrazione ai driver GPU autogestiti di NVIDIA

Per una guida dettagliata sulla migrazione dai driver GPU forniti da IBM ai driver autogestiti quando si esegue l'aggiornamento alla versione Kubernetes 1.36, vedere Migrazione ai driver GPU autogestiti NVIDIA per Kubernetes 1.36.