Esegui carichi di lavoro con privilegi dei partner di GKE Autopilot


Questa pagina mostra come eseguire carichi di lavoro privilegiati dai partner Google Kubernetes Engine (GKE) Autopilot. Scopri come configurare un workload di sincronizzazione che installa una lista consentita nel cluster e la mantiene aggiornata.

Questa pagina è dedicata ai seguenti tipi di ruoli:

  • Gli ingegneri della sicurezza che vogliono assicurarsi che i workload di terze parti richiedano una consente di eseguire i cluster e provengano da fonti approvate da GKE.
  • Gli ingegneri della piattaforma che vogliono abilitare i workload di terze parti sui cluster per sbloccare i team delle applicazioni.

Per scoprire di più sui ruoli comuni e sulle attività di esempio a cui facciamo riferimento nella nostra documentazione, consulta Ruoli e attività comuni degli utenti di GKE Enterprise.

Prima di leggere questa pagina, assicurati di avere familiarità con quanto segue:

Informazioni sui workload dei partner privilegiati in Autopilot

GKE consente a un sottoinsieme di partner approvati di eseguire carichi di lavoro con privilegi nei cluster Autopilot. Questi carichi di lavoro privilegiati possono ignorare alcuni dei vincoli di sicurezza applicati da Autopilot. Ad esempio, un partner potrebbe dover eseguire un workload che utilizza funzionalità Linux specifiche o richiede un contenitore privilegiato.

I partner creano e gestiscono liste consentite per i loro carichi di lavoro privilegiati. Ogni lista consentita è un file che corrisponde a un carico di lavoro specifico di un partner privilegiato. I partner inviano questi file di lista consentita a GKE per l'approvazione. Dopo l'approvazione, GKE ospita il file della lista consentita in un repository gestito da Google.

Per eseguire un workload partner, installa il file di lista consentita corrispondente nel tuo cluster. GKE fornisce una risorsa personalizzata di Kubernetes denominata AllowlistSynchronizer che installa le liste consentite e le mantiene aggiornate. Dopo l'installazione riuscita di una lista consentita, puoi eseguire il deployment del workload partner privilegiato corrispondente.

Bug e richieste di funzionalità per workload con privilegi e liste consentite

I partner sono responsabili della creazione, dello sviluppo e della manutenzione dei propri carichi di lavoro privilegiati e delle liste consentite. Se riscontri un bug o hai una richiesta di funzionalità per un carico di lavoro privilegiato o una lista consentita, contatta il partner corrispondente.

Informazioni sul controller AllowlistSynchronizer

AllowlistSynchronizer è un controller che viene eseguito nel control plane GKE. Esegui il deployment di un nuovo AllowlistSynchronizer come manifest YAML, in modo simile a come esegui il deployment di qualsiasi altro carico di lavoro Kubernetes. Nel manifest, specifica il percorso del file della lista consentita che vuoi installare, che ottieni dal partner di terze parti. Il sincronizzatore trova il file della lista consentita del partner in un repository gestito da Google e installa la lista consentita nel tuo cluster.

Ogni 10 minuti, il sincronizzatore verifica la presenza di aggiornamenti al file della lista consentita. Se esiste un aggiornamento, il sincronizzatore installa la lista consentita aggiornata nel tuo cluster.

Per interrompere l'autorizzazione di workload specifici, aggiorna i sincronizzatori della lista consentita esistenti per rimuovere i percorsi dei file della lista consentita corrispondenti, quindi elimina l'oggetto WorkloadAllowlist dal cluster. Se elimini un oggetto WorkloadAllowlist installato senza rimuovere il percorso dal sincronizzatore della lista consentita, il sincronizzatore reinstalla la lista consentita. I partner non possono eliminare i file della lista consentita dal repository gestito da Google.

Prima di iniziare

Prima di iniziare, assicurati di aver eseguito le seguenti operazioni:

  • Attiva l'API Google Kubernetes Engine.
  • Attiva l'API Google Kubernetes Engine
  • Se vuoi utilizzare Google Cloud CLI per questa attività, installala e poi inizializzala. Se hai già installato gcloud CLI, scarica l'ultima versione eseguendo gcloud components update.

