Le projet, vous l'aurez compris, consiste à mettre en place une stack EFK (Elastic, Fluentd, Kibana) / à l'inverse d'une stack ELK (Elastic, Logstash, Kibana) sur un cluster GKE évidemment.

Pour ce faire rendez-vous sur Google Console et créer votre projet, activer la facturation avec les 300 $ de crédits offerts, et lancez le Cloud Shell.

Ensuite saisissez ces commandes dans le shell :

$ export PROJECT_ID=$(gcloud config get-value project) 
$ gcloud config set project ${PROJECT_ID}
$ CLUSTER_ZONE=$(gcloud config set compute/zone us-central1-c)
$ CLUSTER="demo-core"
$ gcloud container clusters create ${CLUSTER} --scopes "https://www.googleapis.com/auth/projecthosting,cloud-platform"

Ce qui donne :

Creating cluster demo-core in us-central1-c... Cluster is being health-checked (master is healthy)...done.
Created [https://container.googleapis.com/v1/projects/totemic-splicer-229713/zones/us-central1-c/clusters/demo-core].
To inspect the contents of your cluster, go to: https://console.cloud.google.com/kubernetes/workload_/gcloud/us-central1-c/demo-core?project=totemic-splicer-229713
kubeconfig entry generated for demo-core.
NAME       LOCATION       MASTER_VERSION  MASTER_IP       MACHINE_TYPE   NODE_VERSION   NUM_NODES  STATUS
demo-core  us-central1-c  1.10.11-gke.1   162.222.179.87  n1-standard-1  1.10.11-gke.1  3          RUNNING

Clonez le repository :

$ git clone https://github.com/gabrielsagnard/efk.git
$ cd efk


Créer l'utilisateur admin clusterrolebinding :

$ export GKE_USER=$(gcloud config get-value account)
$ echo $GKE_USER
$ kubectl create clusterrolebinding cluster-admin-binding-$GKE_USER --clusterrole=cluster-admin --user=$(gcloud config get-value account) &>/dev/null

Désactivez la journalisation StackDriver, mais vérifiez les pods dans le namespace kube-system avec :

$ kubectl get pods -n kube-system


Si StackDriver est activé, il affiche quelque chose comme:

gsagnard2006@cloudshell:~/efk (totemic-splicer-229713)$ kubectl get pods -n kube-system
NAME                                                  READY     STATUS    RESTARTS   AGE
event-exporter-v0.2.3-54f94754f4-8pqnl                2/2       Running   0          3m
fluentd-gcp-scaler-6d7bbc67c5-sdph2                   1/1       Running   0          3m
fluentd-gcp-v3.1.0-lzdfk                              2/2       Running   0          1m
fluentd-gcp-v3.1.0-vk8wd                              2/2       Running   0          1m
fluentd-gcp-v3.1.0-vmhz5                              2/2       Running   0          1m
heapster-v1.5.3-76f46d6554-jsz2k                      3/3       Running   0          2m
kube-dns-788979dc8f-dbz76                             4/4       Running   0          3m
kube-dns-788979dc8f-tsn7g                             4/4       Running   0          2m
kube-dns-autoscaler-79b4b844b9-kw9np                  1/1       Running   0          3m
kube-proxy-gke-demo-core-default-pool-e9c97b4b-3d8d   1/1       Running   0          3m
kube-proxy-gke-demo-core-default-pool-e9c97b4b-62j6   1/1       Running   0          3m
kube-proxy-gke-demo-core-default-pool-e9c97b4b-p81x   1/1       Running   0          3m
l7-default-backend-5d5b9874d5-5wsjh                   1/1       Running   0          3m
metrics-server-v0.2.1-7486f5bd67-tw96r                2/2       Running   0          2m

Dans le cas présent, il existe des pods fluent et exportateur d'événement, cela indique que Stackdriver est activé. Désactiver StackDriver avec ce modèle de commande:

$ gcloud container clusters update ${CLUSTER} ${CLUSTER_ZONE} --logging-service none

Une fois l'exécution terminée, attendez quelques minutes que le cluster supprime automatiquement tous les anciens pods associés à StackDriver. Vérifiez les pods dans le namespace kube-system avec:

$ kubectl get pods -n kube-system

Si les pods fluent et event-exporter ont été supprimés automatiquement, le message suivant apparaît:

gsagnard2006@cloudshell:~ (totemic-splicer-229713)$ kubectl get pods -n kube-system
    NAME                                                  READY     STATUS    RESTARTS   AGE
    heapster-v1.5.3-76f46d6554-jsz2k                      3/3       Running   0          1h
    kube-dns-788979dc8f-dbz76                             4/4       Running   0          1h
    kube-dns-788979dc8f-tsn7g                             4/4       Running   0          1h
    kube-dns-autoscaler-79b4b844b9-kw9np                  1/1       Running   0          1h
    kube-proxy-gke-demo-core-default-pool-e9c97b4b-3d8d   1/1       Running   0          1h
    kube-proxy-gke-demo-core-default-pool-e9c97b4b-62j6   1/1       Running   0          1h
    kube-proxy-gke-demo-core-default-pool-e9c97b4b-p81x   1/1       Running   0          1h
    l7-default-backend-5d5b9874d5-5wsjh                   1/1       Running   0          1h
    metrics-server-v0.2.1-7486f5bd67-tw96r                2/2       Running   0          1h
    gsagnard2006@cloudshell:~ (totemic-splicer-229713)$

Créez les pods EFK en utilisant leurs fichiers .yaml configurés

$ kubectl create -f fluentd-es-configmap.yaml
$ kubectl create -f fluentd-es-ds.yaml
$ kubectl create -f kibana-deployment.yaml
$ kubectl create -f kibana-service.yaml
$ kubectl create -f es-statefulset.yaml
$ kubectl create -f es-service.yaml

Vérifiez si les pods sont disponibles :

$ kubectl get pods -n kube-system

Ce qui donne :

gsagnard2006@cloudshell:~/efk (totemic-splicer-229713)$ kubectl get pods -n kube-system
NAME                                                  READY     STATUS            RESTARTS   AGE
elasticsearch-logging-0                               0/1       PodInitializing   0          27s
fluentd-es-v2.2.0-4tjkt                               1/1       Running           0          43s
fluentd-es-v2.2.0-8tg74                               1/1       Running           0          43s
fluentd-es-v2.2.0-jrjvz                               1/1       Running           0          43s
heapster-v1.5.3-76f46d6554-jsz2k                      3/3       Running           0          2h
kibana-logging-84445456dc-7s7fr                       1/1       Running           0          38s
kube-dns-788979dc8f-dbz76                             4/4       Running           0          2h
kube-dns-788979dc8f-tsn7g                             4/4       Running           0          2h
kube-dns-autoscaler-79b4b844b9-kw9np                  1/1       Running           0          2h
kube-proxy-gke-demo-core-default-pool-e9c97b4b-3d8d   1/1       Running           0          2h
kube-proxy-gke-demo-core-default-pool-e9c97b4b-62j6   1/1       Running           0          2h
kube-proxy-gke-demo-core-default-pool-e9c97b4b-p81x   1/1       Running           0          2h
l7-default-backend-5d5b9874d5-5wsjh                   1/1       Running           0          2h
metrics-server-v0.2.1-7486f5bd67-tw96r                2/2       Running           0          2h

Pour accéder au tableau de bord Web de kibana, vous pouvez être authentifié dans le cluster. Si vous utilisez le shell de la console Web google cloud, exécutez:

$ kubectl proxy --port 8001

Cliquez sur le bouton Aperçu Web en haut du shell de Google Cloud Console et cliquez sur l'élément Modifier le port. Une fenêtre contextuelle s’affiche, puis ajoutez le port 8001 et cliquez sur le bouton Modifier et prévisualiser.  Il ouvre un nouvel onglet dans le navigateur avec cette URL:

Éditez cette URL en supprimant le dernier fragment:  

?authuser=0  

Et ajoutez à la fin ce qui suit:  

api/v1/namespaces/kube-system/services/kibana-logging/proxy  

Actualisez le navigateur et attendez que kibana soit chargé.

Cliquez sur le bouton «Configurer Index patterns» situé dans le coin supérieur droit.  Il montre la vue Créer un index pattern. Dans le modèle d’index pattern, ajoutez un index pattern (expression régulière).  Votre index pattern peut correspondre à l’un des index présentés ci-dessous.  

Par exemple, vous pouvez ajouter  lo*  

Kibana indique que votre modèle réussit avec un message

Cliquez sur le bouton «Étape suivante»

Dans le champ «Time Filter Name», choisissez  @Timestamp

Cliquez sur le bouton "create index pattern

Cliquez sur la vue Discover pour afficher le dashboard journalisation par défaut.

Ce qui va permettre de créer des visualisations comme ceci et de les ajouter au dashboard :

Have fun :)