Esercizio - Configurare Criteri di Azure per Kubernetes in un cluster del servizio Azure Kubernetes

Completato

Criteri di Azure per Kubernetes aiuta le organizzazioni a soddisfare i requisiti di governance e legali, implementare procedure consigliate e stabilire convenzioni organizzative per gli ambienti cloud.

I team di sviluppo dell'azienda stanno adottando il servizio Azure Kubernetes (AKS) come piattaforma di sviluppo. Ci si rende conto che il modo migliore per gestire i costi è imporre regole business che definiscono i limiti di risorse dei carichi di lavoro. Si vuole fare in modo che gli sviluppatori possano distribuire i carichi di lavoro solo entro limiti specifici di allocazione della memoria e della CPU. Il sistema deve impedire i carichi di lavoro che superano tali limiti.

In questo esercizio si abiliterà Criteri di Azure per il servizio Azure Kubernetes nel cluster e si aggiungeranno i limiti di CPU e risorse di memoria dei contenitori del cluster Kubernetes non devono superare i criteri specificati. Si verificherà quindi se il criterio nega la pianificazione dei carichi di lavoro che superano i parametri delle risorse dei criteri.

Abilitare i provider di risorse ContainerService e PolicyInsights

  1. Accedere ad Azure Cloud Shell usando il proprio account Azure. Selezionare la versione Bash di Cloud Shell.

  2. Per Criteri di Azure per il servizio Azure Kubernetes è necessaria la versione del cluster 1.14 o successiva. Eseguire lo script seguente per verificare la versione del cluster del servizio Azure Kubernetes:

    az aks list
    

    Assicurarsi che la versione del cluster restituita sia 1.14 o successiva.

  3. Registrare il provider del servizio Azure Kubernetes eseguendo il comando az provider register:

    az provider register --namespace Microsoft.ContainerService
    
  4. Registrare il provider di Criteri di Azure eseguendo il comando az provider register:

    az provider register --namespace Microsoft.PolicyInsights
    
  5. Abilitare l'installazione del componente aggiuntivo eseguendo il az feature register comando :

    az feature register --namespace Microsoft.ContainerService --name AKS-AzurePolicyAutoApprove
    
  6. Verificare che la registrazione abbia avuto esito positivo eseguendo una query sulla tabella feature-list. Usare il comando az feature list per eseguire la query. Per il completamento della registrazione della funzionalità sono necessari alcuni minuti, quindi è necessario controllare periodicamente il risultato.

    az feature list -o table --query "[?contains(name, 'Microsoft.ContainerService/AKS-AzurePolicyAutoApprove')].   {Name:name,State:properties.state}"
    

    Se si verifica il timeout della sessione di Cloud Shell, è possibile monitorare il processo di registrazione tramite il portale di Azure usando il riquadro di onboarding di anteprima.

  7. Eseguire il comando az provider register per propagare l'aggiornamento dopo aver verificato che il comando di query per l'elenco delle funzionalità restituisca "Registered":

    az provider register -n Microsoft.ContainerService
    

Abilitare Criteri di Azure nel cluster

  1. Eseguire il comando az aks enable-addons per abilitare il componente aggiuntivo azure-policy per il cluster:

    az aks enable-addons \
        --addons azure-policy \
        --name $AKS_CLUSTER_NAME \
        --resource-group $RESOURCE_GROUP
    
  2. Verificare che il pod dei criteri di Azure sia installato nello spazio dei nomi kube-system e che il pod gatekeeper sia installato nello spazio dei nomi gatekeeper-system. A tale scopo, eseguire i comandi kubectl get pods seguenti:

    kubectl get pods -n kube-system
    

    L'output dovrebbe essere simile al seguente:

    NAME                                    READY   STATUS    RESTARTS   AGE
    azure-policy-78c8d74cd4-7fqn2           1/1     Running   0          12m
    azure-policy-webhook-545c898766-gsjrc   1/1     Running   0          12m
    ...
    
    kubectl get pods -n gatekeeper-system
    

    L'output dovrebbe essere simile al seguente:

    NAME                                            READY   STATUS    RESTARTS   AGE
    gatekeeper-controller-manager-d5cd87796-5tmhq   1/1     Running   0          15m
    ...
    
  3. Infine, verificare che sia installato il componente aggiuntivo più recente eseguendo il comando az aks show. Questo comando recupera le informazioni di configurazione per il cluster.

    az aks show \
     --resource-group $RESOURCE_GROUP\
     --name $AKS_CLUSTER_NAME \
     -o table --query "addonProfiles.azurepolicy"
    

    L'output dovrebbe essere simile al seguente:

    {
        "config": null,
        "enabled": true,
        "identity": null
    }
    

    A questo punto è possibile passare al portale di Azure per configurare il criterio denominato Le risorse CPU e memoria dei contenitori nel cluster Kubernetes non devono superare i limiti specificati.

