Exercice : explorer les fonctionnalités d’un cluster Kubernetes

Effectué

Plusieurs options sont disponibles quand vous exécutez Kubernetes localement. Vous pouvez installer Kubernetes sur des machines physiques ou des machines virtuelles, ou utiliser une solution cloud comme Azure Kubernetes Service (AKS).

Votre objectif dans cet exercice est d’explorer une installation Kubernetes avec un cluster mononœud. Dans cet exercice, vous apprenez à configurer et à installer un environnement MicroK8s facile à configurer et à supprimer. Ensuite, vous déployez un service Kubernetes et effectuez un scale-out vers plusieurs instances pour héberger un site web.

Remarque

Cet exercice est facultatif et comprend des étapes qui montrent comment supprimer et désinstaller le logiciel et les ressources que vous allez utiliser dans l’exercice.

Gardez à l’esprit qu’il existe d’autres options, comme la prise en charge de MiniKube et de Kubernetes dans Docker, pour faire la même chose.

Qu’est-ce que MicroK8s ?

MicroK8s est une option pour déployer un cluster Kubernetes à un seul nœud en tant que package unique pour cibler des stations de travail et des appareils IoT (Internet of Things). Canonical, le créateur d'Ubuntu Linux, a développé à l'origine MicroK8s et en assure actuellement la maintenance.

Vous pouvez installer MicroK8s sur Linux, Windows et macOS. Les instructions d’installation sont cependant légèrement différentes pour chaque système d’exploitation. Choisissez l’option qui correspond le mieux à votre environnement.

Installer MicroK8s sur Linux

L’installation de MicroK8s sur Linux est l’option d’installation qui comporte le moins d’étapes à suivre. Passez à une fenêtre de terminal et exécutez les commandes des instructions suivantes :

  1. Installez l’application Snap MicroK8s. La durée de cette étape varie en fonction de la rapidité de votre connexion Internet et de votre poste de travail.

    sudo snap install microk8s --classic
    

    Si l’installation est réussie, le message suivant s’affiche.

    2020-03-16T12:50:59+02:00 INFO Waiting for restart...
    microk8s v1.17.3 from Canonical✓ installed
    

Vous êtes maintenant prêts à installer des extensions (ou add-ons) sur le cluster.

Installer MicroK8s sur Windows

Pour exécuter MicroK8s sur Windows, utilisez Multipass. Multipass est un gestionnaire de machines virtuelles léger pour Linux, Windows et macOS.

  1. Téléchargez et installez la dernière version de Multipass pour Windows à partir de GitHub.

  2. Dans une console de commandes, exécutez la commande de lancement de Multipass pour configurer et exécuter l’image microk8s-vm. La durée de cette étape varie en fonction de la rapidité de votre connexion Internet et de votre poste de travail.

    multipass launch --name microk8s-vm --memory 4G --disk 40G
    
  3. Une fois que vous avez reçu la confirmation du lancement pour microk8s-vm, exécutez la commande multipass shell microk8s-vm pour accéder à l’instance de machine virtuelle.

    multipass shell microk8s-vm
    

    Une fois que le multipass fonctionne, vous pouvez accéder à la machine virtuelle Ubuntu pour héberger votre cluster et installer MicroK8s.

  4. Installez l’application Snap MicroK8s. La durée de cette étape varie en fonction de la rapidité de votre connexion Internet et de votre poste de travail.

    sudo snap install microk8s --classic
    

    Si l’installation est réussie, le message suivant s’affiche :

    2020-03-16T12:50:59+02:00 INFO Waiting for restart...
    microk8s v1.17.3 from Canonical✓ installed
    

Vous êtes maintenant prêts à installer des extensions (ou add-ons) sur le cluster.

Installer MicroK8s sur macOS

Pour exécuter MicroK8s sur macOS, utilisez Multipass. Multipass est un gestionnaire de machines virtuelles léger pour Linux, Windows et macOS.

  1. Vous avez le choix entre deux options pour installer Multipass sur macOS. Téléchargez et installez la dernière version de Multipass pour macOS à partir de GitHub ou, pour installer Multipass avec la commande brew cask install multipass, utilisez Homebrew.

    brew install --cask multipass
    
  2. Dans une console de commandes, exécutez la commande de lancement de Multipass pour configurer et exécuter l’image microk8s-vm. La durée de cette étape varie en fonction de la rapidité de votre connexion Internet et de votre poste de travail.

    multipass launch --name microk8s-vm --memory 4G --disk 40G
    
  3. Une fois que vous avez reçu la confirmation du lancement pour microk8s-vm, exécutez la commande multipass shell microk8s-vm pour accéder à l’instance de machine virtuelle.

    multipass shell microk8s-vm
    

    À ce stade, vous pouvez accéder à la machine virtuelle Ubuntu pour héberger votre cluster. Vous devez encore installer MicroK8s. Procédez comme suit.

  4. Installez l’application Snap MicroK8s. La durée de cette étape varie en fonction de la rapidité de votre connexion Internet et de votre poste de travail.

    sudo snap install microk8s --classic
    

    Si l’installation est réussie, le message suivant s’affiche :

    2020-03-16T12:50:59+02:00 INFO Waiting for restart...
    microk8s v1.17.3 from Canonical✓ installed
    

