Skip to content

đŸ’Č Cloudoff

RĂ©duisez vos coĂ»ts cloud en automatisant l’arrĂȘt et le dĂ©marrage de vos ressources non-utilisĂ©es. Économisez sans effort.

  • Planification intelligente : ArrĂȘt/dĂ©marrage automatique selon des horaires
  • Multi-cloud : Support AWS, GCP, Azure
  • DĂ©tection automatique : Identifie les ressources Ă©ligibles
  • Économies estimĂ©es : Calcul des Ă©conomies potentielles
  • Notifications : Alertes avant arrĂȘt/dĂ©marrage
  • Exceptions : Gestion des ressources critiques
  • Dry-run : Testez sans risque
Terminal window
helm repo add bananaops https://charts.bananaops.tech
helm repo update
helm install cloudoff bananaops/cloudoff --namespace cloudoff --create-namespace
Terminal window
kubectl apply -f https://raw.githubusercontent.com/BananaOps/cloudoff/main/deploy/kubernetes.yaml
values.yaml
replicaCount: 1
image:
repository: bananaops/cloudoff
tag: "latest"
# CronJob pour exécution planifiée
schedule: "0 * * * *" # Toutes les heures
config:
timezone: "Europe/Paris"
# Planification simple
schedules:
weekdays:
stop: "19:00"
start: "08:00"
weekend:
stop: "friday 19:00"
start: "monday 08:00"
# Providers cloud
providers:
aws:
enabled: true
regions:
- eu-west-1
- us-east-1
resources:
ec2:
enabled: true
tags:
- key: "cloudoff:enabled"
value: "true"
rds:
enabled: true
exclude:
- production-db
eks:
enabled: false
gcp:
enabled: false
project: "your-project-id"
azure:
enabled: false
subscriptionId: "your-subscription-id"
# Notifications
notifications:
slack:
enabled: true
webhook: ${SLACK_WEBHOOK}
channel: "#cloudoff"
email:
enabled: true
recipients:
- ops@example.com
dryRun: false
# Credentials cloud via secrets
cloudCredentials:
aws:
existingSecret: aws-credentials
accessKeyIdKey: access-key-id
secretAccessKeyKey: secret-access-key
gcp:
existingSecret: gcp-credentials
serviceAccountKey: service-account.json
azure:
existingSecret: azure-credentials
clientIdKey: client-id
clientSecretKey: client-secret
tenantIdKey: tenant-id
resources:
limits:
cpu: 500m
memory: 512Mi
requests:
cpu: 250m
memory: 256Mi
Terminal window
kubectl create secret generic aws-credentials \
--from-literal=access-key-id=YOUR_ACCESS_KEY \
--from-literal=secret-access-key=YOUR_SECRET_KEY \
--namespace cloudoff
Terminal window
kubectl create secret generic gcp-credentials \
--from-file=service-account.json=./gcp-sa.json \
--namespace cloudoff
Terminal window
kubectl create secret generic azure-credentials \
--from-literal=client-id=YOUR_CLIENT_ID \
--from-literal=client-secret=YOUR_CLIENT_SECRET \
--from-literal=tenant-id=YOUR_TENANT_ID \
--namespace cloudoff
Terminal window
# Voir les logs du CronJob
kubectl logs -n cloudoff -l app=cloudoff
# Déclencher manuellement un job
kubectl create job --from=cronjob/cloudoff cloudoff-manual -n cloudoff
# Voir les ressources gérées
kubectl get configmap cloudoff-state -n cloudoff -o yaml

Cloudoff expose un dashboard web pour visualiser les économies :

Terminal window
# Port-forward vers le dashboard
kubectl port-forward -n cloudoff svc/cloudoff-dashboard 8080:80
# Accéder au dashboard
open http://localhost:8080
  1. Configuration

    values.yaml
    config:
    schedules:
    weekdays:
    stop: "19:00"
    start: "08:00"
    weekend: "off"
    providers:
    aws:
    resources:
    ec2:
    tags:
    - key: "Environment"
    value: "dev"
  2. Déploiement

    Terminal window
    helm install cloudoff bananaops/cloudoff \
    --values values.yaml \
    --namespace cloudoff
  3. Économies

    • 13h/jour en semaine (19h-8h)
    • 48h le weekend
    • Total : 113h/semaine (67% du temps)
  4. Résultat

    Économies de ~67% sur ces ressources 💰

Cloudoff peut gérer les node pools Kubernetes :

config:
providers:
aws:
resources:
eks:
enabled: true
nodeGroups:
- name: dev-workers
minSize: 0
schedule:
weekdays:
stop: "19:00" # Scale to 0
start: "08:00" # Restore original size
  • EC2 Instances
  • RDS Databases
  • ECS Services
  • Auto Scaling Groups
  • ElastiCache
  • Redshift Clusters
  • Compute Engine Instances
  • Cloud SQL
  • GKE Node Pools
  • Cloud Composer
  • Virtual Machines
  • SQL Databases
  • AKS Node Pools
  • App Services
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: cloudoff
rules:
- apiGroups: [""]
resources: ["configmaps", "secrets"]
verbs: ["get", "list", "create", "update"]

Permissions Minimales

Cloudoff utilise le principe du moindre privilĂšge :

  • Lecture des ressources
  • Start/Stop uniquement
  • Pas de suppression
  • Pas de modification

AWS IAM Policy :

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:DescribeInstances",
"ec2:StartInstances",
"ec2:StopInstances",
"rds:DescribeDBInstances",
"rds:StartDBInstance",
"rds:StopDBInstance"
],
"Resource": "*",
"Condition": {
"StringEquals": {
"aws:ResourceTag/cloudoff:enabled": "true"
}
}
}
]
}

Cloudoff expose des métriques Prometheus :

# ServiceMonitor pour Prometheus Operator
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: cloudoff
namespace: cloudoff
spec:
selector:
matchLabels:
app: cloudoff
endpoints:
- port: metrics
interval: 30s
Terminal window
# Importer le dashboard Cloudoff
kubectl apply -f https://raw.githubusercontent.com/BananaOps/cloudoff/main/grafana/dashboard.json