Partilhar via


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

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

Este artigo mostra-lhe como pode automatizar o processo de atualização dos nós AKS usando GitHub Actions e Azure CLI para criar uma tarefa de atualização baseada nisso cron que corre automaticamente.

Observação

Também pode realizar atualizações automáticas da imagem dos nós e agendar essas atualizações usando a manutenção planeada. Para obter mais informações, consulte Atualizar automaticamente imagens de nó.

Antes de começar

  • Este artigo pressupõe que você tenha um cluster AKS existente. Se você precisar de um cluster AKS, crie um usando a CLI do Azure, o Azure PowerShell ou o portal do Azure.
  • Este artigo também assume que tens uma conta no GitHub e um repositório de perfil para alojar as tuas ações. Se não tiveres um repositório, cria um com o mesmo nome do teu nome de utilizador no GitHub.
  • Você precisa da CLI do Azure versão 2.0.59 ou posterior instalada e configurada. Executar az --version para localizar a versão. Se precisar de instalar ou atualizar, consulte Install Azure CLI.

Atualizar nós com az aks upgrade

O comando az aks upgrade oferece uma forma sem interrupção para aplicar atualizações. O comando executa as seguintes ações:

  1. Aplica as atualizações mais recentes a todos os nós do teu cluster.
  2. Cordons (torna o nó indisponível para o agendamento de novas cargas de trabalho) e drena (move as cargas existentes para outros nós) 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 reinicia automaticamente os teus nós se os atualizares usando um método diferente.

Observação

Executar az aks upgrade com a flag --node-image-only só atualiza as imagens dos nós. Executar o comando sem a bandeira atualiza tanto as imagens dos nós como a versão do plano de controlo do Kubernetes. Para mais informações, consulte a documentação para atualizações geridas em nós e a documentação para atualizações de cluster.

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

Quando usas o az aks upgrade comando, o Azure CLI cria uma vaga de novos nós com as últimas atualizações de segurança e kernel. Estes novos nós são inicialmente isolados para evitar que quaisquer aplicações sejam agendadas até que a atualização esteja concluída. Após a conclusão da atualização, o Azure limita e drena os nós mais antigos e desliga os novos, transferindo todas as aplicações agendadas para os novos nós.

Este processo é melhor do que atualizar kernels baseados em Linux manualmente porque o Linux requer um reinício quando uma nova atualização do kernel é instalada. Se atualizares o sistema operativo manualmente, também tens de reiniciar a VM, limitando e drenando manualmente todas as aplicações.

Criar uma ação temporizada no GitHub

cron é uma ferramenta que permite executar um conjunto de comandos, ou tarefas, num horário automatizado. Para criar uma tarefa que atualize os seus nós AKS num agendamento automático, precisa de um repositório para hospedar as suas ações. As ações do GitHub são normalmente configuradas no mesmo repositório que a sua aplicação, mas pode usar qualquer repositório.

  1. Navegue até ao seu repositório no GitHub.

  2. Selecione Ações.

  3. Selecionar Novo fluxo de trabalho>Configure um fluxo de trabalho por si mesmo.

  4. Crie uma Ação do GitHub chamada Upgrade cluster node images com um gatilho de agendamento para executar 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 corra num agente Ubuntu e se ligue à sua conta Azure CLI para executar o comando node upgrade. Copie o seguinte código para o YAML sob a on chave:

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

Configura o Azure CLI no fluxo de trabalho

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

  2. Selecione Azure Login.

    Os resultados da pesquisa mostram duas linhas, a primeira ação chama-se 'Azure Login' e a segunda 'Azure Container Registry Login'

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

  4. Adicione a steps chave e a seguinte informação do excerto do 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 o Azure CLI

  1. Numa nova janela do navegador, crie um novo principal de serviço usando o az ad sp create-for-rbac comando. Certifique-se de substituir *{subscriptionID}* pelo seu próprio ID de subscrição.

    Observação

    Este exemplo cria a Contributor função no âmbito da Subscrição. Pode fornecer o papel e o âmbito que satisfaçam as suas necessidades. Para mais informações, consulte os papéis incorporados do Azure e os níveis de âmbito do Azure RBAC.

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

    Sua saída deve ser semelhante à saída de 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 o resultado e navegue até ao seu repositório GitHub.

  3. Selecionar Definições>Segredos e variáveis>Ações>Novo secreto do repositório.

  4. Em Nome, digite AZURE_CREDENTIALS.

  5. Para o Secret, copie o conteúdo da saída que recebeu quando criou o principal do serviço.

  6. Selecionar Adicionar Segredo.

Crie os passos para executar os comandos da CLI do Azure

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

  2. Na barra do Mercado de Pesquisa por Ações , pesquise por Azure CLI Action.

  3. Selecione Azure CLI Action.

    Resultado de pesquisa para 'Azure CLI Action', com o primeiro resultado mostrado como feito pelo Azure

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

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

    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
    

    Sugestão

    Pode desacoplar os parâmetros --resource-group e --name do comando criando novos segredos de repositório, como fez com AZURE_CREDENTIALS.

    Caso crie segredos para os parâmetros, precisas de substituir os marcadores <resourceGroupName> e <aksClusterName> pelos seus equivalentes secretos. Por exemplo, ${{secrets.RESOURCE_GROUP_NAME}} e ${{secrets.AKS_CLUSTER_NAME}}

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

  7. Selecione Commit as alterações..., adicione uma mensagem de commit e depois selecione Commit as alterações.

Executa a ação do GitHub manualmente

Pode executar o fluxo de trabalho manualmente além da execução agendada, adicionando um novo on trigger chamado workflow_dispatch.

Observação

Se quiseres atualizar um único pool de nós em vez de todos os pools de nós do cluster, adiciona o --name parâmetro ao az aks nodepool upgrade comando 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 workflow_dispatch gatilho por baixo da on tecla:

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

    O YAML deverá assemelhar-se ao seguinte exemplo:

        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óximos passos

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

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