Prise en main d’Elastic Cloud sur Kubernetes : c’est parti pour le déploiement !

Il y a peu, nous avons annoncé le lancement d’Elastic Cloud sur Kubernetes (ECK). Même si la solution est toujours en version alpha, on peut dire que cette annonce a créé une petite révolution au sein des communautés Elasticsearch et Kubernetes. Développée et soutenue par les créateurs de la Suite Elastic, ECK est la solution idéale pour déployer Elastic sur Kubernetes. Dans cette série de deux blogs, nous allons nous pencher sur les thématiques suivantes :

  1. Comment déployer ECK dans un cluster Kubernetes (Minikube ou GKE)
  2. Comment déployer la Suite Elastic sur ECK
  3. Comment scaler et mettre à niveau Elasticsearch et Kibana dans ECK
  4. Comment déployer une application instrumentée avec Elastic APM et envoyer des données APM dans le cluster Elasticsearch géré par ECK
  5. Comment déployer Metricbeat sur Kubernetes en tant que DaemonSet et connecter Metricbeat au cluster Elasticsearch géré par ECK en toute sécurité

À la fin du blog, vous disposerez d’un système comme celui indiqué dans le diagramme ci-dessous. Dans le premier blog, nous allons voir comment déployer ECK et la Suite Elastic.

Diagramme de déploiement d’ECK

Si vous souhaitez obtenir les informations les plus récentes sur ECK, n’hésitez pas à consulter la page de démarrage rapide ou la page produit.

Créez votre cluster k8s

Avant de déployer ECK et la Suite Elastic, vous devez disposer d’un cluster Kubernetes. Dans le cadre de ce blog, Minikube et Google Kubernetes Engine (GKE) feront l’affaire. Sachez néanmoins que nous prenons en charge d’autres distributions Kubernetes, telles que OpenShift, Amazon EKS et Microsoft AKS. Mais revenons à nos moutons. Étant donné que nous allons déployer ECK, Elasticsearch, Kibana, APM Server et une application à titre d’exemple, je vous recommande de prévoir 16 Go de RAM et 4 cœurs pour votre cluster. Vous pouvez n’attribuer que 12 Go de RAM à votre cluster Kubernetes si vous le préférez, néanmoins, il est préférable d’avoir 16 Go de RAM pour bénéficier d’une expérience fluide.

Minikube

Si vous avez choisi d’utiliser Minikube, suivez les instructions indiquées pour l’installer. Configurez-le ensuite avec les ressources nécessaires et lancez-le :

minikube config set memory 16384 
minikube config set cpus 4
minikube start

Le tableau de bord Kubernetes est particulièrement pratique pour monitorer et gérer votre cluster Kubernetes. Pour l’activer pour Minikube, exécutez la commande suivante :

minikube dashboard

Une fenêtre de navigateur s’ouvre automatiquement : vous y verrez le tableau de bord Kubernetes. Voilà ! Vous êtes paré pour la suite !

Google Kubernetes Engine (GKE)

Si vous avez choisi d’utiliser GKE, lisez la documentation Google pour savoir comment configurer votre cluster. Mon cluster GKE est composé d’un nœud de 15 Go de RAM et de 4 processeurs virtuels. Vous pouvez opter pour un cluster plus petit si vous le préférez. Attention néanmoins : il doit disposer d’au moins 12 Go de RAM. Autre élément : pour travailler avec GKE, vous avez besoin de l’outil de ligne de commande gcloud.

Une fois que votre cluster GKE est opérationnel, exécutez les commandes suivantes pour vous connecter à votre cluster et définir les privilèges requis. Avec GKE, vous devez disposer de droits d’administration sur le cluster. Veillez à bien remplacer le nom du projet, le nom de la zone, le nom du cluster et l’ID utilisateur par les vôtres :

gcloud config set project elastic-sa 
gcloud config set compute/zone us-central1-a
gcloud config set container/cluster aquan
gcloud auth login
gcloud container clusters get-credentials aquan --zone us-central1-a --project elastic-sa
kubectl create clusterrolebinding cluster-admin-binding --clusterrole=cluster-admin --user=adam.quan@elastic.co
kubectl create clusterrolebinding adam.quan-cluster-admin-binding --clusterrole=cluster-admin --user=adam.quan@elastic.co

Pour terminer, nous allons utiliser l’outil de ligne de commande Kubernetes pour interagir avec Minikube ou GKE. Suivez les instructions pour installer kubectl. Vérifiez que vous disposez bien de la version 1.11 (ou ultérieure) de kubectl.

Les artefacts que nous utiliserons dans le cadre de ce blog sont téléchargeables à partir de ce référentiel GitHub.

Déployez un Elasticsearch Operator

Pour déployer ECK, vous n’avez besoin que d’une seule commande. Incroyable, non ? Et pourtant, c’est vrai ! Exécutez tout simplement la commande ci-dessous pour déployer ECK 0.9.0 (dernière version à la date de cet article). Simple. Efficace.

kubectl apply -f https://download.elastic.co/downloads/eck/0.9.0/all-in-one.yaml

Après le déploiement, vous pouvez utiliser la commande ci-dessous pour monitorer les logs de l’Operator et vérifier que tout se passe bien. Seuls quelques instants suffisent à ECK pour se lancer.

kubectl -n elastic-system logs -f statefulset.apps/elastic-operator

Déployez la Suite Elastic

Maintenant qu’ECK fonctionne, déployons la Suite Elastic. Là aussi, seule une commande suffit ! Regardez apm_es_kibana.yaml. Vous avez vu comme c’est facile de configurer Kibana et le serveur APM pour qu’ils communiquent grâce à elasticsearchRef ?

