Permissions Minimales
Cloudoff utilise le principe du moindre privilĂšge :
- Lecture des ressources
- Start/Stop uniquement
- Pas de suppression
- Pas de modification
RĂ©duisez vos coĂ»ts cloud en automatisant lâarrĂȘt et le dĂ©marrage de vos ressources non-utilisĂ©es. Ăconomisez sans effort.
helm repo add bananaops https://charts.bananaops.techhelm repo updatehelm install cloudoff bananaops/cloudoff --namespace cloudoff --create-namespacekubectl apply -f https://raw.githubusercontent.com/BananaOps/cloudoff/main/deploy/kubernetes.yamlreplicaCount: 1
image: repository: bananaops/cloudoff tag: "latest"
# CronJob pour exécution planifiéeschedule: "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 secretscloudCredentials: 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: 256Mikubectl create secret generic aws-credentials \ --from-literal=access-key-id=YOUR_ACCESS_KEY \ --from-literal=secret-access-key=YOUR_SECRET_KEY \ --namespace cloudoffkubectl create secret generic gcp-credentials \ --from-file=service-account.json=./gcp-sa.json \ --namespace cloudoffkubectl 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# Voir les logs du CronJobkubectl logs -n cloudoff -l app=cloudoff
# Déclencher manuellement un jobkubectl create job --from=cronjob/cloudoff cloudoff-manual -n cloudoff
# Voir les ressources géréeskubectl get configmap cloudoff-state -n cloudoff -o yamlCloudoff expose un dashboard web pour visualiser les économies :
# Port-forward vers le dashboardkubectl port-forward -n cloudoff svc/cloudoff-dashboard 8080:80
# Accéder au dashboardopen http://localhost:8080Configuration
config: schedules: weekdays: stop: "19:00" start: "08:00" weekend: "off"
providers: aws: resources: ec2: tags: - key: "Environment" value: "dev"Déploiement
helm install cloudoff bananaops/cloudoff \ --values values.yaml \ --namespace cloudoffĂconomies
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 sizeapiVersion: rbac.authorization.k8s.io/v1kind: ClusterRolemetadata: name: cloudoffrules: - apiGroups: [""] resources: ["configmaps", "secrets"] verbs: ["get", "list", "create", "update"]Permissions Minimales
Cloudoff utilise le principe du moindre privilĂšge :
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 OperatorapiVersion: monitoring.coreos.com/v1kind: ServiceMonitormetadata: name: cloudoff namespace: cloudoffspec: selector: matchLabels: app: cloudoff endpoints: - port: metrics interval: 30s# Importer le dashboard Cloudoffkubectl apply -f https://raw.githubusercontent.com/BananaOps/cloudoff/main/grafana/dashboard.json