(Guidato) Crea risorse in Aruba ⏱️ 25m
Questo modulo richiede un account Aruba a cui il workshop del tuo istruttore ha accesso. Il percorso solo locale non raggiunge Aruba — puoi leggere il modulo per capire la forma di un provider gestito dalla piattaforma, ma non potrai eseguirlo end-to-end. Vedi Setup locale solo (k3d).
Il DBaaS che crei qui è una vera istanza MySQL Aruba, fatturata a ore sul progetto Aruba del workshop. Cancellala appena finisci il §7.4 — il passo di pulizia in §7.5 non è opzionale.
7.1 Prima di iniziare ⏱️ 3m
Hai installato provider Crossplane sui tuoi account AWS / GCP / Azure. provider-arubacloud è diverso: punta al progetto Aruba condiviso del tuo team di piattaforma con credenziali che gestiscono loro. Non ti registri ad Aruba; non vedi la chiave API; entri e crei risorse.
Questo è il pattern di produzione: il team di piattaforma cura la superficie cloud — un solo account condiviso, una sola credenziale, guardrail opinionati — e gli sviluppatori la consumano senza vedere il segreto. Il tuo team di piattaforma ha rivestito tutto questo con cinque guardrail Kyverno applicati al momento dell'admission:
- Solo i kind
Database,ContainerRegistryeBlockStoragepossono essere creati. - I nomi devono iniziare con
<your-pair-id>-così due coppie che condividono il progetto non collidono. - Engine, flavor, location e dimensione storage del DBaaS sono limitati a un livello dimensionato per il workshop.
- I Pod non possono fare riferimento al Secret delle credenziali Aruba della piattaforma.
- La VPC condivisa del workshop è in sola lettura — il tuo DBaaS si connette al suo interno, ma non puoi cancellarla.
Stai per: verificare che il provider sia installato nel tuo cluster del workshop, ottenere quattro valori condivisi dal tuo istruttore, creare un DBaaS MySQL Aruba, eseguire SELECT 1 da un Pod, e fare pulizia.
7.2 Verifica il cablaggio della tua piattaforma ⏱️ 2m
Conferma che il provider sia su. Il tooling del team di piattaforma ha installato provider-arubacloud, applicato un ProviderConfig che fa riferimento a un Secret che hanno iniettato per te, e configurato le policy Kyverno descritte sopra.
kubectl get provider.pkg.crossplane.io provider-arubacloud
Output atteso:
NAME INSTALLED HEALTHY PACKAGE
provider-arubacloud True True ghcr.io/riccap/provider-arubacloud:v0.3.0-workshop
Se questo check resta rosso dopo qualche secondo, l'accesso Aruba della tua coppia non è ancora stato attivato — segnalalo al tuo istruttore. La sua dashboard ha un toggle per dargli il via libera.
Anche le policy Kyverno che il team di piattaforma spedisce devono essere presenti. Conferma:
kubectl get clusterpolicy
Dovresti vedere dodici policy — i cinque guardrail descritti sopra espansi in policy di shape per Kind, più qualche compagno interno (auto-protezione di Kyverno, una guardia contro provider rogue).
7.3 Provisiona un DBaaS MySQL ⏱️ 12m
La risorsa di punta. Creerai una managed resource DBaaS (un'istanza MySQL reale) usando quattro valori di rete condivisi del workshop che il tuo platform team ha messo in una ConfigMap dentro il tuo cluster.
1. Ottieni i valori condivisi
Leggi la ConfigMap che il tuo platform team ha provvisto nel namespace default del tuo cluster:
kubectl get configmap workshop-aruba-shared -o yaml
Output atteso:
apiVersion: v1
kind: ConfigMap
metadata:
name: workshop-aruba-shared
namespace: default
data:
projectId: <workshop-project-id> # stringa esadecimale di 24 caratteri
vpcUri: <vpc-uri> # URI della VPC condivisa del workshop
subnetUri: <subnet-uri> # URI di una subnet dentro quella VPC
securityGroupUri: <security-group-uri> # URI di un security group sulla VPC
Tieni a portata i quattro valori; li incollerai in §7.3.2. (vpcUriRef / subnetUriRef / securityGroupUriRef su una MR Database non supportano ancora valueFrom: configMapKeyRef — il suffisso *Ref di Crossplane è per riferimenti tra MR, non per lookup arbitrari di ConfigMap — quindi per ora è leggi-e-incolla, non leggi-e-collega.)
2. Applica la MR DBaaS
kubectl apply -f - <<'EOF'
apiVersion: dbaas.arubacloud.crossplane.io/v1alpha1
kind: DBaaS
metadata:
name: <your-pair-id>-mysql
spec:
forProvider:
name: <your-pair-id>-mysql
projectId: <workshop-project-id>
engineId: mysql-8.0
flavor: DBO2A4
location: ITBG-Bergamo
zone: ITBG-3
billingPeriod: Hour
storage:
sizeGb: 20
network:
vpcUriRef: <vpc-uri>
subnetUriRef: <subnet-uri>
securityGroupUriRef: <security-group-uri>
tags:
- crossplane-workshop
- <your-pair-id>
providerConfigRef:
name: default
writeConnectionSecretToRef:
name: <your-pair-id>-mysql-conn
namespace: default
EOF
Qualche dettaglio del manifest che vale la pena capire:
metadata.nameeforProvider.nameiniziano entrambi con il tuo pair id. La policy name-prefix di Kyverno nega qualunque MR Aruba il cui nome non porti il tuo prefisso — prova a rimuoverlo al prossimo apply per vedere il rifiuto.flavor: DBO2A4è 2 CPU / 4Gi RAM, il tier più piccolo del workshop.DBO16A32e simili sono negati al momento dell'admission.engineId: mysql-8.0elocation: ITBG-Bergamosono gli unici valori ammessi per questo workshop. La policy è un Helm value; il tuo istruttore può rilassarla via PR.writeConnectionSecretToRefdice a Crossplane dove pubblicare i dettagli di connessione (host, porta, credenziali admin) quando Aruba li restituisce. Leggerai questo Secret in §7.4.
3. Guardalo provisionarsi
Il provisioning del DBaaS richiede circa sei minuti — Aruba sta cablando MySQL, networking e storage. Apri un watch:
kubectl get dbaas <your-pair-id>-mysql -w
Output atteso una volta pronto:
NAME SYNCED READY EXTERNAL-NAME
<your-pair-id>-mysql True True 69ee...
SYNCED=True significa che la chiamata API da Crossplane verso Aruba è andata a buon fine; READY=True significa che Aruba dice che l'istanza è su e sta servendo traffico. Premi Ctrl+C quando entrambi sono True.
7.4 Connettiti con mysql ⏱️ 6m
Crossplane ha scritto i dettagli di connessione in un Secret chiamato <your-pair-id>-mysql-conn in default. Ispeziona quali chiavi ci sono dentro prima di cablarlo a un Pod:
kubectl get secret <your-pair-id>-mysql-conn -o jsonpath='{.data}' | jq 'keys'
Output atteso (i nomi delle chiavi possono variare leggermente):
[
"endpoint",
"password",
"port",
"username"
]
Il provider espone le chiavi di connection-detail che vede dall'API Aruba; il Secret è il contratto.
Esegui un Pod one-shot che fa il ping del DB
kubectl apply -f - <<'EOF'
apiVersion: v1
kind: Pod
metadata:
name: <your-pair-id>-db-test
spec:
restartPolicy: Never
containers:
- name: mysql-client
image: mysql:8
command: ["sh", "-c"]
args:
- mysql -h "$endpoint" -P "$port" -u "$username" -p"$password" -e 'SELECT 1 AS ok;'
envFrom:
- secretRef:
name: <your-pair-id>-mysql-conn
EOF
envFrom: secretRef carica ogni chiave del Secret di connessione come variabile d'ambiente con il nome della chiave. Il comando shell poi le richiama per nome. Se il tuo Secret avesse chiavi diverse (ad es. host invece di endpoint), aggiorna l'argomento mysql -h "$endpoint" di conseguenza.
Quando il Pod completa:
kubectl logs <your-pair-id>-db-test
Output atteso:
ok
1
Hai instradato una query SQL attraverso un kubectl apply di una MR Crossplane, dentro una vera istanza MySQL Aruba, di ritorno attraverso la rete del cluster del workshop, e fuori dall'altra parte.
7.5 Pulizia ⏱️ 2m
Aruba fattura il DBaaS a ore. Cancellalo subito:
kubectl delete pod <your-pair-id>-db-test
kubectl delete dbaas <your-pair-id>-mysql
Crossplane riconcilia la cancellazione contro Aruba, che smonta l'istanza MySQL. Il Secret di connessione è di proprietà della MR DBaaS e viene mietuto insieme a lei.
Se ti dimentichi, il tuo istruttore farà ripulisce tutto al teardown del workshop — ma il DBaaS continuerà ad accumulare ore fino ad allora.
7.6 Cosa è appena successo
Stessa forma Provider → ProviderConfig → MR di AWS / GCP / Azure, applicata contro Aruba. Le differenze interessanti:
- La credenziale è gestita dalla piattaforma. Non hai mai visto la chiave API Aruba; il team di piattaforma l'ha iniettata nel tuo cluster in modo sicuro prima del tuo login. Questo è il pattern di produzione per l'isolamento degli account cloud — gli sviluppatori richiedono risorse senza mai detenere la credenziale.
- Guardrail Kyverno al momento dell'admission. Prova a editare lo YAML del DBaaS per usare
flavor: DBO16A32, oppure a rinominarlo senza il prefisso<your-pair-id>-, e a rifare apply. Il messaggio di errore torna istantaneo — Kyverno ha visto la richiesta prima che toccasse etcd. Il team di piattaforma può spedire aggiornamenti di policy via PR; il cluster di tutti li raccoglie al sync successivo. - La rete Aruba è più esplicita degli hyperscaler. AWS, GCP e Azure espongono tutti reti di default; Aruba richiede di referenziare URI di VPC + subnet + security group direttamente. Il team di piattaforma li gestisce una volta per il workshop, poi condivide gli URI.
Per approfondire
- Componi uno stack MySQL a privilegio minimo. Questo modulo ha creato l'istanza DBaaS e si è collegato come admin — bene per un workshop, mai per produzione. Le app reali hanno bisogno di un login non-admin: un
Database.database.arubacloud.crossplane.io(schema logico) +DBaaSUser(login non-admin) +DatabaseGrant(la rigaGRANT … TO …che li collega). Avvolgi le quattro MR in un XR comeXAppDatabasecosì gli utenti della piattaforma ottengono un workflow opinionated "dammi un DB per l'app X" da una sola riga di YAML — stessa forma dell'XApplicationche hai scritto nel modulo 4 del 101. provider-arubacloud— sorgente del provider, catalogo completo dei Kind, indice delle versioni. Il workshop pinnav0.3.0-workshop.- Riferimento API Aruba Cloud — l'API upstream con cui parla il provider.