Requisiti

  • La risorsa personalizzata AllowlistSynchronizer richiede GKE versione 1.32.2-gke.1652000 o successive.
  • Devi sapere quale workload partner vuoi eseguire nel tuo cluster. Consulta la documentazione del partner per istruzioni sull'installazione del workload con privilegi.

Crea un nuovo AllowlistSynchronizer

Per eseguire un workload con privilegi da un partner, aggiungi il percorso al file della lista consentita corrispondente a una risorsa personalizzata AllowlistSynchronizer. Dopodiché esegui il deployment di AllowlistSynchronizer nel tuo cluster.

  1. In un editor di testo, crea un nuovo file YAML.
  2. Aggiungi i seguenti contenuti al file YAML:

    apiVersion: auto.gke.io/v1
    kind: AllowlistSynchronizer
    metadata:
      name: ALLOWLIST_SYNCHRONIZER_NAME
    spec:
      allowlistPaths:
      - ALLOWLIST1_PATH
      - ALLOWLIST2_PATH
    

    Sostituisci quanto segue:

    • ALLOWLIST_SYNCHRONIZER_NAME: il nome del nuovo sincronizzatore. Scegli un nome descrittivo che identifichi il workload o il team supportato dalla lista consentita.
    • ALLOWLIST1_PATH, ALLOWLIST2_PATH, ...: uno o più percorsi dei file della lista consentita dei partner da installare. Consulta la documentazione del workload del partner scelto per questo percorso. Puoi specificare intere directory o singoli file.
  3. Esegui il deployment del file YAML nel tuo cluster:

    kubectl apply -f PATH_TO_YAML_FILE
    

    Sostituisci PATH_TO_YAML_FILE con il percorso del file YAML che hai creato nel passaggio precedente.

    L'installazione del controller AllowlistSynchronizer consente di installare i file della lista consentita dai percorsi specificati nel cluster.

  4. Attendi finché il sincronizzatore non segnala lo stato Ready:

    kubectl wait --for=condition=Ready allowlistsynchronizer/ALLOWLIST_SYNCHRONIZER_NAME \
      --timeout=60s
    

Puoi anche integrare il deployment dei carichi di lavoro dei partner nella pipeline di integrazione continua e distribuzione continua (CI/CD). Configura il workflow in modo che attenda l'installazione corretta della lista consentita prima di eseguire il deployment del carico di lavoro corrispondente.

Aggiornare un AllowlistSynchronizer esistente

Puoi aggiornare un AllowlistSynchronizer esistente per aggiungere o rimuovere file di liste consentite. Potresti aggiornare i sincronizzatori esistenti in situazioni come le seguenti:

  • Il partner aggiunge un nuovo file di lista consentita con un nome diverso.
  • Vuoi aggiungere una nuova lista consentita di workload a un sincronizzatore esistente che raggruppa le liste consentite correlate.
  • Vuoi rimuovere una lista consentita da un sincronizzatore perché non vuoi più utilizzare il workload corrispondente.

Per aggiornare un oggetto AllowlistSynchronizer esistente:

  1. Elenca i sincronizzatori esistenti nel cluster:

    kubectl get allowlistsynchronizer
    
  2. Apri la specifica del sincronizzatore che vuoi aggiornare in un editor di testo.

  3. Aggiorna il campo spec.allowlistPaths per aggiungere, modificare o rimuovere i percorsi dei file della lista consentita.

  4. Salva e chiudi l'editor di testo.

  5. Applica la configurazione aggiornata al cluster:

    kubectl apply -f PATH_TO_YAML_FILE
    

    Sostituisci PATH_TO_YAML_FILE con il percorso del file YAML che hai aggiornato nel passaggio precedente.

Quando implementi una configurazione del sincronizzatore aggiornata, il campo managedAllowlistStatus.generation nello stato dell'oggetto AllowlistSynchronizer aumenta di uno. Il controller AllowlistSynchronizer applica quindi le modifiche.

