Aller au contenu principal

Windmill sur GKE Autopilot

Windmill sur GKE Autopilot

Windmill est une plateforme de développement open source permettant de créer des outils internes, des scripts, des flux et des automatisations. Ce module déploie Windmill sur GKE Autopilot en s'appuyant sur le socle App_GKE, qui provisionne et gère l'infrastructure Google Cloud et Kubernetes partagée.

Ce guide se concentre sur les services cloud utilisés par Windmill et sur la manière de les explorer et de les exploiter depuis la console Google Cloud et la ligne de commande. Pour les mécanismes communs à toutes les applications GKE — Workload Identity, entrée, mise à l'échelle automatique, CI/CD, Cloud Armor, IAP, Binary Authorization, VPC Service Controls, sauvegardes et cycle de vie du déploiement — reportez-vous au guide du socle App_GKE plutôt que de les répéter ici.


1. Vue d'ensemble​

Windmill s'exécute sous forme de charge de travail combinée serveur+worker. Le déploiement assemble un ensemble ciblé de services Google Cloud :

FonctionnalitéService Google CloudRemarques
CalculGKE AutopilotPods combinés serveur+worker, 2 vCPU / 2 GiB par défaut, mise à l'échelle automatique horizontale
Base de donnéesCloud SQL for PostgreSQL 16Obligatoire — Windmill nécessite PostgreSQL 16 ou une version ultérieure
Stockage d'objetsCloud StorageUn bucket data (gcs-<app><tenant-prefix>-data) pour les sorties de workflows et les artefacts
SecretsSecret ManagerMot de passe de la base de données généré automatiquement et secret SMTP provisoire
EntréeCloud Load BalancingLoadBalancer externe, domaine personnalisé + certificat géré en option

Valeurs par défaut judicieuses à connaître d'emblée :

  • PostgreSQL 16 est obligatoire. Windmill utilise des fonctionnalités propres à PostgreSQL ; le moteur de base de données est fixe. Sélectionner une version plus ancienne ou NONE fait échouer le job d'initialisation.
  • Mode combiné serveur+worker. MODE=server,worker et NUM_WORKERS=3 exécutent le serveur d'API et les workers d'exécution de scripts dans le même pod. Pour une mise à l'échelle indépendante des workers, définissez des Deployments Kubernetes supplémentaires via additional_services.
  • DISABLE_NSJAIL=true est injecté automatiquement. GKE Autopilot n'accorde ni CAP_SYS_ADMIN ni les espaces de noms utilisateur ; l'isolation par espaces de noms Linux de Windmill est donc désactivée.
  • Redis est désactivé par défaut. Windmill fonctionne sans Redis pour les déploiements à un seul réplica. Activez Redis pour un comportement de file d'attente distribuée avec plusieurs réplicas.
  • session_affinity vaut None. L'API de Windmill est sans état et utilise une authentification par cookie ; un routage persistant n'est donc pas nécessaire.
  • Les sondes de santé ciblent /api/version. Ce point de terminaison léger renvoie la chaîne de version de Windmill lorsque le service est prêt — aucun délai de migration au démarrage n'est nécessaire.
  • Un secret SMTP provisoire est provisionné automatiquement. Remplacez la valeur {prefix}-smtp-password dans Secret Manager avant d'activer les notifications par e-mail.

2. Services Google Cloud et comment les explorer​

Toutes les commandes supposent que vous avez exécuté gcloud container clusters get-credentials <cluster> --region <region> --project <project> et que PROJECT, REGION et NAMESPACE sont définis. L'espace de noms et les autres identifiants figurent dans les Sorties du déploiement.

A. GKE Autopilot — la charge de travail Windmill​

Les pods Windmill sont planifiés sur Autopilot, qui facture le CPU et la mémoire effectivement demandés par les pods. Le Horizontal Pod Autoscaling dimensionne le déploiement entre le nombre minimal et le nombre maximal de réplicas. Le type de charge de travail par défaut est Deployment ; définissez stateful_pvc_enabled = true pour sélectionner automatiquement StatefulSet avec des volumes persistants par pod.

  • Console : Kubernetes Engine → Workloads → sélectionnez la charge de travail Windmill pour consulter les pods, les révisions et les événements. Kubernetes Engine → Services & Ingress affiche l'IP externe.
  • CLI :
    kubectl get pods,svc,hpa -n "$NAMESPACE"
    kubectl logs -n "$NAMESPACE" deploy/<service-name> --tail=100
    kubectl describe hpa -n "$NAMESPACE" # current vs target utilisation

