Limita le azioni sulle risorse GKE utilizzando criteri dell'organizzazione personalizzati


Questa pagina mostra come limitare operazioni specifiche su alle risorse di Google Kubernetes Engine (GKE) nella tua organizzazione che utilizzano dei criteri dell'organizzazione nel servizio Criteri dell'organizzazione di Google Cloud. Per scoprire di più su Criteri dell'organizzazione, consulta Criteri dell'organizzazione personalizzati.

Informazioni su criteri e vincoli dell'organizzazione

Il criterio dell'organizzazione di Google Cloud offre gestione programmatica e centralizzata un controllo completo sulle risorse dell'organizzazione. Come amministratore dei criteri dell'organizzazione, puoi definire un criterio dell'organizzazione, ovvero un insieme di restrizioni chiamate vincoli che si applicano alle risorse Google Cloud e ai discendenti di queste risorse Gerarchia delle risorse di Google Cloud. Puoi applicare i criteri dell'organizzazione a livello di organizzazione, cartella o progetto livello.

I criteri dell'organizzazione forniscono vincoli predefiniti per vari servizi Google Cloud. Tuttavia, se vuoi un controllo più granulare e personalizzabile sui campi specifici limitati nei criteri dell'organizzazione, puoi anche creare vincoli personalizzati e utilizzarli in un criterio dell'organizzazione personalizzato.

Risorse supportate in GKE

Per GKE, puoi creare vincoli personalizzati per i metodi CREATE o UPDATE su qualsiasi campo della risorsa Cluster o NodePool dell'API Google Kubernetes Engine v1, tranne per i campi solo di output e per i seguenti campi:

  • projects.locations.clusters.masterAuth.clientKey
  • projects.locations.clusters.masterAuth.password

Eredità dei criteri

Per impostazione predefinita, i criteri vengono ereditati dai discendenti delle risorse su cui li applichi. Ad esempio, se applichi un criterio a una cartella, Google Cloud applica i criteri a tutti i progetti inclusi nella cartella. Per scoprire di più su questo comportamento e su come modificarlo, consulta le Regole di valutazione gerarchica.

Prezzi

I criteri e i vincoli dell'organizzazione sono offerti senza costi.

Prima di iniziare

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

  • Attiva l'API Google Kubernetes Engine.
  • Abilita l'API Google Kubernetes Engine
  • Se vuoi utilizzare Google Cloud CLI per questa attività, install e poi inizializzare con gcloud CLI. Se hai già installato gcloud CLI, ottieni la versione più recente eseguendo gcloud components update.

Crea un vincolo personalizzato