Monitorare lo stato della sincronizzazione della lista consentita

Dopo aver installato un AllowlistSynchronizer o aggiornato un sincronizzatore esistente, puoi monitorare lo stato della sincronizzazione. Lo stato ti aiuta a monitorare l'installazione, la rimozione o le modifiche dei file della lista consentita, nonché eventuali errori che potrebbero verificarsi.

Per monitorare lo stato generale della sincronizzazione, esegui questo comando:

kubectl get allowlistsynchronizer ALLOWLIST_SYNCHRONIZER_NAME -o yaml

L'output è simile al seguente:

...
status:
  conditions:
  - type: Ready
    status: "False"
    reason: "SyncError"
    message: "some allowlists failed to sync: example-allowlist-1.yaml"
    lastTransitionTime: "2024-10-12T10:00:00Z"
    observedGeneration: 2
  managedAllowlistStatus:
    - filePath: "gs://path/to/allowlist1.yaml"
      generation: 1
      phase: Installed
      lastSuccessfulSync: "2024-10-10T10:00:00Z"
    - filePath: "gs://path/to/allowlist2.yaml"
      phase: Failed
      lastError: "Initial install failed: invalid contents"
      lastSuccessfulSync: "2024-10-08T10:00:00Z"

Per una descrizione di questi campi, vedi Stato AllowlistSynchronizer.

Verifica che esista una lista consentita nel cluster

Per verificare che esista una lista consentita nel cluster, esegui questo comando:

kubectl get workloadallowlist

L'output è un elenco delle liste consentite installate nel cluster. Verifica che l'output includa la lista consentita che vuoi utilizzare.

Esegui il deployment del workload privilegiato

Dopo l'installazione corretta di una lista consentita, puoi eseguire il deployment del workload corrispondente nel cluster. Il partner che fornisce il workload dovrebbe anche fornirti le istruzioni di installazione per il workload. Per un elenco dei partner Autopilot e dei link alla relativa documentazione, consulta la pagina Partner Autopilot.

Utilizzare repository mirror di immagini private

Puoi eseguire il mirroring delle immagini container dei carichi di lavoro partner in repository privati di tua proprietà. Per eseguire queste immagini sottoposte a mirroring in un carico di lavoro, devi soddisfare tutti i seguenti requisiti:

  • Il digest SHA-256 dell'immagine sottoposta a mirroring deve corrispondere al digest dell'immagine del carico di lavoro del partner disponibile pubblicamente.
  • Il digest dell'immagine SHA-256 che specifichi deve esistere nell'oggetto WorkloadAllowlist fornito dal partner e sincronizzato con il tuo cluster.

Se il workload del partner supporta le immagini sottoposte a mirroring, la specifica della lista consentita per quel workload contiene un elenco di hash delle immagini nel campo containers.imageDigests della specifica della lista consentita per quel workload. In genere, questo campo ha un digest separato per ogni versione disponibile dell'immagine container. Per visualizzare questo elenco di digest delle immagini:

  1. Verifica che la lista consentita esista nel cluster.
  2. Recupera la specifica della lista consentita installata:

    kubectl get workloadallowlist ALLOWLIST_NAME -o yaml
    

    Sostituisci ALLOWLIST_NAME con il nome della lista consentita installata. Ad esempio, company-name-solution-v1.0.0.

    Per i workload che supportano questa funzionalità, l'output è simile al seguente. Il campo imageDigests contiene un elenco di digest consentiti.

    # lines omitted for clarity
    - containerName: pause-container1
      imageDigests:
      - cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229
      - 932ea160d395f3d7f76c0c17a52a63c4cfe1836a900f1058b6bc20b16fd10d23
    

    Se l'output non include un campo imageDigests o se il digest della release che vuoi utilizzare non è presente nell'elenco, contatta direttamente il partner e chiedigli di aggiornare la lista consentita. Dopo che il partner aggiunge i digest delle immagini alla propria lista consentita e invia le modifiche a GKE, il sincronizzatore della lista consentita nel tuo cluster installa automaticamente la lista consentita aggiornata.

  3. Aggiungi uno dei digest delle immagini supportati al manifest del workload.

