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 "
- Accedi alla console IBM Cloud.
- Dalla barra dei menu, seleziona l'account che vuoi utilizzare.
- Dal menu
, fare clic su Contenitori > Cluster.
- Nella pagina Cluster, fai clic sul cluster a cui vuoi accedere.
- 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.
-
Ottieni le tue credenziali per “ Kubernetes ”.
kubectl config view -o jsonpath='{.users[0].user.auth-provider.config.id-token}' -
Copiare il valore id-token dall'output.
-
Avviare il proxy.
kubectl proxyOutput di esempio
Starting to serve on 127.0.0.1:8001 -
Accedi al dashboard.
- 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
-
Fai clic su + Crea.
-
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.
-
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
-
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.
-
Applica il file di configurazione.
kubectl apply -f config.yaml -
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
- Accedi al tuo account. Se applicabile, specifica il gruppo di risorse appropriato. Imposta il contesto per il tuo cluster.
- Facoltativo: imposta un'etichetta per il pool di nodi di lavoro su cui vuoi eseguire l'applicazione.
Per distribuire le app su nodi di lavoro specifici,
-
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 -
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 -
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 ... -
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’keye<worker_pool_ID>è l’value. -
Applica il file di configurazione della distribuzione aggiornato.
kubectl apply -f with-node-affinity.yaml -
Verifica che i pod dell'applicazione vengano distribuiti ai nodi di lavoro corretti.
- 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
-
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: NeverCapire 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.imageFornisci 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.imagePullPolicyPer scaricare una nuova immagine solo se questa non è attualmente presente sul nodo di lavoro, specificare IfNotPresent``.resources.limitsPer 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 macchinamg1c.16x128, allora hai solo 2 GPU in tale macchina e puoi specificare un massimo di2.
- È necessario specificare la chiave come
-
Applica il file YAML. Ad esempio:
kubectl apply -f nvidia-devicequery.yaml -
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 -
Descrivi il pod per visualizzare come il plugin del dispositivo GPU ha pianificato il pod.
- Nei campi
LimitseRequests, 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 ... ``` - Nei campi
-
Per verificare che il lavoro abbia utilizzato la GPU per calcolare il proprio carico di lavoro, puoi controllare i log.
kubectl logs nvidia-devicequery-ppkd4Output 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 = PASSIn 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.