Assegnare una definizione dei criteri predefinita

Per configurare i nuovi criteri di Azure, usare il servizio Criteri nel portale di Azure.

  1. Accedi al portale di Azure.

  2. Individuare il servizio Criteri nel portale di Azure. A questo scopo, nella barra di ricerca in alto nel portale cercare e selezionare Criteri.

  3. Selezionare il servizio Criteri nell'elenco di servizi, come illustrato di seguito:

    Screenshot of the general Azure portal search box with a result that shows the Azure Policy service.

    Verrà visualizzato il dashboard Criteri con una panoramica che mostra tutti i criteri assegnati, lo stato delle risorse e il modo in cui i criteri influiscono su di esse. Se non sono stati assegnati criteri, il dashboard sarà vuoto.

  4. Nel riquadro dei menu a sinistra, in Creazione selezionare Assegnazioni:

    Screenshot of the Policy service navigation panel that shows the location of the Assignments option.

  5. Si ricordi dalla descrizione precedente che sono disponibili due opzioni per creare un'assegnazione di criteri: si assegna un'iniziativa o un criterio. Nella barra dei menu superiore selezionare Assegna criterio:

    Screenshot that shows the new policy assignment option.

    Viene visualizzato il riquadro Assegna criterio.

  6. Nella scheda Informazioni di base immettere i valori seguenti per ogni impostazione per creare il criterio.

    Impostazione Valore
    Scope
    Ambito Selezionare il pulsante con i puntini di sospensione. Viene visualizzato il riquadro Ambito. In Sottoscrizione selezionare la sottoscrizione contenente il gruppo di risorse. Per Gruppo di risorse selezionare rg-akscostsaving e quindi selezionare il pulsante Seleziona .
    Esclusioni Lasciare vuoto.
    Nozioni di base
    Definizione di criteri Selezionare il pulsante con i puntini di sospensione. Viene visualizzato il riquadro Definizioni disponibili. Nella casella Cerca filtrare la selezione immettendo CPU. Nella scheda Definizioni dei criteri selezionare i limiti di CPU e risorse di memoria per i contenitori del cluster Kubernetes, quindi selezionare Aggiungi.
    Nome dell'assegnazione Accettare l'impostazione predefinita.
    Descrizione Lasciare vuoto.
    Applicazione dei criteri Assicurarsi che questa opzione sia impostata su Abilitato.
    Assegnato da Accettare l'impostazione predefinita.

    Di seguito è illustrato un esempio di scheda Informazioni di base completata:

    Screenshot that shows the information captured in the Basics tab.

  7. Selezionare la scheda Parametri per specificare i parametri per il criterio.

  8. Immettere i valori seguenti per ogni opzione delle impostazioni dei parametri:

    Impostazione Valore
    Numero massimo di unità CPU consentite Impostare il valore su 200m. Il criterio imposta questo valore in base alle richieste di risorse dei carichi di lavoro e al valore limite per i carichi di lavoro specificato nel file manifesto del carico di lavoro.
    Numero massimo di byte di memoria consentiti Impostare il valore su 256Mi. Il criterio imposta questo valore in base alle richieste di risorse dei carichi di lavoro e al valore limite per i carichi di lavoro specificato nel file manifesto del carico di lavoro.

    Di seguito è illustrato un esempio di scheda Parametri completata:

    Screenshot that shows the information captured in the Parameters tab.

  9. Selezionare la scheda Correzione . In questa scheda si selezionerà il modo in cui il nuovo criterio influisce sulle risorse già esistenti. Per impostazione predefinita, il nuovo criterio controlla solo le risorse appena create. Mantenere la configurazione predefinita standard.

    Di seguito è illustrato un esempio di scheda Correzione completata:

    Screenshot that shows the information captured in the Remediation tab.

  10. Selezionare la scheda Rivedi e crea . Esaminare i valori scelti e quindi selezionare Crea.

Importante

