Compartilhar via


Aplicar atualizações automáticas de segurança aos nós do AKS (Serviço de Kubernetes do Azure) usando o GitHub Actions

As atualizações de segurança são uma parte fundamental da manutenção da segurança do cluster do AKS e da conformidade com as correções mais recentes para o sistema operacional subjacente. Essas atualizações incluem correções de segurança do SO ou atualizações de kernel. Algumas atualizações exigem uma reinicialização de nó para concluir o processo.

Este artigo mostra como você pode automatizar o processo de atualização de nós do AKS usando o GitHub Actions e a CLI do Azure para criar uma tarefa de atualização com base no cron que é executado automaticamente.

Observação

Você também pode executar atualizações automáticas das imagens dos nós e agendar essas atualizações por meio de manutenção programada. Para obter mais informações, confira Atualizar automaticamente as imagens do nó.

Antes de começar

  • Este artigo considera que você tenha um cluster do AKS. Se você precisar de um cluster AKS, crie um usando a CLI do Azure, Azure PowerShell ou portal do Azure.
  • Este artigo também pressupõe que você tenha uma conta do GitHub e um repositório de perfil para hospedar suas ações. Se você não tiver um repositório, crie um com o mesmo nome que o nome de usuário do GitHub.
  • Será necessária a CLI do Azure versão 2.0.59 ou posterior instalada e configurada. Execute az --version para encontrar a versão. Se você precisa instalar ou atualizar, consulte Instalar a CLI do Azure.

Atualizar nós com az aks upgrade

O az aks upgrade comando oferece uma maneira de aplicar atualizações com zero tempo de inatividade. O comando executa as seguintes ações:

  1. Aplica as atualizações mais recentes a todos os nós do cluster.
  2. Bloqueia (torna o nó indisponível para o agendamento de novas cargas de trabalho) e drena (move as cargas de trabalho existentes para outro nó) tráfego para os nós.
  3. Reinicia os nós.
  4. Permite que os nós atualizados recebam tráfego novamente.

O AKS não reiniciará automaticamente seus nós se você atualizá-los usando um método diferente.

Observação

Executar az aks upgrade com o sinalizador --node-image-only atualiza apenas as imagens do nó. Executar o comando sem o sinalizador atualiza as imagens do nó e a versão do painel de controle do Kubernetes. Para obter mais informações, consulte os documentos para atualizações gerenciadas em nós e os documentos para atualizações de cluster.

Todos os nós do Kubernetes são executados em uma VM (máquina virtual) do Azure baseada no Windows ou linux padrão. As VMs baseadas em Linux usam uma imagem do Ubuntu com o sistema operacional configurado para verificar automaticamente se há atualizações todas as noites.

Quando você usa o comando, a az aks upgrade CLI do Azure cria uma onda de novos nós com as atualizações de segurança e kernel mais recentes. Esses novos nós são inicialmente isolados para impedir que qualquer aplicativo seja agendado para eles até que a atualização seja concluída. Após a conclusão da atualização, o Azure isola e drena os nós mais antigos e libera os novos, transferindo todos os aplicativos agendados para os novos nós.

Esse processo é melhor do que atualizar os kernels baseados em Linux manualmente porque o Linux requer uma reinicialização quando uma nova atualização do kernel é instalada. Se você atualizar o sistema operacional manualmente, também precisará reinicializar a VM e manualmente restringir e esvaziar todos os aplicativos.

Criar uma ação do GitHub cronometrada

cron é um utilitário que permite executar um conjunto de comandos ou trabalhos em um agendamento automatizado. Para criar uma tarefa que atualize os nós do AKS em um cronograma automatizado, você precisa de um repositório para armazenar e executar suas ações. As Ações do GitHub geralmente são configuradas no mesmo repositório que seu aplicativo, mas você pode usar qualquer repositório.

  1. Navegue até o repositório no GitHub.

  2. Selecione Ações.

  3. Selecione Novo fluxo de> trabalhoConfigurar um fluxo de trabalho por conta própria.

  4. Crie uma ação do GitHub chamada Atualizar imagens de nó de cluster com um gatilho de agendamento a ser executado a cada 15 dias às 3h. Copie o seguinte código para o YAML:

    name: Upgrade cluster node images
    on:
      schedule:
        - cron: '0 3 */15 * *'
    
  5. Crie um trabalho chamado upgrade-node que executa em um agente do Ubuntu e se conecta à sua conta da CLI do Azure para executar o comando de atualização do nó. Copie o seguinte código em YAML na chave on:

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

