Superviser les accès aux applications Kubernetes

Photo by Kelvin Valerio from Pexels

TL;DR Le contrôleur d'ingress nginx pour Kubernetes vient avec une instrumentation qui permet de superviser les accès à vos applications. Cet article présente l'installation et la configuration de ces éléments dans Prometheus et Grafana.

Les ingress gèrent, au niveau applicatif, le trafic qui entre dans Kubernetes. Il existe une large variété de contrôleurs basés sur haproxy, nginx, traefik, envoy ou d'autres solutions propriétaires. Une liste des implémentations est disponibles dans la section Ingress Controllers de la documentation.

Pour utiliser un ingress, il faut, au préalable, installer un contrôleur qui le prend en charge. Le contrôleur d'ingress basé sur nginx est une solution populaire pour exposer l'accès à votre cluster Kubernetes. Un avantage important de la solution est sa capacité à gérer de nombreux scénarios et les outils de supervision qui les accompagnent. Les sections ci-dessous présente comment configurer et accéder à ces indicateurs.

Avant d'aller plus loin, si vous voulez comprendre comment Prometheus et Grafana fonctionnent avec Kubernetes, vous trouverez plusieurs articles pour vous aiguiller sur ce blog:

Installer le contrôleur nginx

L'installation du contrôleur dépend de l'infrastructure Kubernetes. Pour plus de détails, reportez-vous à l'Installation Guide.

Par exemple, pour installer le contrôleur nginx sur un cluster Kind, reportez-vous à la section Ingress de la documentation associée.

Configurer Prometheus

Le répertoire blog/kubernetes-prometheus du projet easyteam-fr/side-effects contient un exemple de configuration. Pour la déployer, allez dans le répertoire blog/kubernetes-prometheus et lancez le script ci-dessous:

git clone https://github.com/easyteam-fr/side-effects.git
cd side-effects/blog/kubernetes-prometheus
kubectl create namespace monitoring
kubectl apply -k .

La section de la configuration qui réalise la découverte est la suivante. Vous pouvez également la retrouver dans les fichiers du répertoire deploy/prometheus du projet kubernetes/ingress-nginx:

scrape_configs:
  - job_name: 'ingress-nginx-endpoints'
    kubernetes_sd_configs:
    - role: pod
      namespaces:
        names:
        - ingress-nginx
    relabel_configs:
    # Conserve les pods avec le label `prometheus.io/scrape`
    - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
      action: keep
      regex: true
    - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scheme]
      action: replace
      target_label: __scheme__
      regex: (https?)
    # Modifie le chemin des mesures avec `prometheus.io/path`
    - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]
      action: replace
      target_label: __metrics_path__
      regex: (.+)
    # Modifie l'adresse de l'exporter Prometheus
    - source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port]
      action: replace
      target_label: __address__
      regex: ([^:]+)(?::\d+)?;(\d+)
      replacement: $1:$2
    # supprime prometheus-server
    - source_labels: [__meta_kubernetes_service_name]
      regex: prometheus-server
      action: drop

Créer et tester un Ingress

Avant de visualiser le dashboard dans Grafana, installez et testez un ingress. Un exemple est fourni dans le projet Kind et doit facilement fonctionner avec votre configuration. Celui-ci expose 2 URLs Exécutez les commande ci-dessous en modifiant au préalable la variable INGRESS_HOSTNAME pour l'installer:

kubectl apply -f https://kind.sigs.k8s.io/examples/ingress/usage.yaml

export INGRESS_HOSTNAME=localhost
cat <<EOF | kubectl apply -f-
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: $INGRESS_HOSTNAME
    http:
      paths:
      - path: /foo
        backend:
          serviceName: foo-service
          servicePort: 5678
      - path: /bar
        backend:
          serviceName: bar-service
          servicePort: 5678
EOF

Important: nginx ne collecte les mesures associées aux requêtes uniquement pour les ingress qui ont une clause host: dans les règles associées. Il est essentiel de positionner la variable INGRESS_HOSTNAME et de ré-exécuter la commande ci-dessus avec une configuration qui correspond à votre installation.

Pour tester le contrôleur, vous pourrez simplement exécuter un script comme celui ci-dessous:

for i in $(seq 100); do curl --silent $INGRESS_HOSTNAME/foo; done

Configurer Grafana

Grafana est installé et configuré avec Prometheus depuis le répertoire blog/kubernetes-prometheus du projet easyteam-fr/side-effects. Pour vous connecter, lancez le script ci-dessous:

kubectl port-forward -n monitoring svc/grafana 3000:3000

Vous pourrez lancer la console Grafana à partir de l'URL localhost:3000.

Installez le dashboard Grafana associé au projet ingress-nginx. Il permet de visualiser le fonctionnement du contrôleur et aussi la distribution par ingress comme ci-dessous:

Grafana

Pour aller plus loin

La supervision reste une clé pour gérer les infrastructures et c'est donc essentiel que chaque composant, applicatif ou technique, vienne avec ses indicateurs. C'est désormais aussi une clé pour l'automatisation et l'élasticité des solutions. Ces indicateurs pourront ainsi servir de base pour, par exemple, augmenter le nombre de pods associés à un service. C'est un sujet que vous voudrez rapidement regarder...

Easyteam DevOps

Easyteam DevOps