Déployer un cluster Kubernetes à haute disponibilité sur Azure Stack Hub

Cet article vous montre comment créer un environnement de cluster Kubernetes hautement disponible, déployé sur plusieurs instances Azure Stack Hub, à des emplacements physiques différents.

Dans ce guide de déploiement de solution, vous allez apprendre à :

  • Télécharger et préparer le moteur AKS
  • Se connecter à la machine virtuelle d’assistance du moteur AKS
  • Déployer un cluster Kubernetes
  • Se connecter au cluster Kubernetes
  • Connecter Azure Pipelines au cluster Kubernetes
  • Configuration de l’analyse
  • Déployer l’application
  • Mettre à l’échelle l’application automatiquement
  • Configuration de Traffic Manager
  • Mettre à niveau Kubernetes
  • Mettre à l’échelle Kubernetes

Conseil

Piliers hybrides Microsoft Azure Stack Hub est une extension d’Azure. Azure Stack Hub offre à votre environnement local l’agilité et l’innovation du cloud computing grâce au seul cloud hybride qui vous permette de créer et de déployer des applications hybrides en tout lieu.

L’article Considérations sur la conception d’applications hybrides se penche sur les fondements de la qualité logicielle (sélection élective, scalabilité, disponibilité, résilience, facilité de gestion et sécurité) pour la conception, le déploiement et le fonctionnement des applications hybrides. Les considérations de conception vous aident à optimiser la conception d’application hybride, en réduisant les risques dans les environnements de production.

Prérequis

Avant de commencer à utiliser ce guide de déploiement, vous devez :

Télécharger et préparer le moteur AKS

Le moteur AKS est un fichier binaire qui peut être utilisé à partir de n’importe quel hôte Windows ou Linux pouvant atteindre les points de terminaison Azure Stack Hub Azure Resource Manager. Ce guide décrit le déploiement d’une nouvelle machine virtuelle Linux (ou Windows) sur Azure Stack Hub. Elle servira ultérieurement lors du déploiement des clusters Kubernetes par le moteur AKS.

Notes

Vous pouvez également utiliser une machine virtuelle Windows ou Linux existante pour déployer un cluster Kubernetes sur Azure Stack Hub à l’aide du moteur AKS.

Le processus pas à pas et les exigences pour le moteur AKS sont décrits ici :

Le moteur AKS est un outil d’assistance qui permet de déployer et d’utiliser des clusters Kubernetes (non managés) (dans Azure et Azure Stack Hub).

Les détails et les différences du moteur AKS sur Azure Stack Hub sont décrits ici :

L’exemple d’environnement utilise Terraform pour automatiser le déploiement de la machine virtuelle du moteur AKS. Vous trouverez les détails et le code dans le dépôt d’accompagnement GitHub.

Le résultat de cette étape est un nouveau groupe de ressources sur Azure Stack Hub qui contient la machine virtuelle d’assistance du moteur AKS et les ressources associées :

Ressources de machine virtuelle du moteur AKS dans Azure Stack Hub

Notes

Si vous devez déployer le moteur AKS dans un environnement hermétique déconnecté, passez en revue Instances Azure Stack Hub déconnectées pour en savoir plus.

À l’étape suivante, nous utiliserons la machine virtuelle du moteur AKS qui vient d’être déployée pour déployer un cluster Kubernetes.

Se connecter à la machine virtuelle d’assistance du moteur AKS

Tout d’abord, vous devez vous connecter à la machine virtuelle d’assistance du moteur AKS créée.

La machine virtuelle doit avoir une adresse IP publique et être accessible via SSH (port 22/TCP).

Page de vue d’ensemble de la machine virtuelle du moteur AKS

Conseil

Vous pouvez utiliser un outil de votre choix comme MobaXterm, puTTY ou PowerShell dans Windows 10 pour vous connecter à une machine virtuelle Linux à l’aide de SSH.

ssh <username>@<ipaddress>

Une fois connecté, exécutez la commande aks-engine. Consultez Versions du moteur AKS prises en charge pour en découvrir plus sur les versions du moteur AKS et de Kubernetes.

Exemple de ligne de commande aks-engine

Déployer un cluster Kubernetes

La machine virtuelle d’assistance du moteur AKS elle-même n’a pas encore créé de cluster Kubernetes sur notre instance Azure Stack Hub. La création du cluster est la première action à effectuer dans la machine virtuelle d’assistance du moteur AKS.

Le processus pas à pas est documenté ici :

Le résultat final de la commande aks-engine deploy et des préparatifs des étapes précédentes est un cluster Kubernetes complet déployé dans l’espace de locataire de la première instance Azure Stack Hub. Le cluster lui-même comprend des composants IaaS Azure, tels que des machines virtuelles, des équilibreurs de charge, des réseaux virtuels, des disques, etc.

