Applicare gli aggiornamenti della sicurezza e del kernel ai nodi Linux in servizio Azure Kubernetes (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 di Windows Server è leggermente diverso. I nodi di Windows Server 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 il kured open source (KUbernetes REboot Daemon) per watch per i nodi Linux che richiedono un riavvio, quindi gestire automaticamente la riprogrammazione dei pod in esecuzione e del processo di riavvio del nodo.

Nota

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

Prima di iniziare

È necessaria l'interfaccia della riga di comando di Azure versione 2.0.59 o successiva installata e configurata. 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 watch per l'esistenza del file /var/run/reboot-required e quindi avviare un processo per riavviare i 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 del nodo usate dal cluster. Per altre informazioni sull'aggiornamento delle immagini del nodo, vedere aggiornamento dell'immagine del nodo servizio Azure Kubernetes (servizio Azure Kubernetes).

Aggiornamenti del nodo

Esiste 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 grafico Helm Kured ufficiale seguente. In questo modo viene creato un ruolo e un ruolo del cluster, associazioni e un account del servizio, quindi distribuisce il 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 ottenuto una connessione SSH al nodo Linux, verificare la disponibilità di aggiornamenti e applicarli come segue:

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 nel DaemonSet ha rilevato 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 in KERNEL-VERSION 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.