Consultez App_GKE pour la gestion d'Autopilot, de la mise à l'échelle et du type de charge de travail (Deployment ou StatefulSet).

B. Cloud SQL for PostgreSQL 16​

Windmill stocke toutes les données applicatives — scripts, flux, variables, ressources, planifications et historique des jobs — dans une instance gérée Cloud SQL for PostgreSQL 16. Les pods s'y connectent de manière privée via le sidecar Cloud SQL Auth Proxy sur un socket Unix ; aucune IP publique n'est exposée. Lors du premier déploiement, un job d'initialisation crée de manière idempotente la base de données et l'utilisateur de l'application.

  • Console : SQL → sélectionnez l'instance pour consulter les connexions, les sauvegardes, les flags et les métriques.
  • CLI :
    gcloud sql instances list --project "$PROJECT"
    gcloud sql instances describe <instance-name> --project "$PROJECT"
    # Open an interactive shell to inspect schema/data:
    gcloud sql connect <instance-name> --user=<db-user> --project "$PROJECT"

Le nom de l'instance, le nom de la base de données, l'utilisateur et le secret Secret Manager contenant le mot de passe figurent tous dans les Sorties. Pour le modèle de connexion, les sauvegardes automatiques et la rotation des mots de passe, consultez App_GKE.

C. Cloud Storage​

