Déploiement d'applications natives Kubernetes dans des clusters

Déployer des applications conteneurisées sur IBM Cloud® Kubernetes Service en utilisant les techniques Kubernetes. Effectuez des mises à jour progressives et des retours en arrière sans interruption de service pour vos utilisateurs.

Pour en savoir plus sur la création de fichiers de configuration, consultez le guide des meilleures pratiques de configuration.

Lancement du tableau de bord Kubernetes

Accédez au tableau de bord Kubernetes pour visualiser les informations sur les clusters et les nœuds de travail via la console IBM Cloud ou le CLI.

Avant de commencer, vérifiez que vous disposez du rôle d'accès approprié. Connectez-vous à votre compte. Le cas échéant, ciblez le groupe de ressources approprié. Définissez le contexte de votre cluster.

Lancement du tableau de bord Kubernetes à partir de la console IBM Cloud

  1. Connectez-vous à la consoleIBM Cloud.
  2. Dans la barre de menu, sélectionnez le compte que vous souhaitez utiliser.
  3. Dans le menu Icône de menu, cliquez sur Conteneurs > Clusters.
  4. Sur la page Clusters, cliquez sur le cluster auquel vous souhaitez accéder.
  5. Sur la page des détails du cluster, cliquez sur le bouton Tableau de bord Kubernetes.

Lancement du tableau de bord Kubernetes à partir de l'interface de ligne de commande (CLI)

