Déploiement d'applications natives Kubernetes dans des clusters
Vous pouvez utiliser les techniques Kubernetes dans IBM Cloud® Kubernetes Service pour déployer des applications dans des conteneurs et vous assurer que ces applications sont en cours d'exécution. Par exemple, vous pouvez effectuer des mises à jour et des rétromigrations en continu sans générer de temps d'indisponibilité pour vos utilisateurs.
Pour plus d'informations sur la création d'un fichier de configuration pour votre application, voir Meilleures pratiques de configuration.
Lancement du tableau de bord Kubernetes
Ouvrez un tableau de bord Kubernetes sur votre système local pour consulter des informations sur un cluster et les noeuds worker associés. Dans la console IBM Cloud, vous pouvez accéder au tableau de bord par simple clic sur un bouton. Avec l'interface de ligne de commande (CLI), vous pouvez accéder au tableau de bord ou utiliser les étapes d'un processus automatique, comme pour un pipeline CI/CD.
Votre cluster comporte tellement de ressources et d'utilisateurs que votre tableau de bord Kubernetes est un peu lent ? Votre administrateur de cluster peut ajuster le déploiement de kubernetes-dashboard
en exécutant la commande
kubectl -n kube-system scale deploy kubernetes-dashboard --replicas=3
.
Pour vérifier les journaux des pods d'application individuels, vous pouvez exécuter kubectl logs <pod name>
. N'utilisez pas le tableau de bord Kubernetes pour diffuser les journaux de vos pods, car cela pourrait entraîner
une interruption de l'accès au tableau de bord de Kubernetes.
Avant de commencer
- Vérifiez que vous disposez d'un rôle d'accès au service qui vous octroie le rôle RBAC Kubernetes approprié pour travailler avec des ressources Kubernetes.
- Pour lancer le tableau de bord Kubernetes à partir de la console, vous devez disposer d'un rôle d'accès à la plateforme. Si vous bénéficiez d'un rôle d'accès au service mais pas de rôle d'accès à la plateforme, lancez le tableau de bord Kubernetes dans l'interface de ligne de commande.
- Connectez-vous à votre compte. Le cas échéant, ciblez le groupe de ressources approprié. Définissez le contexte de votre cluster.
Vous pouvez utiliser le port par défaut ou définir votre propre port pour lancer le tableau de bord Kubernetes d'un cluster.
Lancement du tableau de bord Kubernetes à partir de la console IBM Cloud
- Connectez-vous à la consoleIBM Cloud.
- Dans la barre de menu, sélectionnez le compte que vous souhaitez utiliser.
- Dans le menu
, cliquez sur Conteneurs > Clusters.
- Sur la page Clusters, cliquez sur le cluster auquel vous souhaitez accéder.
- 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)
Avant de commencer, installez l'interface CLI.
-
Extrayez vos données d'identification pour Kubernetes.
kubectl config view -o jsonpath='{.users[0].user.auth-provider.config.id-token}'
-
Copiez la valeur id-token affichée dans la sortie.
-
Affectez le numéro de port par défaut au proxy.
kubectl proxy
Exemple de sortie
Starting to serve on 127.0.0.1:8001
-
Connectez-vous au tableau de bord.
-
Dans votre navigateur, accédez à l'URL suivante :
http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/
-
Sur la page de connexion, sélectionnez la méthode d'authentification par Jeton.
-
Collez ensuite la valeur id-token que vous aviez copiée dans la zone Jeton et cliquez sur Connexion.
-
Lorsque vous en avez terminé avec le tableau de bord Kubernetes, utilisez les touches CTRL+C
pour quitter la commande proxy
. Après avoir quitté, le tableau de bord Kubernetes n'est plus disponible. Exécutez la commande
proxy
pour redémarrer le tableau de bord Kubernetes.
Ensuite, vous pouvez exécuter un fichier de configuration à partir du tableau de bord..
Déploiement d'applications avec le tableau de bord Kubernetes
Lorsque vous déployez une application dans votre cluster à l'aide du tableau de bord Kubernetes, une ressource de déploiement crée, met à jour et gère automatiquement les pods dans votre cluster. Pour plus d'informations sur l'utilisation du tableau de bord, consultez la documentation de Kubernetes.
Votre cluster comporte tellement de ressources et d'utilisateurs que votre tableau de bord Kubernetes est un peu lent ? Votre administrateur de cluster peut ajuster le déploiement de kubernetes-dashboard
en exécutant la commande
kubectl -n kube-system scale deploy kubernetes-dashboard --replicas=3
.
Avant de commencer
- Installez les interfaces de ligne de commande requises.
- Connectez-vous à votre compte. Le cas échéant, ciblez le groupe de ressources approprié. Définissez le contexte de votre cluster.
- Vérifiez que vous disposez d'un rôle d'accès au service qui vous octroie le rôle RBAC Kubernetes approprié pour travailler avec des ressources Kubernetes.
- Pour lancer le tableau de bord Kubernetes à partir de la console, vous devez disposer d'un rôle d'accès à la plateforme. Si vous bénéficiez d'un rôle d'accès au service mais pas de rôle d'accès à la plateforme, lancez le tableau de bord Kubernetes dans l'interface de ligne de commande.
Pour déployer votre application :
-
Ouvrez le tableau de bord Kubernetes et cliquez sur + Créer.
-
Entrez les détails de votre application en choisissant l'une de ces deux méthodes :
- Sélectionnez Spécifier les détails de l'application et entrez les détails.
- Sélectionnez Télécharger un fichier YAML ou JSON pour télécharger votre fichier de configuration de l'application.
Besoin d'aide sur votre fichier de configuration ? Consultez cet exemple de fichier YAML. Dans cet exemple, un conteneur est déployé à partir d'une image ibmliberty dans la région du Sud des Etats-Unis (US-South). Découvrez comment sécuriser vos informations personnelles lorsque vous utilisez des ressources Kubernetes.
-
Vérifiez que vous avez déployé correctement votre application à l'aide de l'une des méthodes suivantes :
- Dans le tableau de bord Kubernetes, cliquez sur Déploiements. La liste des déploiements ayant abouti s'affiche.
- Si votre application est accessible au public, accédez à la page de présentation du cluster dans votre tableau de bord IBM Cloud® Kubernetes Service. Copiez le sous-domaine qui se trouve dans la section récapitulatif des clusters et collez-le dans un navigateur pour afficher votre application.
Déploiement d'applications à l'aide de l'interface de ligne de commande
Après avoir créé un cluster, vous pouvez y déployer une application à l'aide de l'interface de ligne de commande de Kubernetes.
Avant de commencer
- Installez les interfaces de ligne de commande requises.
- Connectez-vous à votre compte. Le cas échéant, ciblez le groupe de ressources approprié. Définissez le contexte de votre cluster.
- Vérifiez que vous disposez d'un rôle d'accès au service qui vous octroie le rôle RBAC Kubernetes approprié pour travailler avec des ressources Kubernetes dans l'espace de noms.
Pour déployer votre application :
-
Créer un fichier de configuration basé sur les meilleures pratiques de Kubernetes. En général, un fichier de configuration contient des informations de configuration détaillées pour chacune des ressources que vous créez dans Kubernetes. Votre script peut inclure une ou plusieurs des sections suivantes :
-
Déploiement: Définit la création de pods et d'ensembles de répliques. Un pod contient une application conteneurisée unique et les jeux de répliques contrôlent plusieurs instances de pods.
-
Service: Fournit un accès frontal aux pods en utilisant un nœud de travail ou une adresse IP publique d'équilibreur de charge, ou une route d'entrée publique.
-
Ingress: Spécifie un type d'équilibreur de charge qui fournit des routes pour accéder à votre application publiquement.
Découvrez comment sécuriser vos informations personnelles lorsque vous utilisez des ressources Kubernetes.
-
-
Exécutez le fichier de configuration dans un contexte de cluster.
kubectl apply -f config.yaml
-
Si vous avez rendu votre application disponible au public en utilisant un service Nodeport, LoadBalancer ou Ingress, vérifiez que vous pouvez accéder à l'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
- Connectez-vous à votre compte. Le cas échéant, ciblez le groupe de ressources approprié. Définissez le contexte de votre cluster.
- Facultatif : définissez un libellé pour le pool de noeuds worker sur lequel vous souhaitez exécuter l'application.
Pour déployer des applications sur des nœuds worker spécifiques,
-
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>
-
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>
-
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.32_1534 kubernetes.io/hostname=10.xxx.xx.xxx privateVLAN=1234567 publicVLAN=7654321 Annotations: node.alpha.kubernetes.io/ttl=0 ...
-
Ajoutez une règle d'affinité pour l'étiquette 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
estkey
et<worker_pool_ID>
est levalue
. -
Appliquez le fichier de configuration de déploiement mis à jour.
kubectl apply -f with-node-affinity.yaml
-
Vérifiez que les pods d'application se sont déployés sur les noeuds worker appropriés.
-
Affichez la liste des pods de votre cluster.
kubectl get pods -o wide
Exemple de sortie
NAME READY STATUS RESTARTS AGE IP NODE cf-py-d7b7d94db-vp8pq 1/1 Running 0 15d 172.30.xxx.xxx 10.176.48.78
-
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 est10.xxx.xx.xxx
. -
Répertoriez les noeuds worker figurant dans le pool de noeuds worker que vous avez désigné dans le déploiement de votre application.
ibmcloud ks worker ls --cluster <cluster_name_or_ID> --worker-pool <worker_pool_name_or_ID>
Exemple de sortie
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>
. -
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éployer 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.
Dans IBM Cloud Kubernetes Service, les pilotes GPU requis sont automatiquement installés pour vous.
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ématiquement intensives telles que l'infrastructure d'apprentissage automatique TensorFlow avec cette Kubernetes.
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.
Déploiement d'une charge de travail
-
Créez un fichier YAML. Dans cet exemple, un YAML
Job
gère les charges de travail de type batch en créant un pod éphémère qui s'exécute jusqu'à la fin de la commande et se termine avec succès.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-in de périphérique Kubernetes définit la demande de ressources par défaut pour qu'elle corresponde à la limite.
- Vous devez spécifier la clé comme
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 machinemg1c.16x128
, vous n'avez que 2 GPU dans cette machine. Vous ne pouvez donc en spécifier que2
maximum.
- Vous devez spécifier la clé comme
-
Appliquez le fichier YAML. Exemple :
kubectl apply -f nvidia-devicequery.yaml
-
Vérifiez le module de travail en filtrant vos modules par l'é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
-
Décrivez le pod pour voir comment le plug-in d'unité GPU a planifié le pod.
-
Dans les zones
Limits
etRequests
, 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
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 ...
-
-
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 pourriez vouloir configurer votre cluster pour exécuter un outil qui s'appuie sur le traitement GPU, tel que IBM Maximo Visual Inspection.