Un bucket Cloud Storage dédié (suffixe de nom data, c'est-à-dire gcs-<app><tenant-prefix>-data) est provisionné pour les sorties de workflows, les artefacts et les dépendances des scripts. L'accès est accordé automatiquement au compte de service de la charge de travail.

  • Console : Cloud Storage → Buckets.
  • CLI :
    gcloud storage buckets list --project "$PROJECT"
    gcloud storage ls gs://<data-bucket>/ # bucket name is in the Outputs

Consultez App_GKE pour les options de buckets supplémentaires, les montages GCS Fuse et CMEK.

D. Secret Manager​

Le mot de passe de la base de données et le mot de passe SMTP provisoire sont stockés en tant que secrets Secret Manager et injectés dans les pods à l'exécution ; le texte en clair n'apparaît jamais dans la configuration.

  • Console : Security → Secret Manager.
  • CLI :
    gcloud secrets list --project "$PROJECT"
    gcloud secrets versions access latest --secret=<secret-name> --project "$PROJECT"
    # Replace the SMTP placeholder before enabling email features:
    echo -n "your-smtp-password" | gcloud secrets versions add \
    <smtp-secret-name> --data-file=- --project "$PROJECT"

Le nom du secret du mot de passe de la base de données figure dans les Sorties. Consultez App_GKE pour l'intégration Secret Store CSI et la rotation.

E. Réseau et entrée​

Par défaut, la charge de travail est exposée via une IP Cloud Load Balancing externe. Un domaine personnalisé avec un certificat géré par Google peut être activé, et une IP statique peut être réservée afin que l'adresse survive aux redéploiements.

  • Console : Network services → Load balancing ; VPC network → IP addresses.
  • CLI :
    kubectl get ingress,svc -n "$NAMESPACE"
    gcloud compute addresses list --project "$PROJECT"

Consultez App_GKE pour les détails sur les domaines personnalisés, Cloud CDN et les IP statiques.

F. Cloud Logging et Monitoring​

Les sorties stdout/stderr des pods sont envoyées à Cloud Logging au format JSON structuré (JSON_FMT=true). Les métriques GKE et Cloud SQL sont envoyées à Cloud Monitoring. Un point de terminaison de métriques Prometheus est exposé sur :9001 pour une collecte au sein du VPC.

  • Console : Logging → Logs Explorer ; Monitoring → Dashboards / Alerting.
  • CLI :
    gcloud logging read 'resource.type="k8s_container" AND resource.labels.namespace_name="'"$NAMESPACE"'"' \
    --project "$PROJECT" --limit 50

3. Comportement de l'application Windmill​

  • Configuration de la base de données au premier déploiement. Un job d'initialisation (db-init) s'exécute au premier déploiement avec postgres:16-alpine. Il crée de manière idempotente les rôles windmill_admin et windmill_user, l'utilisateur de l'application et la base de données de l'application, puis accorde tous les privilèges. Le job peut être relancé sans risque.
  • Migrations de schéma automatiques. Windmill exécute ses propres migrations de base de données au démarrage ; la mise à niveau de application_version applique donc automatiquement les modifications de schéma.
  • Mode combiné serveur+worker. Chaque pod exécute à la fois l'API/le planificateur Windmill et NUM_WORKERS=3 workers d'exécution de scripts. Les workers exécutent des scripts Python, TypeScript, Bash, Go et SQL dans des sous-processus isolés. L'affectation WORKER_GROUP=default signifie que tous les flux et scripts sont acheminés par défaut vers ces pods.
  • BASE_URL et BASE_INTERNAL_URL. Le shim entrypoint.sh construit DATABASE_URL au démarrage à partir des variables DB_* injectées par la plateforme. Lorsque GKE_SERVICE_URL est défini (injecté par App_GKE une fois l'IP du LoadBalancer allouée), BASE_URL est mise à jour automatiquement afin que les callbacks OAuth et les URL de webhook soient résolus correctement.
  • Métriques Prometheus. METRICS_ADDR=:9001 expose les métriques Windmill sur http://<pod-ip>:9001/metrics pour une collecte depuis le cluster.
  • Chemin de santé. Les sondes de démarrage et d'activité utilisent toutes deux GET /api/version. Ce point de terminaison renvoie HTTP 200 avec la chaîne de version lorsque Windmill est prêt à servir du trafic.
  • Notifications par e-mail SMTP. Le secret WINDMILL_SMTP_PASS est initialisé avec une valeur provisoire de 16 caractères. Remplacez-la et fournissez WINDMILL_SMTP_HOST, WINDMILL_SMTP_PORT et WINDMILL_SMTP_FROM via environment_variables pour activer les notifications par e-mail depuis les flux et les scripts.
  • Inspecter les flux planifiés et les jobs :
    kubectl get cronjobs -n "$NAMESPACE"
    kubectl get jobs -n "$NAMESPACE" --sort-by=.metadata.creationTimestamp

4. Variables de configuration​

Les variables sont regroupées exactement comme elles apparaissent sur la plateforme de déploiement. Seuls les paramètres propres à Windmill ou notables pour celui-ci sont listés ; toutes les autres entrées sont héritées d'App_GKE avec leur comportement et leurs valeurs par défaut standard.

Groupe 1 — Projet et identité​

VariableValeur par défautDescription
project_id(obligatoire)Projet Google Cloud cible.
regionus-central1Région de la charge de travail et des ressources régionales.

Groupe 2 — Environnement de déploiement​

VariableValeur par défautDescription
tenant_iddemoSuffixe court qui rend les noms de ressources uniques par environnement.
support_users[]Adresses e-mail auxquelles sont accordés l'accès au projet et les alertes de surveillance.
resource_labels{}Libellés appliqués à toutes les ressources pour le suivi des coûts et de la propriété.

Groupe 3 — Identité de l'application​

VariableValeur par défautDescription
application_namewindmillNom de base des ressources. Ne le modifiez pas après le premier déploiement.
application_display_nameWindmillNom convivial affiché dans la console.
application_description(défini)Annotation de description de la charge de travail.
application_versionlatestTag de version de l'image Windmill ; définissez une version précise (par ex. 1.400.0) pour la production.

Groupe 4 — Exécution et mise à l'échelle​

VariableValeur par défautDescription
deploy_applicationtrueDéfinissez false pour provisionner uniquement l'infrastructure.
container_image_sourcecustomcustom construit l'image avec le Dockerfile fourni ; prebuilt déploie une URI d'image existante.
container_image""URI d'image de remplacement. Laissez vide pour que Cloud Build la gère.
cpu_limit2000mCPU par pod. 2 vCPU est le minimum recommandé pour le mode combiné serveur+worker.
memory_limit2GiMémoire par pod. 4 GiB recommandés pour les charges de travail Python/TypeScript en production.
min_instance_count1Nombre minimal de réplicas. Gardez ≥ 1 pour que les webhooks et les flux planifiés disposent d'un pod sur lequel s'exécuter.
max_instance_count3Nombre maximal de réplicas (plafond de l'autoscaler).
container_port8000Windmill écoute sur le port 8000.
enable_cloudsql_volumetrueSidecar Cloud SQL Auth Proxy — requis pour la connexion par socket Unix.
enable_image_mirroringtrueMet en miroir l'image Windmill dans Artifact Registry pour éviter les limites de débit de ghcr.io.
enable_vertical_pod_autoscalingfalseLaisse Autopilot ajuster automatiquement les demandes de ressources.
termination_grace_period_seconds60Secondes d'attente après SIGTERM ; augmentez cette valeur pour laisser les jobs en cours se terminer proprement.

Groupe 5 — Variables d'environnement et secrets​

VariableValeur par défautDescription
environment_variables{}Paramètres non secrets supplémentaires fusionnés avec les valeurs par défaut de Windmill. Permet de définir WINDMILL_SMTP_HOST, des remplacements de NUM_WORKERS, etc.
secret_environment_variables{}Correspondance variable d'environnement → nom de secret Secret Manager. WINDMILL_SMTP_PASS est injecté automatiquement.

Groupe 6 — Backend GKE et cluster​

VariableValeur par défautDescription
service_typeLoadBalancerMode d'exposition du Service.
session_affinityNoneL'API de Windmill est sans état ; un routage persistant n'est pas nécessaire.
workload_typenullSe résout automatiquement en StatefulSet lorsque stateful_pvc_enabled = true.
network_tags['nfsserver']Tags de nœuds/pods pour les règles de pare-feu.
gke_cluster_name""Cluster GKE à utiliser. Laissez vide pour la découverte automatique.
namespace_name""Espace de noms Kubernetes. Laissez vide pour le générer automatiquement.

Groupe 7 — StatefulSet​

VariableValeur par défautDescription
stateful_pvc_enablednullActive les modèles de PVC dans un StatefulSet. La valeur true sélectionne automatiquement StatefulSet.
stateful_pvc_size10GiTaille de stockage par PVC.
stateful_pvc_mount_path/dataChemin du conteneur où le PVC est monté.
stateful_pvc_storage_classstandard-rwoStorageClass Kubernetes pour les PVC.

Groupe 9 — Règles de fiabilité​

VariableValeur par défautDescription
enable_pod_disruption_budgetfalseProtège la disponibilité lors des mises à niveau des nœuds.
pdb_min_available1Nombre minimal de pods disponibles pendant les perturbations.

Groupe 10 — Observabilité et santé​

VariableValeur par défautDescription
startup_probe_config/api/version, période de 10s, 10 échecsSonde HTTP sur le point de terminaison de version de Windmill.
health_check_config/api/version, période de 30s, 3 échecsSonde de vivacité.
uptime_check_configdésactivéVérification de disponibilité Cloud Monitoring facultative.
alert_policies[]Règles d'alerte sur les métriques facultatives.

Groupe 11 — Jobs et tâches planifiées​

VariableValeur par défautDescription
initialization_jobs[]Laissez vide pour utiliser le job PostgreSQL db-init intégré.
cron_jobs[]CronJobs Kubernetes récurrents pour des tâches de maintenance ou d'intégration.
additional_services[]Deployments sidecar ou auxiliaires aux côtés de Windmill (par ex. des pools de workers dédiés).

Groupe 12 — CI/CD et intégration GitHub​

Intégration standard Cloud Build / Cloud Deploy d'App_GKE — voir App_GKE. Entrées clés : enable_cicd_trigger, github_repository_url, github_token, enable_cloud_deploy, enable_binary_authorization.

Groupe 13 — Système de fichiers (NFS)​

VariableValeur par défautDescription
enable_nfsfalseNFS est désactivé par défaut — Windmill ne nécessite pas de stockage de fichiers partagé.
nfs_mount_path/mnt/nfsChemin de montage dans le conteneur lorsque NFS est activé.

Groupe 14 — Cloud Storage et Artifact Registry​

VariableValeur par défautDescription
create_cloud_storagetrueProvisionne le bucket data et les éventuels buckets supplémentaires.
storage_buckets[]Buckets GCS supplémentaires au-delà du bucket de données provisionné automatiquement.
gcs_volumes[]Montages GCS Fuse via le pilote CSI.
manage_storage_kms_iam / enable_artifact_registry_cmekfalseOptions CMEK.

Groupe 16 — Backend de base de données​

VariableValeur par défautDescription
database_typePOSTGRES_16Fixe — Windmill nécessite PostgreSQL 16. Ne la modifiez pas.
db_namewindmillNom de la base de données. Immuable après le premier déploiement.
db_userwindmillUtilisateur de l'application. Immuable après le premier déploiement.
database_password_length32Longueur du mot de passe généré (16–64).
enable_auto_password_rotationfalseRotation du mot de passe de la base de données sans interruption de service.
rotation_propagation_delay_sec90Secondes d'attente après la rotation avant le redémarrage des pods.

Groupe 17 — Sauvegarde et maintenance​

VariableValeur par défautDescription
backup_schedule0 2 * * *Cron de sauvegarde automatique (UTC).
backup_retention_days7Durée de conservation ; passez-la à 30–90 pour la production ou la conformité.
enable_backup_import / backup_source / backup_uri / backup_formatoptions de restaurationRestaure à partir d'une sauvegarde lors du déploiement.

Groupe 18 — Scripts SQL personnalisés​

enable_custom_sql_scripts, custom_sql_scripts_bucket, custom_sql_scripts_path, custom_sql_scripts_use_root — exécutent du SQL depuis un bucket GCS après le provisionnement. Voir App_GKE.

Groupe 19 — Domaine personnalisé, IP statique et réseau​

VariableValeur par défautDescription
enable_custom_domaintrueProvisionne un Ingress pour les noms d'hôte personnalisés + un certificat géré.
application_domains[]Noms d'hôte à servir.
reserve_static_iptrueIP externe stable d'un redéploiement à l'autre.
network_tags['nfsserver']Tags de nœuds/pods GKE pour les règles de pare-feu.

Groupe 20 — Identity-Aware Proxy (IAP)​

VariableValeur par défautDescription
enable_iapfalseExige une connexion Google devant Windmill.
iap_authorized_users / iap_authorized_groups[]Personnes autorisées à accéder.
iap_oauth_client_id / iap_oauth_client_secret""Requis lorsque IAP est activé (sensible).

Groupe 21 — Cloud Armor et Redis​

VariableValeur par défautDescription
enable_cloud_armorfalseAssocie une règle Cloud Armor (WAF) au backend de l'Ingress.
admin_ip_ranges[]CIDR autorisés pour l'accès privilégié.
enable_redisfalseActive Redis pour un comportement de file d'attente distribuée (facultatif).
redis_host""Point de terminaison Redis. Laissez vide et activez NFS pour la découverte automatique.
redis_port6379Port Redis.
redis_auth""Mot de passe d'authentification Redis facultatif (sensible).

Groupe 22 — VPC Service Controls et journalisation d'audit​

VariableValeur par défautDescription
enable_vpc_scfalseApplique un périmètre VPC-SC (nécessite organization_id).
vpc_cidr_ranges / vpc_sc_dry_run(défini)CIDR du niveau d'accès / mode simulation (dry-run).
enable_audit_loggingfalseJournaux Cloud Audit Logs détaillés.

5. Sorties​

Ces valeurs sont renvoyées lors d'un déploiement réussi et constituent le moyen le plus rapide de localiser et d'explorer les ressources en cours d'exécution.

SortieDescription
service_nameNom du Service Kubernetes.
namespaceEspace de noms dans lequel s'exécute la charge de travail.
service_cluster_ipClusterIP interne au cluster.
stage_service_cluster_ipsCorrespondance des ClusterIP des services propres à chaque étape (Cloud Deploy).
service_external_ipIP externe du LoadBalancer (lorsqu'une IP statique est réservée).
service_urlURL permettant d'atteindre Windmill.
database_instance_nameNom de l'instance Cloud SQL.
database_nameNom de la base de données de l'application.
database_userUtilisateur de la base de données de l'application.
database_password_secretSecret Secret Manager contenant le mot de passe de la base de données.
database_host / database_portPoint de terminaison de la base de données (127.0.0.1 via l'Auth Proxy) / port.
storage_bucketsBuckets Cloud Storage créés.
network_name / network_exists / regionsRéseau VPC, présence, régions disponibles.
container_image / container_registryImage déployée et dépôt Artifact Registry.
monitoring_enabled / monitoring_notification_channelsÉtat de la surveillance et canaux.
initialization_jobs / db_import_jobNoms des jobs de configuration et d'import (facultatif).
deployment_id / tenant_id / resource_prefixIdentifiants de nommage.
project_id / project_numberIdentifiants du projet.
cicd_enabled / github_repository_url / github_repository_owner / github_repository_name / cicd_configurationÉtat et détails du CI/CD.
artifact_registry_repository / cloudbuild_trigger_name / cloudbuild_trigger_idRegistre et déclencheur de build.
kubernetes_readyIndique si le cluster et la charge de travail sont prêts. false lors du premier apply d'un nouveau cluster intégré ; relancez l'apply pour terminer.
vpc_sc_enabled / vpc_sc_perimeter_name / vpc_sc_dry_run_modeÉtat de VPC-SC.
audit_logging_enabled / artifact_registry_cmek_enabledÉtat de la journalisation d'audit et de CMEK.

6. Pièges de configuration et valeurs par défaut judicieuses​

Risque : Critique (perte de données / panne / sécurité) — Élevé (service dégradé) — Moyen (coût ou dégradation partielle) — Faible (mineur).

ParamètreValeur judicieuseRisqueConséquence en cas d'erreur
database_typePOSTGRES_16CritiqueWindmill nécessite PostgreSQL 16 ; une version plus ancienne fait échouer le job d'initialisation et la base de données reste non initialisée.
db_name / db_userdéfini une foisCritiqueImmuables après le premier déploiement ; les renommer recrée la base de données et l'utilisateur et détruit tous les scripts, flux et l'historique des jobs.
enable_cloudsql_volumetrueCritiqueWindmill se connecte via le socket Unix de l'Auth Proxy ; le désactiver provoque une défaillance immédiate de la base de données et un CrashLoopBackOff.
enable_backup_importfalse sauf en cas de restaurationCritiqueL'activer sans backup_uri valide fait échouer le job d'import.
quota_memory_requests / _limitsunités binairesCritiqueLes entiers nus sont interprétés comme des octets et bloquent toute planification.
cpu_limit2000mÉlevéLe mode combiné exécute 3 workers dans le processus ; un CPU insuffisant ralentit toute l'exécution des scripts. Chaque worker nécessite environ 500m.
memory_limit2GiÉlevéLes workers Windmill exécutent des scripts utilisateur arbitraires ; les arrêts pour manque de mémoire (OOM) en cours d'exécution produisent des échecs silencieux dans l'interface.
min_instance_count1Élevé0 permet la mise à l'échelle à zéro ; les flux planifiés seront manqués et les webhooks renverront 503 jusqu'à ce qu'un pod soit prêt.
service_url / BASE_URLIP de l'équilibreur de charge ou domaine personnaliséÉlevéUne valeur vide ou incorrecte casse les callbacks OAuth, les points de terminaison de webhook et les liens profonds de l'interface Windmill.
enable_redisfalse pour un seul réplica, true pour plusieursMoyenSans Redis, chaque pod ne traite que sa propre file d'attente locale ; avec plusieurs réplicas, cela provoque un routage des jobs imprévisible.
pdb_min_available vs min_instance_countlaisser de la margeMoyen1/1 peut bloquer les mises à niveau des nœuds (un pod unique ne peut pas être évincé).
backup_schedule0 2 * * *MoyenUne chaîne vide désactive les sauvegardes ; Windmill stocke toutes les définitions d'automatisation dans PostgreSQL.
enable_iap / enable_cloud_armorà activer en productionMoyenSans ces options, l'interface et l'API Windmill sont accessibles publiquement.
WINDMILL_SMTP_* (via les variables d'environnement)tous les champs définis ensembleMoyenUne configuration SMTP partielle provoque des échecs silencieux de remise des e-mails, sans erreur à l'exécution.
enable_auto_password_rotationfalseMoyenLorsqu'elle est activée, les pods doivent être redémarrés après la rotation ; sinon ils utilisent un mot de passe expiré jusqu'à ce que les connexions échouent.
enable_vpc_scfalse sauf si nécessaireÉlevéNécessite un organization_id explicite ; sans lui, VPC-SC est ignoré silencieusement, ce qui donne une fausse impression de sécurité périmétrique.

Pour le comportement du socle référencé tout au long de ce guide — IAM et Workload Identity, mise à l'échelle automatique, entrée et certificats, CI/CD, Cloud Armor, IAP, Binary Authorization, VPC-SC, sauvegardes et mise en miroir des images — consultez App_GKE. La configuration applicative propre à Windmill, partagée avec la variante Cloud Run, est décrite dans Windmill_Common.

Need RAD to do something it does not do yet? Request it on the roadmap, or vote on what is already there.