Lock
Ambito: namespaced · Guardrail
Lock protegge un'altra risorsa dall'eliminazione per errore — lo stesso principio di un resource lock CanNotDelete di Azure. Finché esiste un Lock che fa riferimento a una risorsa, qualsiasi kubectl delete (o eliminazione via API) di quella risorsa viene rifiutato in fase di admission; devi prima eliminare il Lock.
apiVersion: core.navique.com/v1alpha1
kind: Lock
metadata:
name: protect-forge-stack
namespace: forge
spec:
targetRef:
apiVersion: core.navique.com/v1alpha1
kind: Stack
name: forge
reason: "Production environment — remove this Lock deliberately before deleting."$ kubectl delete stack forge -n forge
Error from server (Forbidden): admission webhook ... denied the request:
resource is protected by Lock(s) [protect-forge-stack]; delete the Lock(s) before deleting this resourceCome funziona
Kubernetes non dispone di un lock di risorsa integrato, e un controller da solo non può impedire un'eliminazione — nel momento in cui il controller la vede, l'eliminazione è già irreversibile. Il Lock viene quindi applicato là dove le eliminazioni possono effettivamente essere rifiutate: la fase di admission dell'API server. Due componenti cooperano:
- Il controller Lock applica alla risorsa di destinazione un'annotazione
core.navique.com/lockedche elenca i Lock che la proteggono. Quando l'ultimoLockviene rimosso, l'annotazione viene cancellata. - Una
ValidatingAdmissionPolicya livello di cluster rifiuta qualsiasiDELETEdi una risorsacore.navique.comche porta un'annotazionecore.navique.com/lockednon vuota.
Richiede Kubernetes 1.30+ (ValidatingAdmissionPolicy GA). La policy viene installata insieme all'operatore (valore Helm lockGuard.enabled, predefinito true).
Campi
| Campo | Obbligatorio | Descrizione |
|---|---|---|
targetRef.kind | sì | Kind della risorsa protetta, ad es. Stack, PostgresCluster, Gateway. |
targetRef.name | sì | Nome della risorsa di destinazione, nello stesso namespace del Lock. |
targetRef.apiVersion | no | Per default core.navique.com/v1alpha1. Può essere applicato solo al gruppo API dell'operatore. |
reason | no | Nota in testo libero, mostrata nello status e nel messaggio di eliminazione rifiutata. |
Comportamento e limiti
- Stesso namespace, solo il nostro gruppo. Un
Lockpuò proteggere solo una risorsacore.navique.comnel proprio namespace. Altri gruppi (e il lock di unLockstesso) vengono rifiutati conActive: falsee reasonInvalidTarget. - Più lock si sommano. Più Lock possono proteggere la stessa risorsa; questa resta protetta finché non viene eliminato l'ultimo.
- Anche le eliminazioni a cascata vengono bloccate. Eliminare uno
Stackcon una risorsa figlia sottoposta a lock verrà bloccato per quella risorsa figlia (anche le eliminazioni della garbage collection passano dall'admission), lasciando lo Stack parzialmente smantellato. Rimuovi prima ilLockdella risorsa figlia, oppure non applicare lock alle singole risorse figlie di proprietà dello Stack se vuoi che lo Stack venga eliminato in modo pulito — applica invece il lock alloStack. - È un guardrail, non un controllo di sicurezza. Chiunque abbia i permessi RBAC per eliminare il
Lock(o modificare l'annotazione della risorsa) può rimuovere la protezione. Usa l'RBAC se ti serve un confine rigido. - Solo eliminazioni. Un
Lockblocca l'eliminazione, non gli aggiornamenti (la modalitàReadOnlydi Azure non è implementata — bloccherebbe anche le riconciliazioni dell'operatore stesso).
Status
| Campo | Significato |
|---|---|
status.active | true quando la risorsa di destinazione porta l'annotazione di lock (l'eliminazione viene rifiutata). |
status.conditions[Ready] | True quando protegge; False con reason MissingReference (destinazione non ancora trovata) o InvalidTarget. |