Appliquer automatiquement des mises à niveau de sécurité aux nœuds Azure Kubernetes service (AKS) avec GitHub Actions

Les correctifs de sécurité sont un élément essentiel de la gestion de la sécurité et de la conformité de votre cluster AKS à l’aide des derniers correctifs pour le système d’exploitation sous-jacent. Ces mises à jour incluent des correctifs de sécurité ou des mises à jour du noyau. Certaines mises à jour nécessitent un redémarrage du nœud pour terminer le processus.

Cet article vous montre comment automatiser le processus de mise à jour des nœuds AKS avec GitHub Actions et Azure CLI pour créer une tâche de mise à jour basée sur cron qui s’exécute automatiquement.

Remarque

Vous pouvez aussi effectuer automatiquement des mises à niveau d’images de nœud et les planifier avec une maintenance planifiée. Pour plus d’informations, consultez Mettre à niveau automatiquement les images de nœud.

Avant de commencer

  • Cet article suppose que vous disposez d’un cluster AKS. Si vous avez besoin d’un cluster AKS, créez-en un à l'aide d’Azure CLI, d’Azure PowerShell ou du portail Azure.
  • Cet article suppose également que vous avez un compte GitHub et un dépôt de profil pour héberger vos actions. Si vous n’avez pas de dépôt, créez-en un en lui donnant comme nom votre nom d’utilisateur GitHub.
  • La version 2.0.59 ou ultérieure d’Azure CLI doit être installée et configurée. Exécutez az --version pour trouver la version. Si vous devez installer ou mettre à niveau, voir Installer Azure CLI.

Mettre à jour des nœuds avec az aks upgrade

La commande az aks upgrade vous permet d’appliquer des mises à jour sans temps d’arrêt. La commande effectue les actions suivantes :

  1. Applique les dernières mises à jour à tous les nœuds de votre cluster.
  2. Boucle (rend le nœud indisponible pour la planification de nouvelles charges de travail) et draine (déplace les charges de travail existantes vers un autre nœud) le trafic sur les nœuds.
  3. Redémarre les nœuds.
  4. Permet aux nœuds mis à jour de recevoir à nouveau le trafic.

AKS ne redémarre pas automatiquement vos nœuds si vous les mettez à jour avec d’autres méthodes.

Remarque

L’exécution de az aks upgrade avec l’indicateur --node-image-only met uniquement à niveau les images de nœud. L’exécution de la commande sans l’indicateur met à niveau les images de nœud et la version du plan de contrôle Kubernetes. Pour plus d’informations, consultez la documentation sur les mises à niveau managées des nœuds et la documentation sur les mises à niveau de cluster.

Tous les nœuds Kubernetes s’exécutent dans une machine virtuelle Azure standard Windows ou basée sur Linux. Les machines virtuelles Linux utilisent une image Ubuntu avec le système d’exploitation configuré pour rechercher automatiquement les mises à jour toutes les nuits.

Quand vous utilisez la commande az aks upgrade, Azure CLI crée un flot de nouveaux nœuds avec les dernières mises à jour de sécurité et de noyau. Ces nouveaux nœuds sont initialement bouclés pour empêcher les applications d’être planifiées sur eux avant la fin de la mise à jour. Une fois la mise à jour terminée, Azure boucle et draine les anciens nœuds, et déboucle les nouveaux, en transférant toutes les applications planifiées vers les nouveaux nœuds.

Ce processus est préférable à la mise à jour manuelle des noyaux basés sur Linux, car Linux nécessite un redémarrage lorsqu’une nouvelle mise à jour du noyau est installée. Si vous mettez à jour le système d’exploitation manuellement, vous devez également redémarrer la machine virtuelle et bloquer et drainer manuellement toutes les applications.

Créer une action GitHub chronométrée

cron est un utilitaire qui vous permet d’exécuter un ensemble de commandes, ou des travaux, selon une planification automatisée. Pour créer un travail afin de mettre à jour vos nœuds AKS selon une planification automatisée, vous avez besoin d’un dépôt pour héberger vos actions. Les actions GitHub sont généralement configurées dans le même dépôt que votre application, mais vous pouvez utiliser n’importe quel dépôt.

  1. Accédez à votre dépôt sur GitHub.

  2. Sélectionnez Actions.

  3. Sélectionnez Nouveau workflow>Configurer un workflow vous-même.

  4. Créez une action GitHub nommée Upgrade cluster node images avec un déclencheur de planification à exécuter tous les 15 jours à 3 h 00. Copiez le code suivant dans le fichier YAML :

    name: Upgrade cluster node images
    on:
      schedule:
        - cron: '0 3 */15 * *'
    
  5. Créez un travail nommé upgrade-node qui s’exécute sur un agent Ubuntu et se connecte à votre compte Azure CLI pour exécuter la commande de mise à niveau de nœud. Copiez le code suivant dans le fichier YAML sous la clé on :

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

