Skip to content

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.

yaml
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."
console
$ 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 resource

Come 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:

  1. Il controller Lock applica alla risorsa di destinazione un'annotazione core.navique.com/locked che elenca i Lock che la proteggono. Quando l'ultimo Lock viene rimosso, l'annotazione viene cancellata.
  2. Una ValidatingAdmissionPolicy a livello di cluster rifiuta qualsiasi DELETE di una risorsa core.navique.com che porta un'annotazione core.navique.com/locked non vuota.

Richiede Kubernetes 1.30+ (ValidatingAdmissionPolicy GA). La policy viene installata insieme all'operatore (valore Helm lockGuard.enabled, predefinito true).

Campi ​

CampoObbligatorioDescrizione
targetRef.kindsìKind della risorsa protetta, ad es. Stack, PostgresCluster, Gateway.
targetRef.namesìNome della risorsa di destinazione, nello stesso namespace del Lock.
targetRef.apiVersionnoPer default core.navique.com/v1alpha1. Può essere applicato solo al gruppo API dell'operatore.
reasonnoNota in testo libero, mostrata nello status e nel messaggio di eliminazione rifiutata.

Comportamento e limiti ​

  • Stesso namespace, solo il nostro gruppo. Un Lock può proteggere solo una risorsa core.navique.com nel proprio namespace. Altri gruppi (e il lock di un Lock stesso) vengono rifiutati con Active: false e reason InvalidTarget.
  • 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 Stack con 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 il Lock della 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 allo Stack.
  • È 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 Lock blocca l'eliminazione, non gli aggiornamenti (la modalità ReadOnly di Azure non è implementata — bloccherebbe anche le riconciliazioni dell'operatore stesso).

Status ​

CampoSignificato
status.activetrue 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.

Nucleo open source sotto AGPL-3.0. I componenti Enterprise sono proprietari e soggetti a licenza.