Questo progetto implementa un sistema di raccomandazione content-based di film su GCP (Google Cloud Platform), utilizzando Kubernetes (GKE) per l'orchestrazione dei container, Terraform per il provisioning dell'infrastruttura e Argo Workflows per la gestione di job sequenziali.
.
βββ .github/workflows # Workflow CI/CD
β βββ deploy-application.yml # Workflow per il deployment dei servizi API e UI
β βββ deploy-configuration.yml # Workflow per il deployment dei servizi Preprocessing e Recommender (ArgoWorkflow)
β βββ infra.yml # Workflow per il provisioning dell'infrastruttura
βββ api_service # Servizio API FastAPI
βββ preprocessing_service # Servizio di preprocessing dati
βββ recommender_service # Servizio di calcolo similaritΓ
βββ ui_service # Interfaccia utente Streamlit
βββ k8s-gke # Configurazioni Kubernetes
β βββ argoWorkflow # Definizioni workflow Argo
β βββ deployment # Manifesti Kubernetes per i servizi
βββ terraform-gcp # Configurazione Terraform per GCP
βββ .env # Variabili d'ambiente
βββ .gitignore
- Account Google Cloud con fatturazione abilitata
- Progetto GCP creato
- Service Account con i permessi necessari
- Account Terraform Cloud (per la gestione dell'infrastruttura)
- Repository GitHub per utilizzare GitHub Actions
- Opzionale per test locale:
- Docker installato localmente
- Google Cloud CLI e i suoi plugin installati localmente:
gke-gcloud-auth-plugingcloud components install kubectl
- Terraform installato localmente
Crea o modifica il file .env nella root del progetto (se non Γ¨ presente):
# API
API_URL=http://api-service.deployment.svc.cluster.local:8000/recommend
# Bucket
GCS_BUCKET_NAME= ADD_BUCKET_NAME_HERE (Il nome del GCS_BUCKET_NAME deve essere uguale a quello salvato sui secret di github)
# Percorsi nel bucket
GCS_RAW_MOVIES_BLOB=raw/tmdb_5000_movies.csv
GCS_RAW_CREDITS_BLOB=raw/tmdb_5000_credits.csv
GCS_PROCESSED_BLOB=processed/recsys_df.csv
GCS_MODEL_BLOB=model/similarity.pkl.gzConfigura i seguenti segreti nel tuo repository GitHub:
GCP_PROJECT_ID: ID del tuo progetto GCPGCP_REGION: Regione GCP (es. europe-west1)GCP_ZONE: Zona GCP (es. europe-west1-b)GCP_BUCKET_NAME: Nome del bucket GCSGCP_SA_KEY: JSON della chiave del service account (base64 encoded)ARTIFACT_REPOSITORY: Nome del repository Artifact RegistryGCP_GKE_CLUSTER_NAME: Nome del cluster GKETFC_TOKEN: Token di accesso Terraform CloudDOCKER_EMAIL: Indirizzo email personale utilizzato per l'autenticazione su DockerENV_FILE: Environment file.env
-
Crea un service account con i seguenti ruoli:
- Artifact Registry Administrator
- Compute Security Admin
- Compute Network Admin
- Service Usage Admin
- Service Account User
- Storage Admin
- Kubernetes Engine Admin
-
Crea e scarica una chiave JSON e salvala come
gcs-key.jsonnella root del progetto.
Per utilizzare Terraform Cloud come backend remoto, si segui questi passaggi:
- Crea un'organizzazione su Terraform Cloud
- All'interno dell'organizzazione, crea un workspace dedicato al progetto
- Configura il backend remoto nel file
provider.tf, situato nella directoryterraform-gcp, con il seguente blocco:
terraform {
backend "remote" {
hostname = "app.terraform.io"
organization = "<ORG_NAME>"
workspaces {
name = "<WORKSPACE_NAME>"
}
}
}sostituisci <ORG_NAME> e <WORKSPACE_NAME> con il nome della tua organizzazione e del workspace configurato su Terraform Cloud.
Il workflow infra.yml viene eseguito automaticamente quando vengono apportate modifiche alla directory terraform-gcp o al workflow stesso. Altrimenti, puΓ² essere eseguito manualmente dall'interfaccia di GitHub Actions.
git add terraform-gcp
git commit -m "Modifiche alla configurazione Terraform"
git push origin mainIl workflow deploy-configuration.yml viene eseguito automaticamente quando vengono apportate modifiche ai servizi preprocessing_service o recommender_service, oppure da una modifica al file di deployment di Kubernetes nella cartella k8s-gke/argoWorkflow. Altrimenti, puΓ² essere eseguito manualmente dall'interfaccia di GitHub Actions.
git add preprocessing_service/ recommender_service/
git commit -m "Aggiornamento dei microservizi"
git push origin mainoppure
git add k8s-gke/argoWorkflow/
git commit -m "Aggiornamento dei file di deployment di k8s su argoworkflow"
git push origin mainIl workflow deploy-application.yml viene eseguito automaticamente quando vengono apportate modifiche ai servizi api_service o ui_service, oppure ai file di deployment nella cartella k8s-gke/deployment. PuΓ² anche essere eseguito manualmente dall'interfaccia di GitHub Actions.
git add api_service/ ui_service/
git commit -m "Aggiornamento dei servizi API e UI"
git push origin mainoppure
git add k8s-gke/deployment/
git commit -m "Aggiornamento dei file di deployment di k8s per API e UI"
git push origin mainDopo aver creato e configurato il cluster GKE, Γ¨ possibile connettersi ad esso tramite la Google Cloud CLI sfruttando la Cloud Shell. Il comando da eseguire Γ¨ il seguente:
gcloud container clusters get-credentials <GCP_GKE_CLUSTER_NAME> \
--zone <GCP_ZONE> \
--project <GCP_PROJECT_ID>Sostituire <GCP_GKE_CLUSTER_NAME>, <GCP_ZONE> e <GCP_PROJECT_ID> con i valori corrispondenti al proprio ambiente.
In alternativa, Γ¨ possibile accedere al cluster tramite l'interfaccia grafica di Google Cloud: selezionare il progetto desiderato, quindi navigare nella sezione Kubernetes Engine β Cluster, da cui Γ¨ possibile visualizzare e gestire il cluster direttamente via UI.
Una volta completato il deployment:
-
Ottieni l'indirizzo IP esterno del servizio UI da configurazione locale (o sfruttando la Cloud Shell offerta come servizio da Google):
kubectl get service ui-service -n deployment
oppure direttamente nella sezione Gateway, servizi e Ingress di GKE
-
Accedi all'interfaccia web tramite browser all'indirizzo
http://<EXTERNAL-IP>:8501- EXTERNAL-IP: corrisponde allβindirizzo IP esterno assegnato dal Load Balancer o da altra configurazione di rete.
-
Seleziona un film e ricevi raccomandazioni!
- Verifica lo stato dei pod:
kubectl get pods -n deployment
- Controlla i log:
kubectl logs deployment/api-deployment -n deployment
- Verifica che i file CSV siano correttamente caricati nel bucket GCS
- Controlla i permessi del service account
- Controlla lo stato del workflow:
argo list -n argo
- Visualizza i dettagli:
argo get <workflow-name> -n argo
- Verifica che il servizio abbia un IP esterno:
kubectl get service ui-service -n deployment
- Controlla i log UI:
kubectl logs deployment/ui-deployment -n deployment
- Verificare che tutti i componenti siano installati correttamente. In particolare, un'installazione non corretta di
kubectlpotrebbe causare errori durante la connessione o l'interazione con il cluster.
| NOME | COGNOME | MATRICOLA |
|---|---|---|
| Giovanni | Salerno | 1000052299 |
Β© 2025 - Sistema di Raccomandazione Film su GCP
