root@kube-01:/opt/k3s_services/wikijs# mkdir /opt/k3s_services/supervision
root@kube-01:/opt/k3s_services/wikijs# cd /opt/k3s_services/supervision/
root@kube-01:/opt/k3s_services/supervision# curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
root@kube-01:/opt/k3s_services/supervision# helm version
version.BuildInfo{Version:"v3.19.5", GitCommit:"4a19a5b6fb912c5c28a779e73f2e0880d9e239a4", GitTreeState:"clean", GoVersion:"go1.24.11"}
root@kube-01:/opt/k3s_services/supervision# helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
root@kube-01:/opt/k3s_services/supervision# helm repo update
root@kube-01:/opt/k3s_services/supervision# vim 01-namespace.yaml
Contenu :
apiVersion: v1
kind: Namespace
metadata:
name: observability
root@kube-01:/opt/k3s_services/supervision# kubectl apply -f 01-namespace.yaml
root@kube-01:/opt/k3s_services/supervision# vim 02-values-kube-prom-stack.yaml
Contenu :
# kube-prometheus-stack values (LAB K3s)
# - Prometheus + Grafana en pods
# - Stockage persistant via Longhorn
# - Prometheus non exposé (ClusterIP)
# - Grafana exposé via Ingress séparé
grafana:
enabled: true
adminPassword: "ChangeMe-StrongPassword"
persistence:
enabled: true
storageClassName: longhorn
accessModes:
- ReadWriteOnce
size: 5Gi
service:
type: ClusterIP
prometheus:
enabled: true
prometheusSpec:
retention: 7d
storageSpec:
volumeClaimTemplate:
spec:
storageClassName: longhorn
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 20Gi
alertmanager:
enabled: false
# node-exporter + kube-state-metrics : indispensables
prometheus-node-exporter:
enabled: true
kube-state-metrics:
enabled: true
# Évite certains faux positifs en lab si besoin (optionnel)
kubeControllerManager:
enabled: true
kubeScheduler:
enabled: true
kubeEtcd:
enabled: true
root@kube-01:/opt/k3s_services/supervision# export KUBECONFIG=/etc/rancher/k3s/k3s.yaml
root@kube-01:/opt/k3s_services/supervision# helm upgrade --install kps prometheus-community/kube-prometheus-stack \
-n observability \
-f /opt/k3s_services/supervision/02-values-kube-prom-stack.yaml
Résultat :
Release "kps" does not exist. Installing it now.
NAME: kps
LAST DEPLOYED: Sat Jan 17 15:19:24 2026
NAMESPACE: observability
STATUS: deployed
REVISION: 1
NOTES:
kube-prometheus-stack has been installed. Check its status by running:
kubectl --namespace observability get pods -l "release=kps"
Get Grafana 'admin' user password by running:
kubectl --namespace observability get secrets kps-grafana -o jsonpath="{.data.admin-password}" | base64 -d ; echo
Access Grafana local instance:
export POD_NAME=$(kubectl --namespace observability get pod -l "app.kubernetes.io/name=grafana,app.kubernetes.io/instance=kps" -oname)
kubectl --namespace observability port-forward $POD_NAME 3000
Get your grafana admin user password by running:
kubectl get secret --namespace observability -l app.kubernetes.io/component=admin-secret -o jsonpath="{.items[0].data.admin-password}" | base64 --decode ; echo
Visit https://github.com/prometheus-operator/kube-prometheus for instructions on how to create & configure Alertmanager and Prometheus instances using the Operator.
root@kube-01:/opt/k3s_services/supervision# kubectl -n observability get pods -w
NAME READY STATUS RESTARTS AGE
kps-grafana-6797b8c47c-5452v 3/3 Running 0 39s
kps-kube-prometheus-stack-operator-c76c4d9fc-zsl87 1/1 Running 0 39s
kps-kube-state-metrics-579c84f7f8-dvlrm 1/1 Running 0 39s
kps-prometheus-node-exporter-5w6l4 1/1 Running 0 39s
kps-prometheus-node-exporter-brpn8 1/1 Running 0 39s
kps-prometheus-node-exporter-dhvvr 1/1 Running 0 39s
prometheus-kps-kube-prometheus-stack-prometheus-0 2/2 Running 0 33s
root@kube-01:/opt/k3s_services/supervision# kubectl -n observability get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE
kps-grafana Bound pvc-2f93b42c-612f-41ad-af01-05996ba94dd2 5Gi RWO longhorn <unset> 58s
prometheus-kps-kube-prometheus-stack-prometheus-db-prometheus-kps-kube-prometheus-stack-prometheus-0 Bound pvc-12752879-d205-4713-a678-406eebd38521 20Gi RWO longhorn <unset> 50s
root@kube-01:/opt/k3s_services/supervision# vim 03-ingress-grafana.yaml
Contenu :
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: grafana
namespace: observability
spec:
ingressClassName: traefik
rules:
- host: grafana.cluster.labk3s.ev1
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: kps-grafana
port:
number: 80
root@kube-01:/opt/k3s_services/supervision# kubectl apply -f /opt/k3s_services/supervision/03-ingress-grafana.yaml
Résultat :
root@kube-01:/opt/k3s_services/supervision# kubectl -n observability get ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
grafana traefik grafana.cluster.labk3s.ev1 192.168.50.250 80 4s