Configurar a CLI do Azure no fluxo de trabalho

  1. Na barra Pesquisar ações no Marketplace, procure por Azure Login.

  2. Selecione Logon do Azure.

    Resultados da pesquisa mostrando duas linhas: a primeira ação é chamada de

  3. Em Instalação, selecione uma versão, como v1.4.6, e copie o snippet de código de instalação.

  4. Adicione a chave steps e as seguintes informações do snippet de código de instalação ao 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 }}
    

Criar credenciais para a CLI do Azure

  1. Em uma nova janela do navegador, crie uma nova entidade de serviço usando o comando az ad sp create-for-rbac. Certifique-se de substituir *{subscriptionID}* pelo seu próprio ID de assinatura.

    Observação

    Este exemplo cria a função Contributor no escopo da Assinatura. Você pode fornecer a função e o escopo que atendem às suas necessidades. Para obter mais informações, consulte as funções internas do Azure e os níveis de escopo do RBAC do Azure.

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

    Sua saída deve ser semelhante à saída do exemplo a seguir:

    {
      "appId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
      "displayName": "xxxxx-xxx-xxxx-xx-xx-xx-xx-xx",
      "password": "xxxxxxxxxxxxxxxxxxxxxxxxxxxx",
      "tenant": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
    }
    
  2. Copie a saída e navegue até o repositório GitHub.

  3. Selecione Configurações>Segredos e variáveis>Ações>Novo segredo do repositório.

  4. Para Nome, insira AZURE_CREDENTIALS.

  5. Para Segredo, copie o conteúdo da saída que você recebeu ao criar a entidade de serviço.

  6. Selecione Adicionar Segredo.

Criar as etapas para executar os comandos da CLI do Azure

  1. Navegue até sua janela com o YAML de fluxo de trabalho.

  2. Na barra Pesquisar ações no Marketplace, procure por Azure CLI Action.

  3. Selecione a ação da CLI do Azure.

    Resultado da pesquisa para a 'Ação da CLI do Azure' com o primeiro resultado sendo mostrado como feito pelo Azure

  4. Em Instalação, selecione uma versão, como v1.0.8, e copie o snippet de código de instalação.

  5. Cole o conteúdo da ação no YAML abaixo da *Azure Login* etapa, semelhante ao exemplo a seguir:

    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
    

    Dica

    Você pode desacoplar os parâmetros --resource-group e --name do comando criando novos segredos do repositório como fez para AZURE_CREDENTIALS.

    Se você criar segredos para esses parâmetros, você precisará substituir os espaços reservados <resourceGroupName> e <aksClusterName> por seus segredos equivalentes. Por exemplo, ${{secrets.RESOURCE_GROUP_NAME}} e ${{secrets.AKS_CLUSTER_NAME}}

  6. Renomeie o YAML para upgrade-node-images.yml.

  7. Selecione Confirmar alterações..., adicione uma mensagem de confirmação e selecione Confirmar alterações.

Executar a ação do GitHub manualmente

Você pode executar o fluxo de trabalho manualmente além da execução agendada adicionando um novo on gatilho chamado workflow_dispatch.

Observação

Se você quiser atualizar um único pool de nós em vez de todos os pools de nós no cluster, adicione o parâmetro --name ao comando az aks nodepool upgrade para especificar o nome do pool de nós. Por exemplo:

az aks nodepool upgrade --resource-group <resourceGroupName> --cluster-name <aksClusterName> --name <nodePoolName> --node-image-only
  • Adicione o gatilho workflow_dispatch na chave on:

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

    O YAML deve ser semelhante ao exemplo a seguir:

        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
    

Próximas etapas

Para obter mais informações sobre atualizações do AKS, consulte os seguintes artigos e recursos:

Para obter uma discussão detalhada sobre as melhores práticas de atualização e outras considerações, veja Diretrizes de patch e atualização do AKS.