Vous êtes maintenant prêts à installer des extensions (ou add-ons) sur le cluster.

Préparer le cluster

Pour voir l’état des extensions installées sur votre cluster, exécutez la commande status de MicroK8s. Ces extensions fournissent plusieurs services, dont certains ont été traités précédemment. La fonctionnalité DNS en est un exemple.

  1. Pour vérifier l’état de l’installation, exécutez la commande microk8s.status --wait-ready.

    sudo microk8s.status --wait-ready
    

    Notez qu'il existe plusieurs modules complémentaires désactivés sur votre cluster. Ne vous souciez pas des extensions que vous ne reconnaissez pas.

    microk8s is running
    addons:
    cilium: disabled
    dashboard: disabled
    dns: disabled
    fluentd: disabled
    gpu: disabled
    helm3: disabled
    helm: disabled
    ingress: disabled
    istio: disabled
    jaeger: disabled
    juju: disabled
    knative: disabled
    kubeflow: disabled
    linkerd: disabled
    metallb: disabled
    metrics-server: disabled
    prometheus: disabled
    rbac: disabled
    registry: disabled
    storage: disabled
    
  2. Dans la liste, vous devez activer les modules complémentaires DNS, Tableau de bord et Registre. Les objectifs de chaque module complémentaire sont décrits ci-dessous :

    Modules complémentaires Objectif
    DNS Déploie le service coreDNS.
    Tableau de bord Déploie le service kubernetes-dashboard et plusieurs autres services qui prennent en charge cette fonctionnalité. Il s’agit d’une interface utilisateur web à usage général pour les clusters Kubernetes.
    Registre Déploie un registre privé et plusieurs services qui prennent en charge cette fonctionnalité. Pour stocker des conteneurs privés, utilisez ce registre.

    Pour installer les extensions, exécutez la commande suivante.

    sudo microk8s.enable dns dashboard registry
    

vous pouvez désormais accéder à votre cluster avec kubectl.

Explorer le cluster Kubernetes

MicroK8s fournit une version de kubectl que vous pouvez utiliser pour interagir avec votre nouveau cluster Kubernetes. Cette copie de kubectl vous permet d’avoir une installation parallèle d’une autre instance de kubectl à l’échelle du système sans impacter ses fonctionnalités.

  1. Exécutez la commande snap alias afin de déclarer kubectl comme alias de microk8s.kubectl. Cette étape simplifie l’utilisation.

    sudo snap alias microk8s.kubectl kubectl
    

    La sortie suivante s’affiche quand la commande se termine correctement :

    Added:
      - microk8s.kubectl as kubectl
    

Afficher des informations sur le nœud de cluster