Per creare una nuova limitazione personalizzata, devi definirla in un file YAML e poi applicarla alla tua organizzazione utilizzando Google Cloud CLI.

  1. Crea un file YAML per il vincolo personalizzato:

    name: organizations/ORGANIZATION_ID/customConstraints/custom.CONSTRAINT_NAME
    resourceTypes:
    - container.googleapis.com/RESOURCE_NAME
    methodTypes:
    - METHOD1
    - METHOD2
    condition: "resource.OBJECT_NAME.FIELD_NAME == VALUE"
    actionType: ACTION
    displayName: DISPLAY_NAME
    description: DESCRIPTION
    

    Sostituisci quanto segue:

    • ORGANIZATION_ID: l'ID della tua organizzazione, ad esempio 123456789.
    • CONSTRAINT_NAME: il nome che vuoi per il tuo nuovo un vincolo personalizzato. Un vincolo personalizzato deve iniziare con custom. e può includere solo lettere maiuscole, lettere minuscole o numeri, ad esempio custom.enableGkeAutopilot. La lunghezza massima di questo campo è di 70 caratteri, senza contare il prefisso, ad esempio organizations/123456789/customConstraints/custom..
    • RESOURCE_NAME: il nome (non l'URI) della risorsa REST dell'API GKE contenente l'oggetto e il campo che vuoi limitare. Ad esempio, Cluster o NodePool.
    • METHOD1,METHOD2,...: un elenco di Metodi RESTful per cui applicare il vincolo. Può essere CREATE o CREATE e UPDATE.
    • condition: la condizione per convalidare la richiesta scritto in CEL (Common Expression Language). Questo campo ha una lunghezza massima di 1000 caratteri. L'espressione deve contengono i seguenti campi e supporta operatori logici come && e ||:

      • OBJECT_NAME: il nome del Oggetto API GKE che vuoi limitare, in pascalCase. Ad esempio: privateClusterConfig.
      • FIELD_NAME: il nome del Campo API GKE che vuoi limitare, nel pascalCase. Ad esempio: enablePrivateNodes.
      • VALUE: il valore del campo. Per i valori booleani utilizza true o false. Per i campi di stringa, utilizza "STRING".
    • ACTION: l'azione da eseguire se condition è sono soddisfatte determinate condizioni. Può essere ALLOW o DENY.

    • DISPLAY_NAME: un nome comprensibile per la limitazione. Questo campo ha una lunghezza massima di 200 caratteri.

    • DESCRIPTION: una descrizione del del vincolo che viene visualizzato come messaggio di errore quando il criterio viene violato. Questo campo ha una lunghezza massima di 2000 caratteri.

  2. Applica il vincolo personalizzato:

    gcloud org-policies set-custom-constraint PATH_TO_FILE
    

    Sostituisci PATH_TO_FILE con il percorso del file della definizione del vincolo personalizzato.

  3. Verifica che il vincolo personalizzato esista:

    gcloud org-policies list-custom-constraints --organization=ORGANIZATION_ID
    

    L'output è simile al seguente:

    CONSTRAINT                     LIST_POLICY    BOOLEAN_POLICY    ETAG
    custom.enableGkeAutopilot      -              SET               COCsm5QGENiXi2E=
    ...
    

Applica il vincolo personalizzato

Per applicare il nuovo vincolo personalizzato, crea un criterio dell'organizzazione che fa riferimento al vincolo e applica il criterio dell'organizzazione.

  1. Crea un file YAML per il criterio dell'organizzazione:

    name: RESOURCE_HIERARCHY/policies/POLICY_NAME
    spec:
      rules:
      - enforce: true
    

    Sostituisci quanto segue:

    • RESOURCE_HIERARCHY: la posizione della nuova norma, che influisce sull'ambito dell'applicazione. Utilizza la gerarchia delle risorse Google Cloud come guida. Ad esempio, se volevi applicare il criterio in un progetto specifico, utilizza projects/PROJECT_ID. Per applicare i criteri in un un'organizzazione specifica, utilizza organizations/ORGANIZATION_ID.
    • POLICY_NAME: il nome della nuova norma.
  2. Applica il criterio:

    gcloud org-policies set-policy PATH_TO_POLICY
    

    Sostituisci PATH_TO_POLICY con il percorso del criterio file di definizione.

  3. Verifica che il criterio esista:

    gcloud org-policies list \
        --RESOURCE_FLAG=RESOURCE_ID
    

    Sostituisci quanto segue:

    • RESOURCE_FLAG: la risorsa Google Cloud in cui hai applicato il criterio. Ad esempio, project o folder.
    • RESOURCE_ID: l'ID della risorsa in cui hanno applicato le norme. Ad esempio, l'ID della tua cartella Google Cloud.

    Per un elenco degli argomenti, consulta gcloud org-policies list.

    L'output è simile al seguente:

    CONSTRAINT                                    LIST_POLICY    BOOLEAN_POLICY    ETAG
    iam.disableWorkloadIdentityClusterCreation    -              SET               CO3UkJAGEOj1qsQB
    custom.enableGkeAutopilot                     -              SET               COCsm5QGENiXi2E=
    custom.enableBinAuth                          -              SET               CJfKiZUGEJju7LUD
    

Esempio: creare un vincolo personalizzato e applicare una norma

L'esempio seguente crea un vincolo e un criterio personalizzati che richiedono che tutti i nuovi cluster di un progetto specifico siano cluster Autopilot.

Prima di iniziare, tieni presente quanto segue:

  • Il tuo ID organizzazione
  • Un ID progetto

Crea il vincolo

  1. Salva il file seguente come constraint-enable-autopilot.yaml:

    name: organizations/ORGANIZATION_ID/customConstraints/custom.enableGkeAutopilot
    resourceTypes:
    - container.googleapis.com/Cluster
    methodTypes:
    - CREATE
    condition: "resource.autopilot.enabled == false"
    actionType: DENY
    displayName: Enable GKE Autopilot
    description: All new clusters must be Autopilot clusters.
    

    Questo definisce un vincolo in cui per ogni nuovo cluster, se la modalità del cluster non è Autopilot, l'operazione viene rifiutata.

  2. Applica il vincolo:

    gcloud org-policies set-custom-constraint ~/constraint-enable-autopilot.yaml
    
  3. Verifica che la limitazione esista:

    gcloud org-policies list-custom-constraints --organization=ORGANIZATION_ID
    

    L'output è simile al seguente:

    CUSTOM_CONSTRAINT                       ACTION_TYPE  METHOD_TYPES   RESOURCE_TYPES                     DISPLAY_NAME
    custom.enableGkeAutopilot               DENY         CREATE         container.googleapis.com/Cluster   Enable GKE Autopilot
    ...
    

Crea il criterio

  1. Salva il seguente file come policy-enable-autopilot.yaml:

    name: projects/PROJECT_ID/policies/custom.enableGkeAutopilot
    spec:
      rules:
      - enforce: true
    

    Sostituisci PROJECT_ID con l'ID progetto.

  2. Applica il criterio:

    gcloud org-policies set-policy ~/policy-enable-autopilot.yaml
    
  3. Verifica che il criterio esista:

    gcloud org-policies list --project=PROJECT_ID
    

    L'output è simile al seguente:

    CONSTRAINT                  LIST_POLICY    BOOLEAN_POLICY    ETAG
    custom.enableGkeAutopilot   -              SET               COCsm5QGENiXi2E=
    

Dopo aver applicato il criterio, attendi circa due minuti per consentire a Google Cloud di iniziare ad applicare i criteri.

Testa il criterio

Prova a creare un cluster GKE Standard nel progetto:

gcloud container clusters create org-policy-test \
    --project=PROJECT_ID \
    --zone=COMPUTE_ZONE \
    --num-nodes=1

L'output è il seguente:

Operation denied by custom org policies: ["customConstraints/custom.enableGkeAutopilot": "All new clusters must be Autopilot clusters."]

Esempi di vincoli personalizzati per i casi d'uso comuni

Le sezioni seguenti forniscono la sintassi di alcuni vincoli personalizzati che potrebbero trovare utile:

Descrizione Sintassi del vincolo
Consenti la creazione di cluster solo quando Autorizzazione binaria è abilitata
    name: organizations/ORGANIZATION_ID/customConstraints/custom.gkeBinaryAuthorization
    resourceTypes:
    - container.googleapis.com/Cluster
    methodTypes:
    - CREATE
    condition: "condition:resource.binaryAuthorization.enabled == true || resource.binaryAuthorization.evaluationMode=='PROJECT_SINGLETON_POLICY_ENFORCE'"
    action: ALLOW
    displayName: Enable GKE Binary Authorization
    description: All new clusters must enable Binary Authorization.
Non disattivare l'upgrade automatico dei nodi per i nuovi pool di nodi
    name: organizations/ORGANIZATION_ID/customConstraints/custom.enableAutoUpgrade
    resourceTypes:
    - container.googleapis.com/NodePool
    methodTypes:
    - CREATE
    condition: "resource.management.autoUpgrade == true"
    actionType: ALLOW
    displayName: Enable node auto-upgrade
    description: All node pools must have node auto-upgrade enabled.
Abilita la federazione delle identità per i carichi di lavoro per GKE per i nuovi cluster
    name: organizations/ORGANIZATION_ID/customConstraints/custom.enableWorkloadIdentity
    resourceTypes:
    - container.googleapis.com/Cluster
    methodTypes:
    - CREATE
    condition: "has(resource.workloadIdentityConfig.workloadPool) || resource.workloadIdentityConfig.workloadPool.size() > 0"
    actionType: ALLOW
    displayName: Enable Workload Identity on new clusters
    description: All new clusters must use Workload Identity.
Non disabilitare Cloud Logging sui cluster esistenti
    name: organizations/ORGANIZATION_ID/customConstraints/custom.enableLogging
    resourceTypes:
    - container.googleapis.com/Cluster
    methodTypes:
    - UPDATE
    condition: "resource.loggingService == 'none'"
    actionType: DENY
    displayName: Do not disable Cloud Logging
    description: You cannot disable Cloud Logging on existing GKE cluster.
Consenti la creazione o l'aggiornamento di pool di nodi standard solo se legacy gli endpoint dei metadati sono disabilitati
    name: organizations/ORGANIZATION_ID/customConstraints/custom.nodeConfigMetadata
    resourceTypes:
    - container.googleapis.com/NodePool
    methodTypes:
    - CREATE
    - UPDATE
    condition: "'disable-legacy-endpoints' in resource.config.metadata && resource.config.metadata['disable-legacy-endpoints'] == 'true'"
    actionType: ALLOW
    displayName: Disable legacy metadata endpoints
    description: You can only create or update node pools if you disable legacy
    metadata endpoints.

Questo esempio di vincolo mostra come impostare un vincolo personalizzato su un valore mappa. Il campo condition utilizza il parametro operatore di indice il chiave mappa disable-legacy-endpoints. Se utilizzi invece la sintassi di selezione dei campi normale, come negli esempi precedenti, viene visualizzato un errore INVALID_CUSTOM_CONSTRAINT_CONDITION.

Passaggi successivi