Applicare aggiornamenti della sicurezza e del kernel ai nodi Linux nel servizio Azure Kubernetes

Per proteggere i cluster, gli aggiornamenti di sicurezza vengono applicati automaticamente ai nodi Linux nel servizio Azure Kubernetes. Questi aggiornamenti includono correzioni della sicurezza del sistema operativo o gli aggiornamenti del kernel. Alcuni di questi aggiornamenti richiedono il riavvio di un nodo per completare il processo. Il servizio Azure Kubernetes non riavvia automaticamente i nodi Linux per completare il processo di aggiornamento.

Il processo per mantenere aggiornati i nodi Windows Server è leggermente diverso. I nodi server Windows non ricevono aggiornamenti giornalieri. Si esegue invece un aggiornamento del servizio Azure Kubernetes che distribuisce nuovi nodi con l'immagine e le patch di Windows Server di base più recenti. Per i cluster del servizio Azure Kubernetes che usano nodi di Windows Server, vedere Aggiornare un pool di nodi nel servizio Azure Kubernetes.

Questo articolo illustra come usare kured (KUbernetes REboot Daemon) open source per controllare i nodi che richiedono un riavvio e gestire automaticamente la ripianificazione dei pod in esecuzione e il processo di riavvio del nodo.

Nota

Kured è un progetto open source in Cloud Native Computing Foundation. Indirizzare i problemi a Kured GitHub. Il supporto aggiuntivo è disponibile nel canale #kured su CNCF Slack.

Importante

Il software open source è citato nella documentazione e negli esempi di Azure Kubernetes. Il software distribuito viene escluso dai contratti di servizio del servizio Azure Kubernetes, dalla garanzia limitata e supporto tecnico di Azure. Quando si usa la tecnologia open source insieme al servizio Azure Kubernetes, consultare le opzioni di supporto disponibili dalle rispettive community e dai gestori di progetti per sviluppare un piano.

Ad esempio, il repository GitHub Ray descrive diverse piattaforme che variano in tempo di risposta, scopo e livello di supporto.

Microsoft si assume la responsabilità di creare i pacchetti open source distribuiti nel servizio Azure Kubernetes. Tale responsabilità include la proprietà completa del processo di compilazione, analisi, firma, convalida e hotfix, oltre al controllo sui file binari nelle immagini del contenitore. Per altre informazioni, vedere Gestione delle vulnerabilità per il servizio Azure Kubernetes e Copertura del supporto del servizio Azure Kubernetes.

Operazioni preliminari

È necessario che sia installata e configurata l'interfaccia della riga di comando di Azure 2.0.59 o versione 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.

Comprendere l'esperienza di aggiornamento del nodo del servizio Azure Kubernetes

In un cluster servizio Azure Kubernetes, i nodi Kubernetes vengono eseguiti come macchine virtuali di Azure (VM). Queste macchine virtuali basate su Linux usano un'immagine Ubuntu o Linux di Azure, con il sistema operativo configurato per verificare automaticamente la disponibilità di aggiornamenti ogni giorno. Se sono disponibili aggiornamenti della sicurezza o del kernel, vengono scaricati e installati automaticamente.

Processo di aggiornamento e riavvio del nodo servizio Azure Kubernetes con kured

Alcuni aggiornamenti di sicurezza, ad esempio gli aggiornamenti del kernel, richiedono un riavvio del nodo per finalizzare il processo. Un nodo Linux che richiede un riavvio crea un file denominato /var/run/reboot-required. Questo processo di riavvio non avviene automaticamente.

È possibile usare i propri flussi di lavoro e processi per gestire i riavvii del nodo, oppure utilizzare kured per dirigere il processo. Con kured, viene distribuito un DaemonSet che esegue un pod in ogni nodo Linux del cluster. Questi pod nel DaemonSet verificano la presenza del file /var/run/reboot-required, quindi avviano un processo di riavvio dei nodi.

Aggiornamenti delle immagini del nodo

Gli aggiornamenti automatici applicano aggiornamenti al sistema operativo del nodo Linux, ma l'immagine usata per creare nodi per il cluster rimane invariata. Se viene aggiunto un nuovo nodo Linux al cluster, l'immagine originale viene usata per creare il nodo. Questo nuovo nodo riceve tutti gli aggiornamenti della sicurezza e del kernel disponibili durante il controllo automatico ogni giorno, ma rimane senza patch finché non vengono completati tutti i controlli e i riavvii.

In alternativa, è possibile usare l'aggiornamento dell'immagine del nodo per verificare e aggiornare le immagini dei nodi usate dal cluster. Per altre informazioni sull'aggiornamento delle immagini del nodo, vedere Aggiornamento dell'immagine del nodo del servizio Azure Kubernetes (AKS).

Aggiornamenti del nodo

