Applicare aggiornamenti automatici della sicurezza ai nodi del servizio Azure Kubernetes usando GitHub Actions

Gli aggiornamenti della sicurezza sono una parte fondamentale della gestione della sicurezza e della conformità del cluster del servizio Azure Kubernetes con le correzioni più recenti per il sistema operativo sottostante. Questi aggiornamenti includono correzioni della sicurezza del sistema operativo o gli aggiornamenti del kernel. Alcuni aggiornamenti richiedono un riavvio del nodo per completare il processo.

Questo articolo illustra come automatizzare il processo di aggiornamento dei nodi del servizio Azure Kubernetes usando GitHub Actions e l'interfaccia della riga di comando di Azure per creare un'attività di aggiornamento basata su cron che viene eseguita automaticamente.

Nota

È anche possibile eseguire aggiornamenti automatici delle immagini del nodo e pianificare questi aggiornamenti usando la manutenzione pianificata. Per altre informazioni, vedere Aggiornare automaticamente le immagini dei nodi.

Operazioni preliminari

Aggiornare i nodi con az aks upgrade

Il comando az aks upgrade consente di applicare gli aggiornamenti senza tempi di inattività. Questo comando esegue le azioni seguenti:

  1. Applica gli aggiornamenti più recenti a tutti i nodi del cluster.
  2. Cordons (rende il nodo non disponibile per la pianificazione dei nuovi carichi di lavoro) e svuota (sposta i carichi di lavoro esistenti in altri nodi) verso i nodi.
  3. Riavvia i nodi.
  4. Consente ai nodi aggiornati di ricevere di nuovo il traffico.

Il servizio Azure Kubernetes non riavvia automaticamente i nodi se vengono aggiornati usando un metodo diverso.

Nota

L'esecuzione di az aks upgrade con il flag --node-image-only aggiorna solo le immagini del nodo. L'esecuzione del comando senza il flag aggiorna sia le immagini del nodo che la versione del piano di controllo Kubernetes. Per altre informazioni, vedere la documentazione relativa agli aggiornamenti gestiti nei nodi e la documentazione per gli aggiornamenti del cluster.

Tutti i nodi Kubernetes vengono eseguiti in una macchina virtuale (VM) di Azure basata su Windows o Linux standard. Le macchine virtuali basate su Linux usano un'immagine Ubuntu con il sistema operativo configurato per verificare automaticamente la disponibilità di aggiornamenti ogni notte.

Quando si usa il comando az aks upgrade, l'interfaccia della riga di comando di Azure crea un picco di nuovi nodi con gli aggiornamenti più recenti della sicurezza e del kernel. Questi nuovi nodi vengono inizialmente bloccati per impedire che le app vengano pianificate fino al completamento dell'aggiornamento. Al termine dell'aggiornamento, Azure impedisce e svuota i nodi meno recenti e annulla i nuovi, trasferendo tutte le applicazioni pianificate ai nuovi nodi.

Questo processo è migliore rispetto all'aggiornamento manuale dei kernel basati su Linux perché Linux richiede un riavvio quando viene installato un nuovo aggiornamento del kernel. Se si aggiorna manualmente il sistema operativo, è anche necessario riavviare la macchina virtuale, con il blocco manuale e lo svuotamento di tutte le app.

Creare un'azione GitHub temporizzata

cron è un'utilità che consente di eseguire un set di comandi o processi in base a una pianificazione automatizzata. Per creare un processo per aggiornare i nodi del servizio Azure Kubernetes in base a una pianificazione automatizzata, è necessario un repository per ospitare le azioni. GitHub Actions viene in genere configurato nello stesso repository dell'applicazione, ma è possibile usare qualsiasi repository.

  1. Passare al repository in GitHub.

  2. Seleziona Azioni.

  3. Selezionare Nuovo flusso di lavoro>Configurare da soli un flusso di lavoro.

  4. Creare un'azione GitHub denominata Aggiornare le immagini dei nodi del cluster con un trigger di pianificazione da eseguire ogni 15 giorni alle 3:00. Copiare il codice seguente in YAML:

    name: Upgrade cluster node images
    on:
      schedule:
        - cron: '0 3 */15 * *'
    
  5. Creare un processo denominato upgrade-node che viene eseguito in un agente Ubuntu e si connette all'account dell'interfaccia della riga di comando di Azure per eseguire il comando di aggiornamento del nodo. Copiare il codice seguente in YAML sotto la chiave on:

    jobs:
      upgrade-node:
        runs-on: ubuntu-latest
    

Configurare l'interfaccia della riga di comando di Azure nel flusso di lavoro

  1. Nella barra Cerca nel Marketplace per azioni cercare Azure Login.

  2. Selezionare Accesso ad Azure.

    Search results showing two lines, the first action is called 'Azure Login' and the second 'Azure Container Registry Login'

  3. In Installazione, selezionare una versione, ad esempio v1.4.6 e copiare il frammento di codice di installazione.

  4. Aggiungere la chiave steps e le informazioni seguenti dal frammento di codice di installazione a YAML:

    name: Upgrade cluster node images
    on:
      schedule:
        - cron: '0 3 */15 * *'
    jobs:
      upgrade-node:
        runs-on: ubuntu-latest
        steps:
          - name: Azure Login
            uses: Azure/login@v1.4.6
            with:
              creds: ${{ secrets.AZURE_CREDENTIALS }}
    