La méthode CLI permet l'automatisation et l'intégration CI/CD. Installez le CLI avant de commencer.

  1. Obtenez vos identifiants Kubernetes.

    kubectl config view -o jsonpath='{.users[0].user.auth-provider.config.id-token}'
    
  2. Copier la valeur de l 'id-token à partir de la sortie.

  3. Démarrer le proxy.

    kubectl proxy
    

    Exemple de sortie

    Starting to serve on 127.0.0.1:8001
    
  4. Connectez-vous au tableau de bord.

    1. Accédez à l' URL suivante dans votre navigateur :
        http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/
        ```
    2. Sélectionnez la méthode d'authentification **par jeton** sur la page de connexion.
    
    3. Collez la valeur **de l'id-token** dans le champ **Token,** puis cliquez sur **SIGN IN**.
    
    

Utilisez CTRL+C pour quitter la commande proxy. Exécutez à nouveau kubectl proxy pour redémarrer le tableau de bord.

Déploiement d'applications avec le tableau de bord Kubernetes

Déployez des applications via le tableau de bord en entrant des détails de configuration ou en téléchargeant un fichier YAML.

Avant de commencer, ouvrez le tableau de bord et vérifiez que vous avez un rôle d'accès au service. Connectez-vous à votre compte. Le cas échéant, ciblez le groupe de ressources approprié. Définissez le contexte de votre cluster.

Pour déployer votre application

  1. Cliquez sur + Créer.

  2. Choisissez une méthode de déploiement :

    • Sélectionnez Spécifier les détails de l'application et saisissez les informations requises.
    • Sélectionnez Télécharger un fichier YAML ou JSON pour télécharger le fichier de configuration de votre application.
  3. Cliquez sur Déploiements pour vérifier que votre application a bien été déployée.

Déploiement d'applications à l'aide de l'interface de ligne de commande

La méthode CLI offre un contrôle précis et permet l'automatisation. Vous créerez des fichiers de configuration qui définissent les ressources de votre application et qui peuvent être contrôlés par version.

Avant de commencer, installez l'interface de programmation et vérifiez que vous disposez d'un rôle d'accès au service. Connectez-vous à votre compte. Le cas échéant, ciblez le groupe de ressources approprié. Définissez le contexte de votre cluster.

Pour déployer votre application

  1. Créez un fichier de configuration qui inclut les ressources Deployment, Service et Ingress si nécessaire. Découvrez comment sécuriser vos informations personnelles lorsque vous utilisez des ressources Kubernetes.

  2. Appliquez le fichier de configuration.

    kubectl apply -f config.yaml
    
  3. Vérifiez que vous pouvez accéder à votre application.

Déploiement d'applications sur des noeuds worker spécifiques à l'aide de libellés

Lorsque vous déployez une application, les pods d'application déploient plusieurs noeuds worker dans votre cluster sans discernement. Parfois, vous voudrez peut-être limiter les nœuds worker à déployer sur les serveurs d'applications. Par exemple, vous pouvez opter pour le déploiement des pods d'application uniquement sur les noeuds worker d'un certain pool de noeuds worker car ces noeuds se trouvent sur des machines bare metal. Pour désigner les noeuds worker sur lesquels doivent se déployer les pods d'application, ajoutez une règle d'affinité dans le déploiement de votre application.

Avant de commencer

Pour déployer des applications sur des nœuds worker spécifiques,

  1. Récupérez l'ID du pool de noeuds worker sur lequel vous souhaitez déployer des pods d'application.

    ibmcloud ks worker-pool ls --cluster CLUSTER_NAME_OR_ID
    
  2. Répertoriez les noeuds worker figurant dans le pool de noeuds worker et notez l'une des adresses IP privées.

    ibmcloud ks worker ls --cluster CLUSTER_NAME_OR_ID --worker-pool WORKER_POOL_NAME_OR_ID
    
  3. Décrivez le noeud worker. Dans la sortie Labels, notez le libellé de l'ID du pool de noeuds worker, ibm-cloud.kubernetes.io/worker-pool-id.

    Les étapes indiquées dans cette rubrique utilisent un ID de pool de noeuds worker pour déployer les pods d'application uniquement sur des noeuds worker figurant dans ce pool. Pour déployer des pods d'application sur des noeuds worker en utilisant un autre libellé, notez le libellé à utiliser. Par exemple, pour déployer des pods d'application uniquement sur des noeuds worker sur un VLAN privé spécifique, utilisez le libellé privateVLAN=.

    kubectl describe node <worker_node_private_IP>
    

    Exemple de sortie

    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. Ajoutez une règle d'affinité pour le libellé d'ID du pool de travailleurs au déploiement de l'application.

    Exemple de fichier YAML

    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>
    ...
    

    Dans la section Affinité de l'exemple YAML, ibm-cloud.kubernetes.io/worker-pool-id est key et <worker_pool_ID> est le value.

  5. Appliquez le fichier de configuration de déploiement mis à jour.

    kubectl apply -f with-node-affinity.yaml
    
  6. Vérifiez que les pods d'application se sont déployés sur les noeuds worker appropriés.

    1. Affichez la liste des pods de votre cluster.
        kubectl get pods -o wide
        ```
        Exemple de sortie
        ```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. Dans la sortie, identifiez un pod pour votre application. Notez l'adresse IP privée du noeud (**NODE**) correspondant au noeud worker dans lequel figure le pod.
    
        Dans la sortie de l'exemple précédent, le pod d'application `cf-py-d7b7d94db-vp8pq` se trouve sur un noeud worker dont l'adresse IP est `10.xxx.xx.xxx`.
    
    3. Répertoriez les noeuds worker figurant dans le pool de noeuds worker que vous avez désigné dans le déploiement de votre application.
    
    ```sh {: pre}
        ibmcloud ks worker ls --cluster CLUSTER_NAME_OR_ID --worker-pool WORKER_POOL_NAME_OR_ID
        ```
        Exemple de sortie
    
        ```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
        ```
        Si vous avez créé une règle d'affinité pour l'application en fonction d'un autre facteur, récupérez cette valeur à la place. Par exemple, pour vérifier que le pod d'application a été déployé sur un nœud worker sur un VLAN, affichez le VLAN où se trouve le nœud worker en exécutant `ibmcloud ks worker get --cluster CLUSTER_NAME_OR_ID --worker WORKER_ID`.
        {: tip}
    
    4. Dans la sortie, vérifiez que le noeud worker avec l'adresse IP que vous avez identifiée à l'étape précédente est déployé dans ce pool de noeuds worker.
    
    

Déploiement d'une application sur une machine GPU NVIDIA

Si vous disposez d'un type de machine GPU, vous pouvez accélérer le temps de traitement requis pour les charges de travail de calcul intensif telles que l'IA, l'apprentissage automatique, l'inférence, etc.

Changements importants dans les pilotes à partir de la version Kubernetes 1.36: IBM Cloud Kubernetes Service n'installe plus les pilotes de GPU NVIDIA sur les nœuds de travail dotés de GPU à partir de la version Kubernetes 1.36. Si vous prévoyez d'exécuter des charges de travail GPU sur des clusters de la version 1.36 ou ultérieure, vous devez gérer l'installation et le cycle de vie des pilotes GPU sur vos propres nœuds de travail. Pour les clusters utilisant la version 1.35 ou une version antérieure, les pilotes GPU fournis par IBM continuent d'être disponibles. Pour des conseils sur la migration, voir Migration vers les pilotes GPU autogérés NVIDIA.

Dans les étapes suivantes, vous apprendrez à déployer des charges de travail nécessitant le processeur graphique (GPU). Cependant, vous pouvez également déployer des applications qui n'ont pas besoin de traiter leurs charges de travail à la fois sur le GPU et le CPU.

Vous pouvez également essayer des charges de travail mathématiques intensives telles que le cadre d'apprentissage TensorFlow automatique avec cette Kubernetes démonstration.

Prérequis

Avant de commencer

  • Créez un cluster ou un pool de noeuds worker qui utilise une version GPU. N'oubliez pas que la configuration d'une machine bare metal peut prendre plus d'un jour ouvrable. Pour obtenir la liste des versions disponibles, voir les liens suivants.

  • Vérifiez que vous disposez d'un rôle d'accès au service qui vous octroie le rôle RBAC Kubernetes approprié pour gérer des ressources Kubernetes dans le cluster.

Pour Kubernetes version 1.36 et suivantes: Vous devez installer et gérer vous-même la pile de pilotes GPU NVIDIA. IBM Cloud Kubernetes Service ne fournit plus de pilotes GPU préinstallés sur les nœuds de travail. Suivez le guide d'installation de NVIDIA GPU Operator pour installer les composants nécessaires :

  • NVIDIA pilote du noyau
  • Composants d'exécution des conteneurs (par exemple, nvidia-container-toolkit)
  • Kubernetes plugin d'appareil

Jusqu'à ce que le pilote soit installé, les pods demandant des GPU resteront dans l'état Pending. Ils passeront automatiquement à Running dès qu'un pilote compatible sera disponible sur le nœud.

Pour la version Kubernetes 1.35 et les versions antérieures: IBM-les pilotes GPU fournis sont automatiquement installés sur les nœuds de travail GPU. Aucune installation de pilote supplémentaire n'est nécessaire.

Déploiement d'une charge de travail

  1. Créez un fichier YAML. Dans cet exemple, un fichier YAML Job gère des charges de travail de type batch en créant un pod à durée de vie limitée qui s'exécute jusqu'à ce que la commande soit terminée et s'arrête correctement.

    Pour les charges de travail GPU, vous devez spécifier le champ resources: limits: nvidia.com/gpu dans le fichier YAML de la tâche.

    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
    
    Comprendre les composants YAML
    Composant Description
    Noms et libellé des métadonnées Entrez un nom et un libellé pour le travail et utilisez le même nom dans la zone metadata du fichier et de spec template. Par exemple, nvidia-devicequery.
    containers.image Fournissez l'image dont le conteneur est une instance d'exécution. Dans cet exemple, la valeur est définie pour utiliser l'image de requête de périphérique CUDA DockerHub:nvcr.io/nvidia/k8s/cuda-sample:devicequery-cuda11.7.1-ubuntu20.04.
    containers.imagePullPolicy Pour extraire une nouvelle image uniquement si l'image ne se trouve pas actuellement sur le noeud worker, indiquez IfNotPresent.
    resources.limits

    Pour les machines GPU, vous devez indiquer une limite de ressource. Le plug-inKubernetes configure la demande de ressources par défaut pour qu’elle corresponde à la limite.

    • Vous devez spécifier la clé sous la forme nvidia.com/gpu.
    • Saisissez le nombre entier de GPU que vous demandez, par exemple 2. Notez que les pods de conteneur ne partagent pas les GPU et que ces dernières ne peuvent pas être sursollicitées. Par exemple, si vous ne disposez que d'une machine mg1c.16x128, vous n'avez que 2 GPU dans cette machine. Vous ne pouvez donc en spécifier que 2 maximum.
  2. Appliquez le fichier YAML. Exemple :

    kubectl apply -f nvidia-devicequery.yaml
    
  3. Vérifiez le pod de travail en filtrant vos pods par étiquette nvidia-devicequery. Vérifiez que la valeur de la zone STATUS est Completed.

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

    Exemple de sortie

    NAME                  READY     STATUS      RESTARTS   AGE
    nvidia-devicequery-ppkd4      0/1       Completed   0          36s
    
  4. Décrivez le pod pour voir comment le plug-in d'unité GPU a planifié le pod.

    • Dans les zones Limits et Requests, observez que la limite de ressources que vous avez spécifiée correspond à la demande définie automatiquement par le plug-in d'unité.
    • Dans les événements, vérifiez que le pod est affecté au noeud worker de votre GPU.
        kubectl describe pod nvidia-devicequery-ppkd4
        ```
        Exemple de sortie
        ```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. Pour vérifier que votre travail a utilisé le processeur graphique (GPU) pour calculer sa charge de travail, vous pouvez consulter les journaux.

    kubectl logs nvidia-devicequery-ppkd4
    

    Exemple de sortie

    /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
    

    Dans cet exemple, vous voyez qu'un processeur graphique a été utilisé pour exécuter le travail car le processeur graphique a été planifié dans le noeud worker. Si la limite est définie sur 2, seuls 2 processeurs graphiques sont affichés.

Maintenant que vous avez déployé une charge de travail GPU de test, vous souhaiterez peut-être configurer votre cluster pour exécuter un outil qui s'appuie sur le traitement GPU, tel qu' IBM Maximo Visual Inspection.

Migration vers les pilotes de GPU autogérés NVIDIA

Pour des conseils détaillés sur la migration des pilotes GPU fournis par IBM vers des pilotes autogérés lors de la mise à niveau vers la version Kubernetes 1.36, voir Migrating to self-managed NVIDIA GPU drivers for Kubernetes 1.36.