Composants IaaS du cluster dans le portail Azure Stack Hub

  1. Azure Load Balancer (point de terminaison d’API K8s) 2) Nœuds de travail (pool d’agents) 3) Nœuds principaux

Le cluster étant opérationnel, nous nous y connecterons à l’étape suivante.

Se connecter au cluster Kubernetes

Vous pouvez maintenant vous connecter au cluster Kubernetes créé, soit via SSH (à l’aide de la clé SSH spécifiée dans le cadre du déploiement), soit via kubectl (recommandé). L’outil en ligne de commande Kubernetes kubectl est disponible pour Windows, Linux et macOS ici. Il est déjà préinstallé et configuré sur les nœuds master de notre cluster :

ssh azureuser@<k8s-master-lb-ip>

Exécuter kubectl sur le nœud master

Il n’est pas recommandé d’utiliser le nœud master comme serveurs de rebond (jumpbox) pour les tâches d’administration. La configuration kubectl est stockée dans .kube/config sur le ou les nœuds master ainsi que sur la machine virtuelle du moteur AKS. Vous pouvez copier la configuration sur une machine d’administration avec une connexion au cluster Kubernetes et utiliser la commande kubectl ici. Le fichier .kube/config est également utilisé ultérieurement pour configurer une connexion de service dans Azure Pipelines.

Important

Sécurisez ces fichiers, car ils contiennent les informations d’identification de votre cluster Kubernetes. Un attaquant ayant accès au fichier dispose d’informations suffisantes pour y accéder en tant qu’administrateur. Toutes les actions effectuées à l’aide du fichier .kube/config initial sont réalisées à l’aide d’un compte d’administrateur de cluster.

Vous pouvez maintenant essayer diverses commandes à l’aide de kubectl pour vérifier l’état de votre cluster. Voici des exemples de commandes :

kubectl get nodes
NAME                       STATUS   ROLE     VERSION
k8s-linuxpool-35064155-0   Ready    agent    v1.14.8
k8s-linuxpool-35064155-1   Ready    agent    v1.14.8
k8s-linuxpool-35064155-2   Ready    agent    v1.14.8
k8s-master-35064155-0      Ready    master   v1.14.8
kubectl cluster-info
Kubernetes master is running at https://aks.***
CoreDNS is running at https://aks.***/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
kubernetes-dashboard is running at https://aks.***/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy
Metrics-server is running at https://aks.***/api/v1/namespaces/kube-system/services/https:metrics-server:/proxy

Important

Kubernetes a son propre modèle de _contrôle d’accès en fonction du rôle (RBAC) , qui vous permet de créer des définitions précises de rôles et de liaisons de rôle. Il s’agit de la méthode préférable pour contrôler l’accès au cluster au lieu de distribuer les autorisations d’administrateur de cluster.

Connecter Azure Pipelines aux clusters Kubernetes

Pour connecter Azure Pipelines au cluster Kubernetes récemment déployé, nous avons besoin de son fichier kubeconfig (.kube/config), comme expliqué à l’étape précédente.

  • Connectez-vous à l’un des nœuds master de votre cluster Kubernetes.
  • Copiez le contenu du fichier .kube/config.
  • Accédez à Azure DevOps > Paramètres du projet > Connexions de service pour créer une connexion de service « Kubernetes » (utilisez KubeConfig comme méthode d’authentification)

Important

Azure Pipelines (ou ses agents de build) doit avoir accès à l’API Kubernetes. S’il existe une connexion Internet entre Azure Pipelines et le cluster Kubernetes Azure Stack Hub, vous devez déployer un agent de build Azure Pipelines auto-hébergé.

Vous pouvez déployer des agents auto-hébergés pour Azure Pipelines sur Azure Stack Hub ou sur une machine disposant d’une connectivité réseau à tous les points de terminaison de gestion requis. Consultez les informations détaillées ici :

La section Considérations sur le déploiement (CI/CD) du modèle contient un flux de décision qui vous aide à comprendre s’il faut utiliser des agents hébergés par Microsoft ou des agents auto-hébergés :

Diagramme montrant un flux de décision d’agents auto-hébergés.

Téléchargez un fichier Visio de tous les diagrammes de cet article.

Dans cet exemple de solution, la topologie comprend un agent de build auto-hébergé sur chaque instance Azure Stack Hub. L’agent peut accéder aux points de terminaison de gestion Azure Stack Hub et aux points de terminaison d’API du cluster Kubernetes.

Diagramme montrant le trafic sortant.

Téléchargez un fichier Visio de tous les diagrammes de cet article.

Cette conception respecte une exigence réglementaire courante, qui consiste à avoir uniquement des connexions sortantes à partir de la solution d’application.

