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
- Questo articolo presuppone che si disponga di un cluster del servizio Azure Kubernetes esistente. Se è necessario un cluster del servizio Azure Kubernetes, crearne uno usando l'interfaccia della riga di comando di Azure, Azure PowerShell o il portale di Azure.
- Questo articolo presuppone anche di avere un account GitHub e un repository di profili per ospitare le azioni. Se non si ha un repository, crearne uno con lo stesso nome del nome utente di GitHub.
- È necessario che sia installata e configurata l'interfaccia della riga di comando di Azure versione 2.0.59 o successiva. Eseguire
az --version
per trovare la versione. Se è necessario eseguire l'installazione o l'aggiornamento, vedere Installare l'interfaccia della riga di comando di Azure.
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:
- Applica gli aggiornamenti più recenti a tutti i nodi del cluster.
- 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.
- Riavvia i nodi.
- 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.
Passare al repository in GitHub.
Seleziona Azioni.
Selezionare Nuovo flusso di lavoro>Configurare da soli un flusso di lavoro.
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 * *'
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
Nella barra Cerca nel Marketplace per azioni cercare Azure Login.
Selezionare Accesso ad Azure.
In Installazione, selezionare una versione, ad esempio v1.4.6 e copiare il frammento di codice di installazione.
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
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" }
Copiare l'output e passare al repository GitHub.
Selezionare Impostazioni>Segreti e variabili>Azioni>Nuovo segreto del repository.
Per Nome inserisci
AZURE_CREDENTIALS
.Per Segreto, copiare il contenuto dell'output ricevuto al momento della creazione dell'entità servizio.
Seleziona Aggiungi segreto.
Creare i passaggi per eseguire i comandi dell'interfaccia della riga di comando di Azure
Passare alla finestra con il flusso di lavoro YAML.
Nella barra Cerca nel Marketplace per azioni cercare Azione dell'interfaccia della riga di comando di Azure.
Selezionare azione dell'interfaccia della riga di comando di Azure.
In Installazione selezionare una versione, ad esempio v1.0.8 e copiare il frammento di codice di installazione.
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 --resource-group <resourceGroupName> --name <aksClusterName> --node-image-only --yes
Suggerimento
È possibile separare i parametri
--resource-group
e--name
dal comando creando nuovi segreti del repository come è stato fatto perAZURE_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}}
Rinominare YAML in
upgrade-node-images.yml
.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 --resource-group <resourceGroupName> --cluster-name <aksClusterName> --name <nodePoolName> --node-image-only
Aggiungere il trigger
workflow_dispatch
sotto la chiave dion
: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:
- Note sulla versione del servizio Azure Kubernetes
- Aggiornare un cluster del servizio Azure Kubernetes
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.
Azure Kubernetes Service