Rappelez-vous qu’un cluster Kubernetes existe en dehors des plans de contrôle et des nœuds Worker. Nous allons explorer le nouveau cluster pour voir ce qui est installé.

  1. Vérifier les nœuds en cours d’exécution dans votre cluster.

    Vous savez que MicroK8s est une installation de cluster à un seul nœud : vous vous attendez donc à ne voir qu’un seul nœud. Gardez cependant à l’esprit que ce nœud est à la fois le plan de contrôle et un nœud Worker dans le cluster. Vérifiez cette configuration en exécutant la commande kubectl get nodes. Pour récupérer des informations sur toutes les ressources de votre cluster, exécutez la commande kubectl get :

    sudo kubectl get nodes
    

    Le résultat est similaire à l’exemple ci-dessous, qui vous indique qu’il n’existe qu’un seul nœud dans le cluster, dont le nom est microk8s-vm. Notez que le nœud est dans l’état Prêt. L’état Prêt indique que le plan de contrôle peut planifier des charges de travail sur ce nœud.

    NAME          STATUS   ROLES    AGE   VERSION
    microk8s-vm   Ready    <none>   35m   v1.17.3
    

    Vous pouvez obtenir plus d’informations sur la ressource spécifique demandée. Par exemple, supposons que vous ayez besoin de trouver l’adresse IP du nœud. Pour extraire des informations supplémentaires du serveur d’API, exécutez le paramètre -o wide :

    sudo kubectl get nodes -o wide
    

    Le résultat est similaire à l’exemple suivant. Notez que vous pouvez maintenables voir l’adresse IP interne du nœud, le système d’exploitation en cours d’exécution sur le nœud, la version du noyau et le runtime de conteneur.

    NAME          STATUS   ROLES    AGE   VERSION   INTERNAL-IP      EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME
    microk8s-vm   Ready    <none>   36m   v1.17.3   192.168.56.132   <none>        Ubuntu 18.04.4 LTS   4.15.0-88-generic   containerd://1.2.5
    
  2. L’étape suivante consiste à explorer les services s’exécutant sur votre cluster. Comme avec les nœuds, pour rechercher des informations sur les services exécutés sur le cluster, exécutez la commande kubectl get.

    sudo kubectl get services -o wide
    

    Le résultat est similaire à l’exemple suivant, mais un seul service est répertorié. Vous avez installé précédemment des modules complémentaires sur le cluster et vous vous attendez à voir ces services également.

    NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE   SELECTOR
    kubernetes   ClusterIP   10.152.183.1   <none>        443/TCP   37m   <none>
    

    Si un seul service est répertorié, c’est parce que Kubernetes utilise un concept appelé espaces de noms pour diviser logiquement un cluster en plusieurs clusters virtuels.

    Pour extraire tous les services dans tous les espaces de noms, transmettez le paramètre --all-namespaces :

    sudo kubectl get services -o wide --all-namespaces
    

    Le résultat est similaire à l’exemple suivant. Notez que vous avez trois espaces de noms dans votre cluster. Il s’agit de l’espace de noms par défaut, et des espaces de noms container-registry et kube-system. Vous pouvez voir ici les instances registry, kube-dns et kubernetes-dashboard que vous avez installées. Des services de prise en charge ont également été installés en même temps que certains modules complémentaires.

    NAMESPACE            NAME                        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                  AGE   SELECTOR
    container-registry   registry                    NodePort    10.152.183.36    <none>        5000:32000/TCP           28m   app=registry
    default              kubernetes                  ClusterIP   10.152.183.1     <none>        443/TCP                  37m   <none>
    kube-system          dashboard-metrics-scraper   ClusterIP   10.152.183.130   <none>        8000/TCP                 28m   k8s-app=dashboard-metrics-scraper
    kube-system          heapster                    ClusterIP   10.152.183.115   <none>        80/TCP                   28m   k8s-app=heapster
    kube-system          kube-dns                    ClusterIP   10.152.183.10    <none>        53/UDP,53/TCP,9153/TCP   28m   k8s-app=kube-dns
    kube-system          kubernetes-dashboard        ClusterIP   10.152.183.132   <none>        443/TCP                  28m   k8s-app=kubernetes-dashboard
    kube-system          monitoring-grafana          ClusterIP   10.152.183.88    <none>        80/TCP                   28m   k8s-app=influxGrafana
    kube-system          monitoring-influxdb         ClusterIP   10.152.183.232   <none>        8083/TCP,8086/TCP        28m   k8s-app=influxGrafana
    

    Maintenant que vous pouvez voir les services en cours d’exécution sur le cluster, vous pouvez planifier une charge de travail sur le nœud Worker.

Installer un serveur web sur un cluster

Vous voulez planifier un serveur web sur le cluster pour délivrer les services d’un site web à vos clients. Vous pouvez choisir parmi plusieurs options. Pour cet exemple, vous utilisez NGINX.

Rappelez-vous de ce qui précède que vous pouvez utiliser des fichiers manifestes de pods pour décrire vos pods, vos jeux de réplicas et vos déploiements pour définir des charges de travail. Ces fichiers n'ayant pas été traités en détail, vous exécutez kubectl pour transmettre directement les informations au serveur API.