Se si usa un cluster del servizio Azure Kubernetes esistente, l'assegnazione dei criteri potrebbe richiedere circa 15 minuti.

Testare le richieste di risorse

Il passaggio finale consiste nel testare il nuovo criterio. Distribuire il carico di lavoro di test con richieste di risorse e i limiti che violano il nuovo criterio. Se tutto funziona correttamente, il server restituisce un errore che indica che è stato negato dai criteri.

  1. Aprire Azure Cloud Shell e assicurarsi di selezionare la versione Bash di Cloud Shell.

  2. Creare un file manifesto per la distribuzione Kubernetes denominato usando l'editor integrato. Chiamare il file test-policy.yaml:

    code test-policy.yaml
    

    Suggerimento

    Cloud Shell include un editor di file integrato. L'editor di Cloud Shell supporta funzionalità quali l'evidenziazione del linguaggio, il riquadro comandi e uno strumento per l'esplorazione dei file. Per la creazione e la modifica di file semplici, avviare l'editor eseguendo code . nel terminale di Cloud Shell. Questa azione consente di aprire l'editor con la directory di lavoro attiva impostata nel terminale. Per aprire direttamente il file manifesto per la modifica rapida, eseguire code test-policy.yaml. Questo comando apre l'editor senza Esplora file.

  3. Incollare il testo seguente nel file:

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
      labels:
        env: test
    spec:
      containers:
      - name: nginx
        image: nginx
        imagePullPolicy: IfNotPresent
        resources:
          requests:
            cpu: 500m
            memory: 256Mi
          limits:
            cpu: 1000m
            memory: 500Mi
    
  4. Premere CTRL+S per salvare il file, quindi premere CTRL+Q per chiudere l'editor.

  5. Eseguire il comando kubectl apply per applicare la configurazione e distribuire l'applicazione nello spazio dei nomi costsavings:

    kubectl apply \
    --namespace costsavings \
    -f test-policy.yaml
    

    L'output dovrebbe essere simile al seguente:

    Error from server (
    [denied by azurepolicy-container-limits-52f2942767eda208f8ac3980dc04b548c4a18a2d1f7b0fd2cd1a7c9e50a92674] container <nginx> memory limit <500Mi> is higher than the maximum allowed of <256Mi>
    [denied by azurepolicy-container-limits-52f2942767eda208f8ac3980dc04b548c4a18a2d1f7b0fd2cd1a7c9e50a92674] container <nginx> cpu limit <1> is higher than the maximum allowed of <200m>)
     : error when creating "test-deploy.yml"
     : admission webhook "validation.gatekeeper.sh" denied the request: 
    [denied by azurepolicy-container-limits-52f2942767eda208f8ac3980dc04b548c4a18a2d1f7b0fd2cd1a7c9e50a92674] container <nginx> memory limit <500Mi> is higher than the maximum allowed of <256Mi>
    [denied by azurepolicy-container-limits-52f2942767eda208f8ac3980dc04b548c4a18a2d1f7b0fd2cd1a7c9e50a92674] container <nginx> cpu limit <1> is higher than the maximum allowed of <200m>
    

    Si noti che il webhook di ammissione, validation.gatekeeper.sh, ha negato la richiesta di pianificazione del pod.

  6. Aprire il file manifesto e correggere la richiesta di risorse:

    code test-policy.yaml
    

    Sostituire il testo con il testo seguente:

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
      labels:
        env: test
    spec:
      containers:
      - name: nginx
        image: nginx
        imagePullPolicy: IfNotPresent
        resources:
          requests:
            cpu: 200m
            memory: 256Mi
          limits:
            cpu: 200m
            memory: 256Mi
    
  7. Premere CTRL+S per salvare il file, quindi premere CTRL+Q per chiudere l'editor.

  8. Eseguire il comando kubectl apply per applicare la configurazione e distribuire l'applicazione nello spazio dei nomi costsavings:

    kubectl apply \
    --namespace costsavings \
    -f test-policy.yaml
    

    Si otterrà l'output seguente:

    pod/nginx created
    
  9. Recuperare i pod dei pod appena creati nello spazio dei nomi costsavings.

    kubectl get pods --namespace costsavings
    

    Entro pochi secondi si noterà che i pod passano allo stato Running.

    NAME    READY   STATUS    RESTARTS   AGE
    nginx   1/1     Running   0          50s
    
  10. Premere CTRL+C per interrompere il controllo dopo aver visualizzato i pod in esecuzione.