È disponibile un altro processo nel servizio Azure Kubernetes che consente di aggiornare un cluster. In genere, un aggiornamento è un passaggio a una versione più recente di Kubernetes, non solo l'applicazione di aggiornamenti di sicurezza del nodo. Un aggiornamento di servizio Azure Kubernetes esegue le azioni seguenti:

  • Un nuovo nodo viene distribuito con gli aggiornamenti di sicurezza e la versione di Kubernetes applicati più recenti.
  • Un nodo precedente viene chiuso e svuotato.
  • I pod vengono pianificati sul nuovo nodo.
  • Il nodo precedente viene eliminato.

Non è possibile mantenere la stessa versione di Kubernetes durante un evento di aggiornamento. È necessario specificare una versione più recente di Kubernetes. Per eseguire l'aggiornamento alla versione più recente di Kubernetes, è possibile aggiornare il cluster servizio Azure Kubernetes.

Distribuire kured in un cluster servizio Azure Kubernetes

Per distribuire kured DaemonSet, installare il seguente grafico Helm Kured ufficiale. In questo modo viene creato un ruolo e un ruolo del cluster, associazioni e un account del servizio, quindi viene distribuito DaemonSet usando kured.

# Add the Kured Helm repository
helm repo add kubereboot https://kubereboot.github.io/charts/

# Update your local Helm chart repository cache
helm repo update

# Create a dedicated namespace where you would like to deploy kured into
kubectl create namespace kured

# Install kured in that namespace with Helm 3 (only on Linux nodes, kured is not working on Windows nodes)
helm install my-release kubereboot/kured --namespace kured --set controller.nodeSelector."kubernetes\.io/os"=linux

È anche possibile configurare parametri aggiuntivi per kured, ad esempio l'integrazione con Prometheus o Slack. Per altre informazioni sui parametri di configurazione, vedere il grafico Helm Kured.

Aggiornare i nodi del cluster

Per impostazione predefinita, i nodi Linux nel servizio Azure Kubernetes controllano la disponibilità di aggiornamenti ogni sera. Se non si vuole attendere, è possibile eseguire manualmente un aggiornamento per verificare che l'esecuzione di kured avvenga correttamente. In primo luogo, seguire la procedura per creare una connessione SSH a uno dei nodi servizio Azure Kubernetes. Dopo aver creato una connessione SSH al nodo Linux, verificare la presenza di aggiornamenti e applicarli come indicato di seguito:

sudo apt-get update && sudo apt-get upgrade -y

Se sono stati applicati gli aggiornamenti che richiedono un riavvio del nodo, viene scritto un file in /var/run/reboot-required. Kured verifica la presenza di nodi che richiedono un riavvio ogni 60 minuti per impostazione predefinita.

Monitorare e controllare il processo di riavvio

Quando una delle repliche in DaemonSet rileva che è necessario un riavvio del nodo, viene inserito un blocco sul nodo tramite l'API di Kubernetes. Questo blocco impedisce la pianificazione di più pod nel nodo. Inoltre, il blocco indica che deve essere riavviato solo un nodo alla volta. Con il nodo bloccato, i pod in esecuzione vengono rimossi dal nodo, che viene quindi riavviato.

È possibile monitorare lo stato dei nodi usando il comando kubectl get nodes. L'output di esempio seguente mostra un nodo con lo stato SchedulingDisabled mentre si prepara per il processo di riavvio:

NAME                       STATUS                     ROLES     AGE       VERSION
aks-nodepool1-28993262-0   Ready,SchedulingDisabled   agent     1h        v1.11.7

Una volta completato il processo di aggiornamento, è possibile visualizzare lo stato dei nodi usando il comando kubectl get nodes con il parametro --output wide. Questo output consente di visualizzare una differenza nella VERSIONE-KERNEL dei nodi sottostanti, come illustrato nell'output di esempio seguente. aks-nodepool1-28993262-0 è stato aggiornato in un passaggio precedente e mostra la versione del kernel 4.15.0-1039-azure. Il nodo aks-nodepool1-28993262-1 che non è stato aggiornato mostra la versione del kernel 4.15.0-1037-azure.

NAME                       STATUS    ROLES     AGE       VERSION   INTERNAL-IP   EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME
aks-nodepool1-28993262-0   Ready     agent     1h        v1.11.7   10.240.0.4    <none>        Ubuntu 16.04.6 LTS   4.15.0-1039-azure   docker://3.0.4
aks-nodepool1-28993262-1   Ready     agent     1h        v1.11.7   10.240.0.5    <none>        Ubuntu 16.04.6 LTS   4.15.0-1037-azure   docker://3.0.4

Passaggi successivi

Questo articolo illustra in dettaglio come usare kured per riavviare automaticamente i nodi Linux come parte del processo di aggiornamento della sicurezza. Per eseguire l'aggiornamento alla versione più recente di Kubernetes, è possibile aggiornare il cluster servizio Azure Kubernetes.

Per i cluster del servizio Azure Kubernetes che usano nodi di Windows Server, vedere Aggiornare un pool di nodi nel 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.