Configurer Azure CLI dans le workflow

  1. Dans la barre Rechercher des actions dans la Place de marché, recherchez Connexion Azure.

  2. Sélectionnez Connexion Azure.

    Search results showing two lines, the first action is called 'Azure Login' and the second 'Azure Container Registry Login'

  3. Sous Installation, sélectionnez une version, par exemple, v1.4.6, puis copiez l’extrait de code d’installation.

  4. Ajoutez la clé steps et les informations suivantes de l’extrait de code d’installation au fichier 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 }}
    

Créer des informations d’identification pour Azure CLI

  1. Dans une nouvelle fenêtre de navigateur, créez un principal de service avec la commande az ad sp create-for-rbac. Veillez à remplacer *{subscriptionID}* par votre propre ID d’abonnement.

    Remarque

    Cet exemple crée le rôle Contributor dans l’étendue Abonnement. Vous pouvez fournir le rôle et l’étendue qui répondent à vos besoins. Pour plus d’informations, consultez les articles Rôles intégrés Azure et Niveaux d’étendue Azure RBAC.

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

    Votre résultat devrait être semblable à l’exemple de sortie suivant :

    {
      "appId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
      "displayName": "xxxxx-xxx-xxxx-xx-xx-xx-xx-xx",
      "password": "xxxxxxxxxxxxxxxxxxxxxxxxxxxx",
      "tenant": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
    }
    
  2. Copiez la sortie et accédez à votre dépôt GitHub.

  3. Sélectionnez Paramètres>Secrets et variables>Actions>Nouveau secret de dépôt.

  4. Pour Nom, entrez AZURE_CREDENTIALS.

  5. Pour Secret, copiez le contenu de la sortie que vous avez reçue quand vous avez créé le principal de service.

  6. Cliquez sur Ajouter un secret.

Créer les étapes nécessaires à l’exécution des commandes Azure CLI

  1. Accédez à votre fenêtre avec le fichier YAML du workflow.

  2. Dans la barre Rechercher des actions dans la Place de marché, recherchez Action Azure CLI.

  3. Sélectionnez Action Azure CLI.

    Search result for 'Azure CLI Action' with first result being shown as made by Azure

  4. Sous Installation, sélectionnez une version, par exemple, v1.0.8, puis copiez l’extrait de code d’installation.

  5. Collez le contenu de l’action dans le fichier YAML sous l’étape *Azure Login*, comme dans l’exemple suivant :

    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 -g {resourceGroupName} -n {aksClusterName} --node-image-only --yes
    

    Conseil

    Vous pouvez dissocier les paramètres -g et -n de la commande en créant des secrets de dépôt comme vous l’avez fait pour AZURE_CREDENTIALS.

    Si vous créez des secrets pour ces paramètres, vous devez remplacer les espaces réservés {resourceGroupName} et {aksClusterName} par les secrets équivalents. Par exemple : ${{secrets.RESOURCE_GROUP_NAME}} et ${{secrets.AKS_CLUSTER_NAME}}

  6. Renommez le fichier YAML en upgrade-node-images.yml.

  7. Sélectionnez Commiter les changements..., ajoutez un message de commit, puis sélectionnez Commiter les changements.

Exécuter l’action GitHub manuellement

Vous pouvez exécuter le workflow manuellement en plus de l’exécution planifiée en ajoutant un nouveau déclencheur on appelé workflow_dispatch.

Remarque

Si vous voulez mettre à niveau un seul pool de nœuds au lieu de tous les pools de nœuds du cluster, ajoutez le paramètre --name à la commande az aks nodepool upgrade pour spécifier le nom du pool de nœuds. Par exemple :

az aks nodepool upgrade -g {resourceGroupName} --cluster-name {aksClusterName} --name {{nodePoolName}} --node-image-only
  • Ajouter le déclencheur workflow_dispatch sous la clé on :

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

    Le fichier YAML doit ressembler à l’exemple suivant :

        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
    

Étapes suivantes

Pour plus d’informations sur les mises à niveau AKS, consultez les articles et ressources suivants :

Pour obtenir une discussion détaillée sur les bonnes pratiques de mise à niveau et d’autres considérations, consultez Instructions de mise à jour corrective et de mise à niveau AKS.