Bien que l’utilisation de kubectl soit pratique, l’utilisation de fichiers manifestes est une bonne pratique. Les fichiers manifestes vous permettent de restaurer par progression ou d’annuler facilement des déploiements dans votre cluster. Ces fichiers vous aident également à documenter la configuration d’un cluster.

  1. Pour créer votre déploiement NGINX, exécutez la commande kubectl create deployment. Spécifiez le nom du déploiement et l’image conteneur pour créer une seule instance du pod.

    sudo kubectl create deployment nginx --image=nginx
    

    Le résultat est similaire à l’exemple suivant :

    deployment.apps/nginx created
    
  2. Pour extraire les informations relatives à votre déploiement, exécutez kubectl get deployments :

    sudo kubectl get deployments
    

    Le résultat est similaire à l’exemple suivant. Notez que le nom du déploiement correspond au nom que vous lui avez donné, et qu’un déploiement portant ce nom est dans un état Prêt et disponible.

    NAME    READY   UP-TO-DATE   AVAILABLE   AGE
    nginx   1/1     1            1           18s
    
  3. Le déploiement a créé un pod. Pour extraire les informations relatives aux pods de votre cluster, exécutez la commande kubectl get pods :

    sudo kubectl get pods
    

    Le résultat est similaire à l’exemple suivant. Le nom du pod est une valeur générée préfixée du nom du déploiement et l’état du pod est En cours d’exécution.

    NAME                     READY   STATUS    RESTARTS   AGE
    nginx-86c57db685-dj6lz   1/1     Running   0          33s
    

Tester l’installation du site web

Testez l’installation de NGINX en vous connectant au serveur web via l’adresse IP du pod.

  1. Pour trouver l’adresse du pod, transmettez le paramètre -o wide :

    sudo kubectl get pods -o wide
    

    Le résultat est similaire à l’exemple suivant. Notez que la commande retourne à la fois l’adresse IP du nœud et le nom du nœud sur lequel la charge de travail est planifiée.

    NAME                     READY   STATUS    RESTARTS   AGE     IP           NODE          NOMINATED NODE   READINESS GATES
    nginx-86c57db685-dj6lz   1/1     Running   0          4m17s   10.1.83.10   microk8s-vm   <none>           <none>
    
  2. Pour accéder au site web, exécutez wget sur l'IP indiquée précédemment :

    wget <POD_IP>
    

    Le résultat est similaire à l’exemple suivant :

    --2020-03-16 13:34:17--  http://10.1.83.10/
    Connecting to 10.1.83.10:80... connected.
    HTTP request sent, awaiting response... 200 OK
    Length: 612 [text/html]
    Saving to: 'index.html'
    
    index.html                                    100%[==============================================================================================>]     612  --.-KB/s    in 0s
    
    2020-03-16 13:34:17 (150 MB/s) - 'index.html' saved [612/612]
    

Mettre à l’échelle le déploiement d’un serveur web sur un cluster

Supposons que le nombre d’utilisateurs accédant à votre site web augmente subitement et qu’il commence à montrer des signes de faiblesse en raison de la charge. Vous pouvez déployer plus d’instances du site dans votre cluster et répartir la charge entre les instances.

Pour mettre à l’échelle le nombre de réplicas dans votre déploiement, exécutez la commande kubectl scale. Vous spécifiez le nombre de réplicas dont vous avez besoin et le nom du déploiement.

  1. Pour faire passer le nombre total de pods NGINX à 3, exécutez la commande kubectl scale :

    sudo kubectl scale --replicas=3 deployments/nginx
    

    Le résultat est similaire à l’exemple suivant :

    deployment.apps/nginx scaled
    

    La commande scale vous permet d’augmenter ou de baisser le nombre d’instances.

  2. Pour vérifier le nombre de pods en cours d’exécution, exécutez la commande kubectl get et transmettez à nouveau le paramètre -o wide :

    sudo kubectl get pods -o wide
    

    Le résultat est similaire à l’exemple suivant. Notez que vous voyez maintenant trois pods en cours d’exécution, chacun avec une adresse IP unique.

    NAME                     READY   STATUS    RESTARTS   AGE     IP           NODE          NOMINATED NODE   READINESS GATES
    nginx-86c57db685-dj6lz   1/1     Running   0          7m57s   10.1.83.10   microk8s-vm   <none>           <none>
    nginx-86c57db685-lzrwp   1/1     Running   0          9s      10.1.83.12   microk8s-vm   <none>           <none>
    nginx-86c57db685-m7vdd   1/1     Running   0          9s      10.1.83.11   microk8s-vm   <none>           <none>
    ubuntu@microk8s-vm:~$
    

Vous devez appliquer plusieurs configurations supplémentaires au cluster pour exposer efficacement votre site web en tant que site web public. Par exemple, vous allez installer un équilibreur de charge et mapper les adresses IP des nœuds. Ce type de configuration fait appel à concepts avancés que vous verrez plus tard. dans le résumé, il existe des instructions si vous choisissez de désinstaller et de nettoyer votre machine virtuelle.