Configuration de l’analyse

Vous pouvez utiliser Azure Monitor pour conteneurs afin de superviser les conteneurs dans la solution. Azure Monitor est alors pointé sur le cluster Kubernetes déployé par le moteur AKS sur Azure Stack Hub.

Il existe deux méthodes pour activer Azure Monitor sur votre cluster. Ces deux méthodes vous obligent à configurer un espace de travail Log Analytics dans Azure.

  • La méthode 1 utilise un graphique Helm
  • La méthode 2 intervient dans le cadre de la spécification du cluster du moteur AKS

Dans l’exemple de topologie, la « méthode 1 » est utilisée, ce qui permet d’automatiser le processus et facilite l’installation des mises à jour.

Pour l’étape suivante, vous avez besoin d’un espace de travail Azure Log Analytics (ID et clé), de Helm (version 3) et de kubectl sur votre machine.

Helm est un gestionnaire de package Kubernetes, disponible sous la forme d’un fichier binaire qui s’exécute sur macOS, Windows et Linux. Vous pouvez le télécharger sur helm.sh. Helm s’appuie sur le fichier de configuration Kubernetes utilisé pour la commande kubectl :

helm repo add incubator https://kubernetes-charts-incubator.storage.googleapis.com/
helm repo update

helm install incubator/azuremonitor-containers \
--set omsagent.secret.wsid=<your_workspace_id> \
--set omsagent.secret.key=<your_workspace_key> \
--set omsagent.env.clusterName=<my_prod_cluster> \
--generate-name

Cette commande installe l’agent Azure Monitor sur votre cluster Kubernetes :

kubectl get pods -n kube-system
NAME                                       READY   STATUS
omsagent-8qdm6                             1/1     Running
omsagent-r6ppm                             1/1     Running
omsagent-rs-76c45758f5-lmc4l               1/1     Running

L’agent OMS (Operations Management Suite) sur votre cluster Kubernetes envoie des données de supervision à votre espace de travail Azure Log Analytics (à l’aide du protocole HTTPS sortant). Vous pouvez désormais utiliser Azure Monitor pour obtenir des insights plus approfondis à propos de vos clusters Kubernetes sur Azure Stack Hub. Cette conception est un moyen puissant de démontrer la puissance de l’analytique qui peut être déployée automatiquement avec les clusters de votre application.

Clusters Azure Stack Hub dans Azure Monitor

Détails d’un cluster Azure Monitor

Important

Si Azure Monitor n’affiche aucune donnée Azure Stack Hub, vérifiez que vous avez attentivement suivi les instructions sur la façon d’ajouter la solution AzureMonitor-Containers à un espace de travail Azure Log Analytics.

Déployer l’application

Avant d’installer notre exemple d’application, nous devons suivre une autre étape, qui consiste à configurer le contrôleur d’entrée Nginx sur notre cluster Kubernetes. Le contrôleur d’entrée est utilisé comme équilibreur de charge de couche 7 pour router le trafic dans notre cluster en fonction de l’hôte, du chemin ou du protocole. L’entrée Nginx est disponible sous la forme d’un graphique Helm. Pour obtenir des instructions détaillées, reportez-vous au dépôt GitHub sur les graphiques Helm.

Notre exemple d’application est également empaqueté en tant que graphique Helm, comme l’agent de supervision Azure à l’étape précédente. Ainsi, il est facile de déployer l’application sur notre cluster Kubernetes. Vous trouverez les fichiers du graphique Helm dans le dépôt d’accompagnement GitHub.

L’exemple d’application est une application à trois niveaux, déployée sur un cluster Kubernetes sur chacune des deux instances Azure Stack Hub. L’application utilise une base de données MongoDB. Vous pouvez en découvrir plus sur la réplication des données sur plusieurs instances dans la section Considérations relatives au stockage et aux données du modèle.

Après avoir déployé le graphique Helm pour l’application, vous verrez les trois couches de votre application représentées en tant que déploiements et StatefulSets (pour la base de données) avec un seul pod :

kubectl get pod,deployment,statefulset
NAME                                         READY   STATUS
pod/ratings-api-569d7f7b54-mrv5d             1/1     Running
pod/ratings-mongodb-0                        1/1     Running
pod/ratings-web-85667bfb86-l6vxz             1/1     Running

NAME                                         READY
deployment.extensions/ratings-api            1/1
deployment.extensions/ratings-web            1/1

NAME                                         READY
statefulset.apps/ratings-mongodb             1/1

Du côté des services, vous trouverez le contrôleur d’entrée Nginx et son adresse IP publique :