Creare credenziali per l'interfaccia della riga di comando di Azure

  1. In una nuova finestra del browser creare una nuova entità servizio usando il comando az ad sp create-for-rbac. Assicurarsi di sostituire *{subscriptionID}* con il proprio ID sottoscrizione.

    Nota

    In questo esempio viene creato il ruolo Contributor nell'ambito sottoscrizione. È possibile fornire il ruolo e l'ambito che soddisfano le proprie esigenze. Per altre informazioni, vedere Ruoli predefiniti di Azure e livelli di ambito di Controllo degli accessi in base al ruolo di Azure.

    az ad sp create-for-rbac --role Contributor --scopes /subscriptions/{subscriptionID} -o json
    

    L'output dovrebbe essere simile all'output di esempio seguente:

    {
      "appId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
      "displayName": "xxxxx-xxx-xxxx-xx-xx-xx-xx-xx",
      "password": "xxxxxxxxxxxxxxxxxxxxxxxxxxxx",
      "tenant": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
    }
    
  2. Copiare l'output e passare al repository GitHub.

  3. Selezionare Impostazioni>Segreti e variabili>Azioni>Nuovo segreto del repository.

  4. Per Nome inserisci AZURE_CREDENTIALS.

  5. Per Segreto, copiare il contenuto dell'output ricevuto al momento della creazione dell'entità servizio.

  6. Seleziona Aggiungi segreto.

Creare i passaggi per eseguire i comandi dell'interfaccia della riga di comando di Azure

  1. Passare alla finestra con il flusso di lavoro YAML.

  2. Nella barra Cerca nel Marketplace per azioni cercare Azione dell'interfaccia della riga di comando di Azure.

  3. Selezionare azione dell'interfaccia della riga di comando di Azure.

    Search result for 'Azure CLI Action' with first result being shown as made by Azure

  4. In Installazione selezionare una versione, ad esempio v1.0.8 e copiare il frammento di codice di installazione.

  5. Incollare il contenuto dell'azione in YAML sotto il passaggio *Azure Login*, simile all'esempio seguente:

    name: Upgrade cluster node images
    on:
      schedule:
        - cron: '0 3 */15 * *'
    jobs:
      upgrade-node:
        runs-on: ubuntu-latest
        steps:
          - name: Azure Login
            uses: Azure/login@v1.4.6
            with:
              creds: ${{ secrets.AZURE_CREDENTIALS }}
          - name: Upgrade node images
            uses: Azure/cli@v1.0.8
            with:
              inlineScript: az aks upgrade -g {resourceGroupName} -n {aksClusterName} --node-image-only --yes
    

    Suggerimento

    È possibile separare i parametri -g e -n dal comando creando nuovi segreti del repository come è stato fatto per AZURE_CREDENTIALS.

    Se si creano segreti per questi parametri, è necessario sostituire i segnaposto {resourceGroupName} e {aksClusterName} con le relative controparti segrete. Ad esempio, ${{secrets.RESOURCE_GROUP_NAME}} e ${{secrets.AKS_CLUSTER_NAME}}

  6. Rinominare YAML in upgrade-node-images.yml.

  7. Selezionare Conferma modifiche..., aggiungere un messaggio di commit e quindi selezionare Conferma modifiche.

Eseguire Manualmente GitHub Action

È possibile eseguire manualmente il flusso di lavoro oltre all'esecuzione pianificata aggiungendo un nuovo trigger di on denominato workflow_dispatch.

Nota

Se si vuole aggiornare un pool a nodo singolo anziché tutti i pool di nodi nel cluster, aggiungere il parametro --name al comando az aks nodepool upgrade per specificare il nome del pool di nodi. Ad esempio:

az aks nodepool upgrade -g {resourceGroupName} --cluster-name {aksClusterName} --name {{nodePoolName}} --node-image-only
  • Aggiungere il trigger workflow_dispatch sotto la chiave di on:

    name: Upgrade cluster node images
    on:
      schedule:
        - cron: '0 3 */15 * *'
      workflow_dispatch:
    

    Il codice YAML dovrebbe essere simile all'esempio seguente:

        name: Upgrade cluster node images
        on:
          schedule:
            - cron: '0 3 */15 * *'
          workflow_dispatch:
        jobs:
          upgrade-node:
            runs-on: ubuntu-latest
            steps:
              - name: Azure Login
                uses: Azure/login@v1.4.6
                with:
                  creds: ${{ secrets.AZURE_CREDENTIALS }}
              - name: Upgrade node images
                uses: Azure/cli@v1.0.8
                with:
                  inlineScript: az aks upgrade -g {resourceGroupName} -n {aksClusterName} --node-image-only --yes
              # Code for upgrading one or more node pools
    

Passaggi successivi

Per altre informazioni sugli aggiornamenti del servizio Azure Kubernetes, vedere gli articoli e le risorse seguenti:

Per una descrizione dettagliata delle procedure consigliate per l'aggiornamento e altre considerazioni, vedere Linee guida per l'aggiornamento e le patch del servizio Azure Kubernetes.