Il y a plusieurs façons de personnaliser votre déploiement, par exemple :

  • Modèle pod
  • Configuration de nœud
  • Mémoire virtuelle
  • Certificat HTTP personnalisé
  • Paramètres de sécurité

Déployez la Suite avec la commande suivante :

kubectl apply -f apm_es_kibana.yaml

Vérifiez l’état d’Elasticsearch, de Kibana et du serveur APM avec kubectl ou le tableau de bord Kubernetes et assurez-vous qu’ils soient tous verts et opérationnels :

kubectl get elasticsearch,kibana,apmserver

Quand les trois composants sont verts, cela signifie que votre cluster Elasticsearch est opérationnel et qu’il est prêt à recevoir des données. Il faut savoir qu’ECK exécute bon nombre de tâches pour nous. Avant de continuer, penchons-nous sur ce qu’ECK a fait pour notre cluster :

  • La sécurité est activée pour ECK. Toutes les ressources de la Suite Elastic déployées par ECK sont sécurisées par défaut. L’authentification intégrée de base proposée aux utilisateurs Elastic, ainsi que le trafic réseau vers, depuis et dans votre cluster Elasticsearch, sont sécurisés par le protocole TLS.
  • Certificats : par défaut, un certificat d’autorité de certification autosigné est utilisé pour chaque cluster. Des certificats HTTPS personnalisés peuvent être également mis en place.
  • Service exposé par défaut : un service ClusterIP est automatiquement créé pour votre cluster et Kibana. Mais vous pouvez les configurer afin d’opter pour un type LoadBalancer, si vous préférez.

Voyons cela du point de vue de Kibana.

Accédez à Kibana

Par défaut, Kibana est exposé en tant que service avec une IP de cluster accessible depuis le cluster, mais n’est pas exposé à Internet. Vous pouvez changer cela en utilisant la commande de transfert de port suivante :

kubectl port-forward service/kibana-sample-kb-http 5601

Avant de pouvoir nous connecter à Kibana, nous devons obtenir les informations d’identification de l’utilisateur Elastic par défaut. Vous pouvez exécuter la commande "kubectl get secret", puis inspecter un secret pour en déterminer le chemin JSON. Voici le secret et le chemin appropriés dans le cas présent :

echo `kubectl get secret elasticsearch-sample-es-elastic-user -o=jsonpath='{.data.elastic}' | base64 --decode`

Le mot de passe de l’utilisateur Elastic est affiché. Copiez-le et enregistrez-le dans un bloc-notes.

Maintenant, ouvrez un navigateur et connectez-vous à https://localhost:5601. Étant donné que nous utilisons un certificat autosigné, vous devez accepter l’avertissement de sécurité de votre navigateur. Connectez-vous avec l’utilisateur Elastic et le mot de passe récupéré. Vous serez redirigé vers la page d’accueil de Kibana. Ça y est ! Notre cluster est prêt !

Scaling et mise à niveau

Pour scaler et mettre à niveau votre cluster Elasticsearch dans ECK, rien de plus simple ! Il suffit de modifier la configuration du déploiement et de l’appliquer avec kubectl.

Scaling

Modifiez votre manifeste de déploiement apm_es_kibana.yaml en faisant passer la taille de la mémoire de votre conteneur Elasticsearch de 3 Go à 2 Go dans la section suivante :

        containers: 
- name: elasticsearch
resources:
limits:
memory: 3Gi

Enregistrez le fichier et scalez votre nœud avec cette commande :

kubectl apply -f apm_es_kibana.yaml

Basculez immédiatement vers votre console Kubernetes : un nouveau pod Elasticsearch est en train de se créer. ECK scale votre nœud Elasticsearch instantanément. Tenez-vous prêt : dans quelques minutes, votre nouveau pod fonctionnera, et le pod initial disparaîtra. Les données de l’ancien pod seront également laissées de côté.

Bien entendu, il existe d’autres moyens pour scaler votre cluster. Vous pouvez par exemple y ajouter des nœuds. Quelle que soit l’option que vous choisissez, vous aurez besoin uniquement d’une commande "kubectl apply".

Pod Elasticsearch en cours de création

Mise à niveau

Maintenant, mettons à niveau le cluster vers la version 7.2.0. Changeons tout simplement la version 7.1.0 par 7.2.0 pour Elasticsearch, Kibana et le serveur APM dans le manifeste de déploiement apm_es_kibana.yaml. Pour enregistrer et appliquer la mise à niveau, exécutez la commande suivante :

kubectl apply -f apm_es_kibana.yaml

De la même manière, depuis la console Kubernetes, vous pouvez voir qu’ECK effectue une mise à niveau fluide d’Elasticsearch, de Kibana et du serveur APM sans indisponibilité.

Une fois le processus de mise à niveau terminé, vérifiez que c’est bien la version 7.2.0 de la Suite Elastic qui s’exécute. Maintenant que vous avez vu ECK à l’œuvre, on ne peut pas nier sa puissance, n’est-ce pas ? Alors... convaincu ?

Résumé

J’espère que vous avez apprécié cette première expérience avec Elastic Cloud sur Kubernetes et que vous avez pu constater à quel point cette solution est simple d’utilisation. Dans la deuxième partie de ce blog, nous déploierons une application simple instrumentée avec APM, avec laquelle nous enverrons des données APM vers notre cluster géré par ECK. Nous déploierons également Metricbeat dans Kubernetes pour envoyer des données d’indicateurs au cluster.