Ad esempio, considera la seguente immagine nella specifica Pod disponibile pubblicamente di un partner:

...
  containers:
  - name: pause-container1
    image: partner-repo/pause1@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229
    securityContext:
      privileged: true

Puoi utilizzare un'immagine speculare se il digest corrisponde al digest disponibile pubblicamente, come nel seguente esempio:

...
  containers:
  - name: pause-container1
    image: my-private-repo/pause1@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229
    securityContext:
      privileged: true

Devi includere il digest SHA-256 nel campo dell'immagine, in modo simile all'esempio precedente. Se i digest non corrispondono, l'immagine speculare non verrà eseguita. Per conservare i digest delle immagini quando esegui il mirroring delle immagini partner, valuta la possibilità di utilizzare uno strumento come crane, ORAS o skopeo.

Eliminare un workload privilegiato

Per impedire l'esecuzione di un workload privilegiato nei tuoi cluster, rimuovi il percorso della lista consentita corrispondente da AllowlistSynchronizer. Il sincronizzatore disinstalla la lista consentita.

Se elimini un oggetto WorkloadAllowlist dal cluster anziché aggiornare il sincronizzatore, quest'ultimo reinstalla la lista consentita. Assicurati di rimuovere il percorso da AllowlistSynchronizer.

Per disinstallare una lista consentita:

  1. Nel manifest YAML per AllowlistSynchronizer che gestisce la lista consentita, rimuovi il percorso della lista consentita che vuoi disinstallare. Per istruzioni, vedi la sezione Aggiornare una sezione AllowlistSynchronizer esistente.
  2. Per verificare che la lista consentita sia stata disinstallata, recupera un elenco di oggetti WorkloadAllowlist nel cluster:

    kubectl get workloadallowlist
    

    Nell'output, assicurati che la lista consentita che volevi rimuovere non venga visualizzata.

  3. Elimina il workload dal cluster. Per istruzioni, consulta la documentazione del provider del carico di lavoro.

Impedisci l'installazione di liste consentite nei tuoi cluster

Per impedire l'installazione di liste consentite di workload privilegiati in cluster specifici, utilizza un ValidatingAdmissionPolicy. La convalida dei criteri di ammissione garantisce che le risorse Kubernetes soddisfino criteri specifici prima di poter essere eseguite nel cluster. Ad esempio, puoi verificare che un'etichetta abbia un valore specifico.

Per impedire l'installazione di liste consentite in un cluster:

  1. Salva il seguente manifest ValidatingAdmissionPolicy come disallow-allowlists.yaml:

    apiVersion: admissionregistration.k8s.io/v1
    kind: ValidatingAdmissionPolicy
    metadata:
      name: "disallow-allowlists"
    spec:
      failurePolicy: Fail
      matchConstraints:
        resourceRules:
        - apiGroups:   ["auto.gke.io"]
          apiVersions: ["*"]
          operations:  ["*"]
          resources:   ["allowlistsynchronizers"]
      validations:
      - expression: "false"
        message: 'AllowlistSynchronizer creation is not allowed'
    
  2. Salva il seguente manifest ValidatingAdmissionPolicyBinding come disallow-allowlists-binding.yaml:

    apiVersion: admissionregistration.k8s.io/v1
    kind: ValidatingAdmissionPolicyBinding
    metadata:
      name: "disallow-allowlists-binding"
    spec:
      policyName: "disallow-allowlists"
      validationActions: [Deny]
    
  3. Esegui il deployment di ValidatingAdmissionPolicy nel tuo cluster:

    kubectl apply -f disallow-allowlists.yaml
    kubectl apply -f disallow-allowlists-binding.yaml
    

Questo criterio impedisce la creazione di nuovi AllowlistSynchronizer nel cluster.

Risoluzione dei problemi

Se la sincronizzazione o il deployment del workload non vanno a buon fine, consulta Risoluzione dei problemi relativi al deployment dei workload Autopilot con privilegi.

Passaggi successivi