Kube-green est un opérateur GreenOps pour réduire l’empreinte CO2 d’un cluster Kubernetes.

Le GreenOps est la pratique consistant à minimiser l’empreinte carbone d’un environnement cloud grâce à l’utilisation efficace des ressources deployées sur cet environnement.
Forrester - GreenOps, FinOps, And The Sustainable Cloud

Kube-green permet de programmer l’extinction automatique d’applications sur certaines plages horaires. Cela peut être utile pour décharger le cluster de certaines applications qui ne sont utilisées qu’en journée par exemple, ou certains jours de la semaine uniquement. Couplé au fonctionnalités Descheduler et Cluster Autoscaling il devient possible d’ajuster le nombre de noeuds sur le cluster à la baisse ce qui en plus d’éviter de gâcher inutilement des ressources peut faire économiser jusqu’à 40% de la facture sur un cluster managé sur GCP ou AWS.

Kube-green permet de définir des heures de fonctionnement pour les pods d’un namespace donné. Ceci se déclare très simplement à l’aide d’une ressource de type SleepInfo comme dans l’exemple ci-dessous :

apiVersion: kube-green.com/v1alpha1
kind: SleepInfo
metadata:
  name: working-hours
  namespace: dev
spec:
  weekdays: "1-5"
  sleepAt: "19:00"
  wakeUpAt: "09:00"
  timeZone: "Europe/Paris"

Ici on indique que les pods du namespace dev seront actifs du lundi au vendredi entre 9h et 19h. En dehors de cette plage les pods seront automatiquement “éteints” par Kube-green.

Pour “éteindre” les pods, Kube-green passe simplement le nombre de réplicas des déploiements à zéro. Et pour les rallumer, il rétablit la valeur initiale.

A ce jour Kube-green est capable de gérer les pods managés par :

  • un Deployment
  • un CronJob

Si besoin Kube-green permet de définir une liste d’exclusion pour les applications qui doivent rester actives en dehors de la plage de fonctionnement.

Installation de Kube-green

L’installation de Kube-green n’est pas aussi rapide que l’exemple fourni sur la page d’installation officielle. Kube-green nécessite en effet un certificat TLS pour pouvoir démarrer, et cette partie n’est pas détaillée de façon très explicite dans la documentation du produit.

Il faut donc commencer par déployer cert-manager sur le cluster :

kubectl apply -f https://github.com/jetstack/cert-manager/releases/latest/download/cert-manager.yaml

Une fois que cert-manager est déployé, nous allons donc appliquer sur le cluster les ressources nécessaires pour créer :

  • un Issuer pour Kube-green,
  • un Certificate signé par l’issuer pour le service Green-kube.

Ces ressources sont à déployer dans le namespace kube-green qui est le namespace dans lequel Kube-green sera déployé :

kubectl create namespace kube-green

certs/kube-green-selfsigned-issuer.issuer.yaml

apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
  name: kube-green-selfsigned-issuer # Do no change this, the name is targeted by kube-green
  namespace: kube-green
spec:
  selfSigned: {}

certs/kube-green-serving-cert.certificate.yaml

apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: kube-green-serving-cert # Do no change this, the name is targeted by kube-green
  namespace: kube-green
spec:
  usages:
    - server auth
    - client auth
  dnsNames:
    - "kube-green-webhook-service"
    - "kube-green-webhook-service.kube-green"
    - "kube-green-webhook-service.kube-green.svc"
    - "kube-green-webhook-service.kube-green.svc.cluster.local"
  secretName: webhook-server-cert
  issuerRef:
    name: kube-green-selfsigned-issuer

On applique l’ensemble des fichiers sur le cluster :

kubectl apply -f certs/

Puis on déploie Kube-Green :

kubectl apply -f https://github.com/kube-green/kube-green/releases/latest/download/kube-green.yaml

Pour vérifier que l’installation est réalisée avec succès on peut consulter les logs de Kube-green

kubectl -n kube-green logs deployments/kube-green-controller-manager

Définition de la plage autorisée pour les applications

Il ne reste plus qu’à provisionner la ressource SleepInfo déjà présentée en introduction de l’article :

working-hours.sleepinfo.yaml

apiVersion: kube-green.com/v1alpha1
kind: SleepInfo
metadata:
  name: working-hours
  namespace: dev
spec:
  weekdays: "1-5"
  sleepAt: "19:00"
  wakeUpAt: "09:00"
  timeZone: "Europe/Paris"
kubectl apply -f working-hours.sleepinfo.yaml

Avec cette configuration les Deployments du namespace dev verront leur nombre de réplicas “magiquement” réduits à zéro les jours de semaine entre 19h et 9h le lendemain, mais aussi durant le week-end.

Youpi !