Partilhar via


Aplicar atualizações de segurança e kernel a nós do Linux no Azure Kubernetes Service (AKS)

Para proteger os clusters, as atualizações de segurança são aplicadas automaticamente aos nós do Linux no AKS. Estas atualizações incluem correções de segurança do SO ou atualizações de kernel. Algumas destas atualizações requerem um reinício do nó para concluir o processo. O AKS não reinicia automaticamente estes nós do Linux para concluir o processo de atualização.

O processo para manter os nós do Windows Server atualizados é um pouco diferente. Os nós do Windows Server não recebem atualizações diárias. Em vez disso, executa uma atualização do AKS que implementa novos nós com a imagem e patches do Windows Server base mais recentes. Para clusters do AKS que utilizam nós do Windows Server, veja Atualizar um conjunto de nós no AKS.

Este artigo mostra-lhe como utilizar o kured open source (KUbernetes REboot Daemon) para watch para nós do Linux que requerem um reinício e, em seguida, processar automaticamente o reagendamento de pods em execução e o processo de reinício do nó.

Nota

Kured é um projeto open source no Cloud Native Computing Foundation. Direcione os problemas para o GitHub kured. Pode encontrar suporte adicional no canal de #kured no CNCF Slack.

Antes de começar

Precisa da versão 2.0.59 ou posterior da CLI do Azure instalada e configurada. Executar az --version para localizar a versão. Se precisar de instalar ou atualizar, veja Install Azure CLI (Instalar o Azure CLI).

Compreender a experiência de atualização do nó do AKS

Num cluster do AKS, os nós do Kubernetes são executados como máquinas virtuais (VMs) do Azure. Estas VMs baseadas em Linux utilizam uma imagem do Ubuntu ou do Linux do Azure, com o SO configurado para procurar atualizações automaticamente todos os dias. Se estiverem disponíveis atualizações de segurança ou kernel, estas são transferidas e instaladas automaticamente.

Atualização e reinício do nó do AKS com kured

Algumas atualizações de segurança, como atualizações de kernel, requerem um reinício do nó para finalizar o processo. Um nó do Linux que requer um reinício cria um ficheiro com o nome /var/run/reboot-required. Este processo de reinício não ocorre automaticamente.

Pode utilizar os seus próprios fluxos de trabalho e processos para processar reinícios de nós ou utilizar kured para orquestrar o processo. Com kuredo , é implementado um DaemonSet que executa um pod em cada nó do Linux no cluster. Estes pods no DaemonSet watch para a existência do ficheiro /var/run/reboot-required e, em seguida, iniciam um processo para reiniciar os nós.

Atualizações da imagem do nó

As atualizações automáticas aplicam atualizações ao SO do nó do Linux, mas a imagem utilizada para criar nós para o cluster permanece inalterada. Se for adicionado um novo nó do Linux ao cluster, a imagem original é utilizada para criar o nó. Este novo nó recebe todas as atualizações de segurança e kernel disponíveis durante a verificação automática todos os dias, mas permanece inalterado até que todas as verificações e reinícios estejam concluídos.

Em alternativa, pode utilizar a atualização da imagem do nó para procurar e atualizar as imagens de nós utilizadas pelo cluster. Para obter mais informações sobre a atualização da imagem do nó, veja atualização da imagem do nó Azure Kubernetes Service (AKS).

Atualizações de nós

Existe outro processo no AKS que lhe permite atualizar um cluster. Normalmente, uma atualização é para mudar para uma versão mais recente do Kubernetes e não apenas para aplicar atualizações de segurança de nós. Uma atualização do AKS executa as seguintes ações:

  • É implementado um novo nó com as atualizações de segurança mais recentes e a versão do Kubernetes aplicada.
  • Um nó antigo está isolado e drenado.
  • Os pods estão agendados no novo nó.
  • O nó antigo é eliminado.

Não pode permanecer na mesma versão do Kubernetes durante um evento de atualização. Tem de especificar uma versão mais recente do Kubernetes. Para atualizar para a versão mais recente do Kubernetes, pode atualizar o cluster do AKS.

Implementar o kured num cluster do AKS

Para implementar o kured DaemonSet, instale o seguinte gráfico oficial do Kured Helm. Esta ação cria uma função e uma função de cluster, enlaces e uma conta de serviço e, em seguida, implementa o DaemonSet com 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

Também pode configurar parâmetros adicionais para kured, como a integração com o Prometheus ou o Slack. Para obter mais informações sobre os parâmetros de configuração, veja o gráfico Kured Helm.

Atualizar nós de cluster

Por predefinição, os nós do Linux no AKS procuram atualizações todas as noites. Se não quiser esperar, pode efetuar manualmente uma atualização para verificar se kured é executada corretamente. Primeiro, siga os passos para SSH para um dos nós do AKS. Assim que tiver uma ligação SSH ao nó do Linux, procure atualizações e aplique-as da seguinte forma:

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

Se forem aplicadas atualizações que exijam um reinício do nó, será escrito um ficheiro em /var/run/reboot-required. Kured verifica se existem nós que requerem um reinício a cada 60 minutos por predefinição.

Monitorizar e rever o processo de reinício

Quando uma das réplicas do DaemonSet detetou que é necessário reiniciar um nó, é colocado um bloqueio no nó através da API do Kubernetes. Este bloqueio impede que mais pods sejam agendados no nó. O bloqueio também indica que apenas um nó deve ser reiniciado de cada vez. Com o nó isolado, os pods em execução são drenados do nó e o nó é reiniciado.

Pode monitorizar o estado dos nós com o comando kubectl get nodes . O resultado de exemplo seguinte mostra um nó com o estado SchedulingDisabled à medida que o nó se prepara para o processo de reinício:

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

Assim que o processo de atualização estiver concluído, pode ver o estado dos nós com o comando kubectl get nodes com o --output wide parâmetro . Este resultado permite-lhe ver uma diferença em KERNEL-VERSION dos nós subjacentes, conforme mostrado na saída de exemplo seguinte. O aks-nodepool1-28993262-0 foi atualizado num passo anterior e mostra a versão de kernel 4.15.0-1039-azure. O nó aks-nodepool1-28993262-1 que não foi atualizado mostra a versão de 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

Passos seguintes

Este artigo detalhou como utilizar kured para reiniciar os nós do Linux automaticamente como parte do processo de atualização de segurança. Para atualizar para a versão mais recente do Kubernetes, pode atualizar o cluster do AKS.

Para clusters do AKS que utilizam nós do Windows Server, veja Atualizar um conjunto de nós no AKS.