kubectl get service
NAME                                         TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)
kubernetes                                   ClusterIP      10.0.0.1       <none>        443/TCP
nginx-ingress-1588931383-controller          LoadBalancer   10.0.114.180   *public-ip*   443:30667/TCP
nginx-ingress-1588931383-default-backend     ClusterIP      10.0.76.54     <none>        80/TCP
ratings-api                                  ClusterIP      10.0.46.69     <none>        80/TCP
ratings-web                                  ClusterIP      10.0.161.124   <none>        80/TCP

L’adresse IP externe est notre « point de terminaison d’application ». Il détermine la manière dont les utilisateurs se connectent pour ouvrir l’application et est également utilisé comme point de terminaison pour l’étape suivante Configuration de Traffic Manager.

Mettre à l’échelle l’application automatiquement

Vous pouvez éventuellement configurer l’autoscaler de pods élastique (HPA, Horizontal Pod Autoscaler) pour effectuer un scale-up ou un scale-down en fonction de certaines métriques telles que l’utilisation du processeur. La commande suivante crée un autoscaler de pods élastique qui gère 1 à 10 réplicas des pods contrôlés par le déploiement ratings-web. HPA augmente et diminue le nombre de réplicas (par le biais du déploiement) pour maintenir une utilisation moyenne du processeur sur tous les pods de 80 % :

kubectl autoscale deployment ratings-web --cpu-percent=80 --min=1 --max=10

Vous pouvez vérifier l’état actuel de l’autoscaler en exécutant cette commande :

kubectl get hpa
NAME          REFERENCE                      TARGET    MINPODS   MAXPODS   REPLICAS   AGE
ratings-web   Deployment/ratings-web/scale   0% / 80%  1         10        1          18s

Configuration de Traffic Manager

Pour répartir le trafic entre deux (ou plus) déploiements de l’application, nous allons utiliser Azure Traffic Manager. Azure Traffic Manager est un équilibreur de charge de trafic DNS dans Azure.

Notes

Traffic Manager utilise le système DNS pour diriger les requêtes des clients vers le point de terminaison de service le plus approprié, en fonction de la méthode de routage du trafic et de l’intégrité des points de terminaison.

Au lieu d’utiliser Azure Traffic Manager, vous pouvez également utiliser d’autres solutions d’équilibrage de charge mondiales hébergées en local. Dans l’exemple de scénario, nous allons utiliser Azure Traffic Manager pour répartir le trafic entre deux instances de notre application. Elles peuvent s’exécuter sur des instances Azure Stack Hub à des endroits identiques ou différents :

Diagramme montrant un gestionnaire de trafic local.

Téléchargez un fichier Visio de tous les diagrammes de cet article.

Dans Azure, nous configurons Traffic Manager pour qu’il pointe vers les deux instances différentes de notre application :

Profil de point de terminaison TM

Comme vous pouvez le voir, les deux points de terminaison pointent vers les deux instances de l’application déployée à partir de la section précédente.

À ce stade :

  • L’infrastructure Kubernetes a été créée, y compris un contrôleur d’entrée.
  • Les clusters ont été déployés sur deux instances Azure Stack Hub.
  • La supervision a été configurée.
  • Azure Traffic Manager équilibre le trafic entre les deux instances Azure Stack Hub.
  • Sur cette infrastructure, l’exemple d’application à trois niveaux a été déployé de manière automatisée à l’aide de graphiques Helm.

La solution doit maintenant être accessible aux utilisateurs.

Il existe également des considérations opérationnelles de post-déploiement, qui sont abordées dans les deux sections suivantes.

Mettre à niveau Kubernetes

Consultez les rubriques suivantes lors de la mise à niveau du cluster Kubernetes :

Les images de système d’exploitation de base plus récentes contiennent des mises à jour de noyau et de sécurité. Il incombe à l’opérateur de cluster de superviser la disponibilité des versions Kubernetes et des images de système d’exploitation plus récentes. L’opérateur doit planifier et exécuter ces mises à niveau à l’aide du moteur AKS. Les images de système d’exploitation de base doivent être téléchargées à partir de la Place de marché Azure Stack Hub par l’opérateur Azure Stack Hub.

Mettre à l’échelle Kubernetes

La mise à l’échelle est une autre opération de 2 jours qui peut être orchestrée à l’aide du moteur AKS.

La commande scale réutilise votre fichier de configuration de cluster (apimodel.json) dans le répertoire de sortie, en tant qu’entrée pour un nouveau déploiement Azure Resource Manager. Le moteur AKS exécute l’opération de mise à l’échelle sur un pool d’agents spécifique. Une fois l’opération de mise à l’échelle terminée, le moteur AKS met à jour la définition du cluster dans le même fichier apimodel.json. La définition du cluster reflète le nouveau nombre de nœuds et, par là même, la configuration de cluster actuelle mise à jour.

Étapes suivantes