Application Web évolutive sur Kubernetes
Ce tutoriel peut entraîner des coûts. Utilisez l'Estimateur de coûts pour générer une estimation du coût en fonction de votre utilisation projetée.
Ce tutoriel explique comment exécuter une application Web localement dans un conteneur, puis la déployer dans un cluster Kubernetes créé avec Kubernetes Service. Une étape facultative consiste à créer une image de conteneur et à l'envoyer à un registre privé. Vous apprendrez également à lier un sous-domaine personnalisé, à surveiller la santé de votre environnement et à dimensionner l'application.
Les conteneurs constituent un moyen standard de conditionner des applications et toutes leurs dépendances. Ainsi, vous pouvez déplacer en toute transparence des applications entre divers environnements. A la différence des machines virtuelles, les conteneurs n'incluent pas le système d'exploitation. Seuls le code d'application, l'environnement d'exécution, les outils système, les bibliothèques et les paramètres sont inclus dans les conteneurs. Les conteneurs sont plus légers, plus portables et plus efficaces que les machines virtuelles.
Objectifs
- Déployer une application Web dans le cluster Kubernetes.
- Lier un sous-domaine personnalisé.
- Surveiller les journaux et la santé du cluster.
- Mettre à l'échelle des pods Kubernetes.
- Un développeur télécharge ou clone un exemple d'application web.
- Le cas échéant, il génère l'application pour produire une image de conteneur.
- L'image est éventuellement transférée dans un espace de nom dans IBM Cloud Container Registry.
- L'application est déployée dans un cluster Kubernetes.
- Les utilisateurs accèdent à l'application.
Avant de commencer
Pour ce tutoriel, vous devez disposer des éléments suivants :
- IBM Cloud CLI,
- du plug-in IBM Cloud Kubernetes Service (
kubernetes-service),
- du plug-in IBM Cloud Kubernetes Service (
- de
kubectlpour interagir avec des clusters Kubernetes, - de
Helm 3pour déployer des chartes.
Vous trouverez des instructions de téléchargement et d'installation de ces outils pour votre environnement d'exploitation dans le document Démarrer avec les tutoriels.
Pour éviter l'installation de ces outils, vous pouvez utiliser Cloud Shell à partir de la console IBM Cloud.
De plus :
- Vous aurez besoin d'une instance Secrets Manager. Avec Secrets Manager, vous pouvez créer, louer et gérer de manière centralisée les secrets qui sont utilisés dans les services IBM Cloud ou vos applications personnalisées. Les secrets sont stockés dans une instance Secrets Manager dédiée et vous pouvez utiliser des fonctions intégrées pour surveiller l'expiration, la planification ou la rotation manuelle de vos secrets. Dans ce tutoriel, vous utiliserez un opérateur Kubernetes pour récupérer un certificat TLS depuis Secrets Manager et l'injecter dans un secret Kubernetes. Vous pouvez utiliser une instance existante si vous en avez déjà une ou en créer une nouvelle en suivant les étapes décrites dans Création d'une instance de service Secrets Manager.
- Vous pouvez éventuellement configurer un espace de nom de registre. Elle n'est nécessaire que si vous générez votre propre image de conteneur personnalisée.
- Comprendre les bases de Kubernetes.
Activer la communication de service à service avec Secrets Manager
L'intégration de Secrets Manager à votre cluster IBM Cloud Kubernetes Service requiert une autorisation de communication de service à service. Suivez les étapes suivantes pour configurer l'autorisation. Pour plus d'informations, voir Integrations for Secrets Manager.
- Dans la console IBM Cloud, cliquez sur Gérer > Accès (IAM).
- Cliquez sur Autorisations.
- Cliquez sur Créer.
- Dans la liste des services source, sélectionnez Kubernetes Service.
- Sélectionnez l'option permettant de définir la portée de l'accès à Toutes les ressources.
- Dans la liste des services cibles, sélectionnez Secrets Manager
- Sélectionnez l'option permettant de définir la portée de l'accès à Toutes les ressources.
- Dans la section Accès au service, cochez l'option Gestionnaire.
- Cliquez sur Autoriser.
Création d'un cluster Kubernetes
Le IBM Cloud Kubernetes Service est une offre gérée permettant de créer son propre cluster Kubernetes d'hôtes de calcul pour déployer et gérer des apps conteneurisées sur IBM Cloud. Un cluster minimal doté d'une (1) zone, d'un noeud worker (1) et de la plus petite taille disponible (version) est suffisant pour ce tutoriel.
-
Ouvrez les clusters Kubernetes et cliquez sur Créer un cluster.
-
Créez un cluster sur l'infrastructure de votre choix.
-
Les étapes suivantes s'appliquent si vous sélectionnez VPC pour Kubernetes sur l'infrastructure VPC. Vous devez créer un VPC et un ou plusieurs sous-réseaux avant de créer le cluster Kubernetes. Pour plus de détails, consultez la documentation Creating VPC clusters.
- Cliquez sur Créer un VPC.
- Dans la section Emplacement, sélectionnez une Zone géographique et une Région, par exemple
EuropeetLondon. - Saisissez le nom de votre VPC, sélectionnez un groupe de ressources et ajoutez éventuellement des balises pour organiser vos ressources.
- Désélectionnez Autoriser SSH et Autoriser la commande ping à partir du Groupe de sécurité par défaut.
- Décochez la case Créer un sous-réseau dans chaque zone.
- Cliquez sur Créer.
- Sous Zones de noeud worker et sous-réseaux, désélectionnez les deux zones pour lesquelles le sous-réseau n'a pas été créé.
- Définissez Worker nodes per zone sur
1et cliquez sur Change flavor pour explorer et modifier la taille de noeud worker de votre choix. - Sous Ingress, activez la gestion des secrets Ingress et sélectionnez votre instance Secrets Manager existante.
- Entrez un nom de cluster et sélectionnez le même groupe de ressources que celui que vous avez utilisé pour le VPC.
- La journalisation ou la surveillance ne sont pas requises dans ce tutoriel, désactivez ces options et cliquez sur Créer.
- En attendant que le cluster devienne actif, connectez une passerelle publique au VPC. Accédez aux clouds privés virtuels.
- Cliquez sur le nom du VPC utilisé par le cluster et faites défiler jusqu'à la section des sous-réseaux.
- Cliquez sur le nom du sous-réseau créé précédemment et dans la section Public Gateway, cliquez sur Déconnecté pour changer l'état en Connecté.
-
Les étapes suivantes sont disponibles si vous sélectionnez Classic pour l'infrastructure Kubernetes on Classic. Pour plus d'informations, reportez-vous à la documentation Création d'un cluster classique standard.
- Dans la section Emplacement, sélectionnez une zone Géographie, Disponibilitémultizone et Métro, par exemple
EuropeetLondon. - Sous Zones de noeud worker et VLAN, désélectionnez toutes les zones sauf une.
- Définissez Worker nodes per zone sur
1et cliquez sur Change flavor pour explorer et modifier la taille de noeud worker de votre choix. - Sous Noeud final de service maître, sélectionnez Noeuds finaux privés et publics.
- Sous Ingress, activez la gestion des secrets Ingress et sélectionnez votre instance Secrets Manager existante.
- Entrez un nom de cluster et sélectionnez le groupe de ressources sous lequel créer ces ressources.
- La journalisation ou la surveillance ne sont pas requises dans ce tutoriel, désactivez ces options et cliquez sur Créer.
- Dans la section Emplacement, sélectionnez une zone Géographie, Disponibilitémultizone et Métro, par exemple
-
Cloner un exemple d'application
Dans cette section, vous allez cloner un repo GitHub avec un exemple simple d'application NodeJS Helm avec une page d'atterrissage et deux points de terminaison pour commencer. Vous pouvez toujours étendre l'exemple d'application en fonction de vos besoins.
- Sur un terminal, exécutez la commande suivante pour cloner le référentielGitHub:
git clone https://github.com/IBM-Cloud/kubernetes-node-app - Accédez au répertoire de l'application :
cd kubernetes-node-app
Cet exemple de code d'application contient tous les fichiers de configuration nécessaires au développement local et au déploiement sur Kubernetes.
Déploiement de l'application dans le cluster à l'aide de la charte Helm
Déploiement de l'application avec Helm 3
L'image du conteneur pour l'application a déjà été construite et poussée vers un registre public dans le IBM Cloud Container Registry Dans cette section, vous allez déployer l'exemple d'application à l'aide de Helm. Helm vous permet de gérer des applications Kubernetes par le biais de chartes Helm, qui permettent de définir, d'installer et de mettre à niveau des applications Kubernetes, aussi complexes soient-elles.
Note : Si vous voulez construire et pousser l'application dans votre propre registre de conteneurs, vous pouvez utiliser le CLI de Docker pour le faire. Le fichier Docker est fourni dans le référentiel et les images peuvent être poussées vers
le IBM Cloud Container Registry ou tout autre registre de conteneurs.
-
Définissez une variable d'environnement nommée
MYAPPet définissez le nom de l'application en remplaçant le caractère générique par vos initiales :export MYAPP=<your-initials>kubenodeapp -
Identifiez votre cluster :
ibmcloud ks cluster ls -
Initialiser la variable avec le nom du cluster :
export MYCLUSTER=<CLUSTER_NAME> -
Initialiser l'environnement
kubectlcli :ibmcloud ks cluster config --cluster $MYCLUSTERAssurez-vous que l'interface de ligne de commande est configurée pour la région et le groupe de ressources dans lesquels vous avez créé votre cluster à l'aide de
ibmcloud target -r <region> -g <resource_group>. Pour plus d'informations sur l'accès à votre cluster et la configuration de l'interface de ligne de commande pour exécuter des commandes kubectl, consultez la section Configuration de l'interface de ligne de commande -
Vous pouvez utiliser l'espace de nom Kubernetes
defaultou créer un espace de nom pour cette application.- Si vous souhaitez utiliser l'espace de noms
defaultKubernetes, exécutez la commande ci-dessous pour définir une variable d'environnement :export KUBERNETES_NAMESPACE=default - Si vous voulez créer un espace de nom Kubernetes, suivez les étapes présentées dans les sections Copie d'un secret d'extraction d'image existant et Stockage du secret d'extraction d'image sur le compte de service Kubernetes pour l'espace de nom sélectionné de la documentation du service Kubernetes. Une fois cette opération terminée, exécutez la commande suivante :
export KUBERNETES_NAMESPACE=<KUBERNETES_NAMESPACE_NAME>
- Si vous souhaitez utiliser l'espace de noms
-
Placez-vous dans le répertoire "chart" situé sous le répertoire de l'application modèle :
cd chart/kubernetesnodeapp -
Installez la charte Helm :
helm install $MYAPP --namespace $KUBERNETES_NAMESPACE . --set image.repository=icr.io/solution-tutorials/tutorial-scalable-webapp-kubernetes -
Revenez au répertoire de l'exemple d'application:
cd ../..
Affichage de l'application
- Répertoriez les services Kubernetes dans l'espace de nom :
kubectl get services -n $KUBERNETES_NAMESPACE - Liste les pods Kubernetes dans l'espace de noms :
kubectl get pods -n $KUBERNETES_NAMESPACE
Utilisation du domaine fourni par IBM pour votre cluster
Les clusters sont livrés avec un domaine IBM. Vous disposez donc d'une meilleure option pour exposer les applications avec une URL appropriée et sur des ports HTTP/S standard.
Utilisez Ingress pour configurer la connexion entrante du cluster au service.
-
Identifiez votre sous-domaine Ingress fourni par IBMet votre secret Ingress:
ibmcloud ks cluster get --cluster $MYCLUSTERpour rechercher
Ingress subdomain: mycluster.us-south.containers.appdomain.cloud Ingress secret: mycluster -
Définissez la variable d'environnement
INGRESS_SUBDOMAINpour conserver la valeur du sous-domaine Ingress:export INGRESS_SUBDOMAIN=<INGRESS_SUBDOMAIN> -
Définissez la variable d'environnement
INGRESS_SECRETpour conserver la valeur du secret Ingress:export INGRESS_SECRET=<INGRESS_SECRET> -
Dans le répertoire de l'application d'exemple, exécutez la commande bash ci-dessous pour créer un fichier Ingress
ingress-ibmsubdomain.yamlpointant vers le domaine IBM et prenant en charge les HTTP et HTTPS:./ingress.sh ibmsubdomain_httpsLe fichier est généré à partir d'un fichier modèle
ingress-ibmsubdomain-template.yamldans le dossier yaml-templates en remplaçant toutes les valeurs contenues dans les caractères génériques ($) par les valeurs appropriées des variables d'environnement. -
Déployez le fichier ingress :
kubectl apply -f ingress-ibmsubdomain.yaml -
Ouvrez votre application dans un navigateur à l'adresse
https://<myapp>.<ingress-subdomain>/ou exécutez la commande ci-dessous pour voir la sortie HTTP:curl -I https://$MYAPP.$INGRESS_SUBDOMAIN
Utilisation de votre sous-domaine personnalisé
Pour suivre les instructions de cette section, vous devez disposer de votre propre domaine personnalisé. Vous devez créer un enregistrement CNAME pointant vers le sous-domaine d'entrée IBM pour le cluster. Si votre domaine est example.com,
le CNAME sera <myapp>.<example.com> pointant vers <myapp>.<ingress-subdomain>.
Avec HTTP
- Créez une variable d'environnement pointant vers votre domaine personnalisé :
export CUSTOM_DOMAIN=<example.com> - Créez un fichier ingress
ingress-customdomain-http.yamldésignant votre domaine à partir du fichier modèleingress-customdomain-http-template.yaml:./ingress.sh customdomain_http - Déployez le fichier ingress :
kubectl apply -f ingress-customdomain-http.yaml - Accédez à votre application à l'adresse
http://<myapp>.<example.com>/.
Avec HTTPS
Si vous essayez d'accéder à votre application avec HTTPShttps://<myapp>.example.com/, vous obtiendrez probablement un avertissement de sécurité de votre navigateur Web vous indiquant que la connexion n'est pas privée.
A présent, importez votre certificat dans l'instance Secrets Manager que vous avez configurée précédemment dans votre cluster.
-
Accédez à l'instance de service Secrets Manager à partir de la Liste de ressources Sous Sécurité.
-
Cliquez sur Secrets dans la zone de navigation de gauche.
-
Cliquez sur Ajouter.
-
Vous pouvez sélectionner Certificat public, Certificat importé ou Certificat privé. Les étapes détaillées sont disponibles dans les rubriques de la documentation correspondantes: Commande de certificats publics SSL/TLS, Importation de certificats SSL/TLS ou Création de certificats privés SSL/TLS. Si vous avez choisi d'importer un certificat, veillez à télécharger le certificat, la clé privée et les fichiers de certificat intermédiaires.
-
Recherchez l'entrée correspondant au certificat importé ou commandé et cliquez dessus.
- Vérifiez que le nom de domaine correspond à votre $CUSTOM_DOMAIN. Si vous avez téléchargé un certificat générique, un astérisque est inclus dans le nom de domaine.
- Cliquez sur l'icône de copie à côté du CRN du certificat.
- Créez une variable d'environnement pointant sur la valeur que vous venez de copier:
export CERTIFICATE_CRN=<certificate CRN> -
Créez un secret Ingress dans votre cluster pour le certificat SSL/TLS:
ibmcloud ks ingress secret create --name nodeapp-tls-cert --cluster $MYCLUSTER --cert-crn $CERTIFICATE_CRN --namespace $KUBERNETES_NAMESPACE -
Créez une variable d'environnement pointant vers votre domaine personnalisé :
export CUSTOM_DOMAIN=<example.com> -
Créez un fichier Ingress
ingress-customdomain-https.yamlpointant vers votre domaine à partir du modèleingress-customdomain-https-template-sm.yaml:./ingress.sh customdomain_https_sm -
Déployez le fichier ingress :
kubectl apply -f ingress-customdomain-https.yaml -
Accédez à votre application à l'adresse
https://$MYAPP.$CUSTOM_DOMAIN/.
curl -I https://$MYAPP.$CUSTOM_DOMAIN
Surveillance de la santé de l'application
- Pour vérifier la santé de votre application, accédez aux clusters pour en afficher la liste et cliquez sur votre cluster.
- Cliquez sur le tableau de bord Kubernetes pour lancer le tableau de bord dans un nouvel onglet.
- Cliquez sur Pods à gauche, puis cliquez sur un nom de pod correspondant à $MYAPP
- Examinez l'utilisation de l'UC et de la mémoire.
- Notez le nom IP du noeud.
- Cliquez sur Afficher les journaux dans le menu d'action en haut à droite pour afficher la sortie standard et l'erreur de l'application.
- Sélectionnez Nœuds dans le volet de gauche, cliquez sur le nom d' un nœud mentionné précédemment et consultez les ressources d'allocation pour connaître l'état de santé de vos nœuds.
- Pour une exécution dans le conteneur, sélectionnez Exec into dans le menu Actions.
Mise à l'échelle de pods Kubernetes
Lorsque la charge de votre application augmente, vous pouvez augmenter manuellement le nombre de répliques de pod dans votre déploiement. Les répliques sont gérées par un ReplicaSet. Pour redimensionner l'application à deux répliques, exécutez la commande suivante :
kubectl scale deployment kubernetesnodeapp-deployment --replicas=2
Après un court instant, vous verrez deux pods pour votre application dans le tableau de bord Kubernetes (ou avec kubectl get pods ). Le contrôleur d'entrée dans le cluster se chargera de l'équilibrage de la charge entre les deux
répliques.
Avec Kubernetes, vous pouvez activer l'autoscaling horizontal des pods pour augmenter ou diminuer automatiquement le nombre d'instances de vos applications en fonction du CPU.
Pour créer un programme de mise à l'échelle automatique (autoscaler) et définir votre politique, exécutez la commande ci-dessous :
kubectl autoscale deployment kubernetesnodeapp-deployment --cpu-percent=5 --min=1 --max=5
Une fois que l'autoscaler est créé avec succès, vous devriez voir
horizontalpodautoscaler.autoscaling/<deployment-name> autoscaled.
Suppression de ressources
-
Supprimez le programme de mise à l'échelle automatique de pod horizontal:
kubectl delete horizontalpodautoscaler.autoscaling/kubernetesnodeapp-deployment -
Supprimez les ressources appliquées :
kubectl delete -f ingress-customdomain-https.yaml kubectl delete -f ingress-customdomain-http.yaml kubectl delete -f ingress-ibmsubdomain.yaml -
Supprimez les artefacts Kubernetes créés pour cette application :
helm uninstall $MYAPP --namespace $KUBERNETES_NAMESPACE -
Supprimez le secret Kubernetes :
kubectl -n $KUBERNETES_NAMESPACE delete secret kubernetesnodeapp-api-key -
Supprimer l'opérateur Secrets externes :
helm uninstall external-secrets -
Supprimez l'ID service :
ibmcloud iam service-id-delete $SERVICE_ID -
Supprimez le cluster.