Freigeben über


Anwenden automatischer Sicherheitsupgrades auf Azure Kubernetes Service (AKS)-Knoten mithilfe von GitHub Actions

Sicherheitsupdates sind ein wesentlicher Bestandteil der Aufrechterhaltung der Sicherheit und Compliance Ihres AKS-Clusters mit den neuesten Korrekturen für das zugrunde liegende Betriebssystem. Diese Updates enthalten Sicherheitsfixes für das Betriebssystem oder Kernelupdates. Einige Updates erfordern einen Neustart des Knotens, um den Vorgang abzuschließen.

In diesem Artikel erfahren Sie, wie Sie den Aktualisierungsprozess von AKS-Knoten mithilfe von GitHub Actions und Azure CLI automatisieren können, um eine Aktualisierungsaufgabe basierend auf dieser cron zu erstellen, die automatisch ausgeführt wird.

Hinweis

Sie können Knotenimageupgrades auch automatisch durchführen und diese Upgrades mit geplanter Wartung planen. Weitere Informationen finden Sie unter Automatisches Upgrade von Knotenimages.

Voraussetzungen

  • In diesem Artikel wird vorausgesetzt, dass Sie über einen AKS-Cluster verfügen. Wenn Sie einen AKS-Cluster benötigen, erstellen Sie einen mithilfe der Azure CLI, von Azure PowerShell oder des Azure-Portals.
  • In diesem Artikel wird außerdem davon ausgegangen, dass Sie über ein GitHub-Konto und ein Profil-Repository verfügen, um Ihre Aktionen zu hosten. Wenn Sie noch nicht über ein Repository verfügen, erstellen Sie ein neues Repository mit dem gleichen Namen wie Ihr GitHub-Benutzername.
  • Azure CLI-Version 2.0.59 oder höher muss installiert und konfiguriert sein. Führen Sie az --version aus, um die Version zu ermitteln. Informationen zum Durchführen einer Installation oder eines Upgrades finden Sie bei Bedarf unter Installieren der Azure CLI.

Aktualisieren von Knoten mit az aks upgrade

Mit dem Befehl az aks upgrade haben Sie die Möglichkeit, Updates ohne Ausfallzeiten anzuwenden. Mit dem Befehl werden die folgenden Aktionen ausgeführt:

  1. Wendet die neuesten Updates auf alle Knoten Ihres Clusters an.
  2. Sperrt (macht den Knoten für die Planung neuer Workloads nicht verfügbar) und leert (verschiebt die vorhandenen Workloads auf andere Knoten) Datenverkehr auf die Knoten.
  3. Startet den Knoten neu.
  4. Ermöglicht es den aktualisierten Knoten, den Datenverkehr wieder zu empfangen.

AKS startet Ihre Knoten nicht automatisch neu, wenn Sie sie mit einer anderen Methode aktualisieren.

Hinweis

Wenn az aks upgrade mit dem --node-image-only-Flag ausgeführt wird, werden nur die Knotenimages aktualisiert. Wenn Sie den Befehl ohne das Flag ausführen, werden sowohl die Knotenimages als auch die Kubernetes-Steuerungsebenenversion aktualisiert. Weitere Informationen finden Sie in den Dokumenten für verwaltete Upgrades auf Knoten und den Dokumenten für Clusterupgrades.

Alle Kubernetes-Knoten werden auf einem standardmäßigen Windows- oder Linux-basierten virtuellen Azure-Computer (VM) ausgeführt. Bei Linux-basierten VMs wird ein Ubuntu-Image verwendet, wobei das Betriebssystem so konfiguriert ist, dass automatisch jede Nacht nach Updates gesucht wird.

Wenn Sie den az aks upgrade-Befehl verwenden, erstellt Azure CLI einen Anstieg neuer Knoten mit den neuesten Sicherheits- und Kernelupdates. Diese neuen Knoten werden zunächst abgesperrt, um zu verhindern, dass Apps auf ihnen geplant werden, bis das Update abgeschlossen ist. Nach Abschluss des Updates sperrt und leert Azure die älteren Knoten und entsperrt die neuen, wobei alle geplanten Anwendungen auf die neuen Knoten übertragen werden.

Dieser Prozess ist besser als ein manuelles Update von Linux-basierten Kernels, da unter Linux bei der Installation eines neuen Kernelupdates ein Neustart erforderlich ist. Wenn Sie das Betriebssystem manuell aktualisieren, müssen Sie auch die VM neu starten und alle Anwendungen manuell sperren und ausgleichen.

Erstellen einer zeitgesteuerten GitHub-Aktion

cron ist ein Hilfsprogramm, mit dem Sie eine Gruppe von Befehlen, oder Aufträgen, nach einem automatisierten Zeitplan ausführen können. Um einen Auftrag zum Aktualisieren der AKS-Knoten nach einem automatisierten Zeitplan erstellen zu können, benötigen Sie ein Repository zum Hosten der Aktionen. GitHub Actions werden im gleichen Repository wie die Anwendung konfiguriert, Sie können jedoch auch ein anderes Repository verwenden.

  1. Navigieren Sie zu Ihrem Repository in GitHub.

  2. Wählen Sie Aktionen aus.

  3. Wählen Sie Neuer Workflow>Eigenen Workflow einrichten aus.

  4. Erstellen Sie eine GitHub Action namens Clusterknotenimages upgraden mit einem Zeitplantrigger, der alle 15 Tage um 3 Uhr ausgeführt werden soll. Kopieren Sie den folgenden Code in die YAML-Datei:

    name: Upgrade cluster node images
    on:
      schedule:
        - cron: '0 3 */15 * *'
    
  5. Erstellen Sie einen Auftrag namens upgrade-node, der auf einem Ubuntu-Agent ausgeführt wird und eine Verbindung mit Ihrem Azure CLI-Konto herstellt, um den Knotenupgradebefehl auszuführen. Kopieren Sie den folgenden Code unter dem on-Schlüssel in die YAML-Datei:

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

Einrichten der Azure-Befehlszeilenschnittstelle im Workflow

  1. Suchen Sie in der Leiste Marketplace nach Aktionen durchsuchen nach Azure-Anmeldung.

  2. Wählen Sie Azure Login (Azure-Anmeldung) aus.

    Suchergebnisse mit zwei Zeilen: erste Aktion: „Azure Login“ (Azure-Anmeldung), zweite Aktion: „Azure Container Registry Login“ (Azure Container Registry-Anmeldung)

  3. Wählen Sie unter Installation eine Version aus, z. B. v1.4.6, und kopieren Sie den Installations-Codeschnipsel.

  4. Fügen Sie den steps-Schlüssel und die folgenden Informationen aus dem Installations-Codeschnipsel zur YAML-Datei hinzu:

    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 }}
    

Erstellen von Anmeldeinformationen für die Azure CLI

  1. Erstellen Sie in einem neuen Browserfenster mithilfe des az ad sp create-for-rbac-Befehls einen neuen Dienstprinzipal. Stellen Sie sicher, dass Sie *{subscriptionID}* mit Ihrer eigenen Abonnement-ID ersetzen.

    Hinweis

    In diesem Beispiel wird die Contributor Rolle im Bereich Subscription (Abonnement) erstellt. Sie können die Rolle und den Bereich angeben, die Ihren Anforderungen entsprechen. Weitere Informationen finden Sie unter Integrierte Azure-Rollen und Azure RBAC-Bereichsebenen.

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

    Ihre Ausgabe sollte der folgenden Beispielausgabe ähneln:

    {
      "appId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
      "displayName": "xxxxx-xxx-xxxx-xx-xx-xx-xx-xx",
      "password": "xxxxxxxxxxxxxxxxxxxxxxxxxxxx",
      "tenant": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
    }
    
  2. Kopieren Sie die Ausgabe, und navigieren Sie zu Ihrem GitHub-Repository.

  3. Wählen Sie Einstellungen>Geheimnisse und Variablen>Aktionen>Neues Repositorygeheimnis aus.

  4. Geben Sie unter NameAZURE_CREDENTIALS ein.

  5. Kopieren Sie für Geheimnis den Inhalt der Ausgabe, die Sie beim Erstellen des Dienstprinzipals erhalten haben.

  6. Wählen Sie Geheimnis hinzufügen aus.

Erstellen der Schritte zum Ausführen von Azure CLI-Befehlen

  1. Navigieren Sie zu Ihrem Fenster mit der Workflow-YAML.

  2. Suchen Sie in der Leiste Marketplace nach Aktionen durchsuchen nach Azure CLI-Aktion.

  3. Wählen Sie Azure CLI-Aktion aus.

    Suchergebnis für „Azure CLI Action“ (Azure CLI-Aktion). Das erste Ergebnis wird als von Azure veröffentlicht angezeigt.

  4. Wählen Sie unter Installation eine Version wie z. B. v1.0.8 aus, und kopieren Sie den Installations-Codeschnipsel.

  5. Fügen Sie den Inhalt der Aktion in die YAML-Datei unterhalb des *Azure Login*-Schritts ein, ähnlich wie im folgenden Beispiel:

    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
    

    Tipp

    Sie können die --resource-group- und --name-Parameter vom Befehl entkoppeln, indem Sie neue Repositoryschlüssel erstellen, wie Sie es für AZURE_CREDENTIALS getan haben.

    Wenn Sie Geheimnisse für diese Parameter erstellen, müssen Sie die <resourceGroupName>- und <aksClusterName>-Platzhalter durch ihre Geheimnis-Entsprechungen ersetzen. Beispiel: ${{secrets.RESOURCE_GROUP_NAME}} und ${{secrets.AKS_CLUSTER_NAME}}

  6. Benennen Sie die YAML in upgrade-node-images.yml um.

  7. Wählen Sie Änderungen übernehmen ... aus, fügen Sie eine Commit-Nachricht hinzu und wählen Sie dann Änderungen übernehmen aus.

Manuelles Ausführen der GitHub-Aktion

Sie können den Workflow zusätzlich zur geplanten Ausführung manuell ausführen, indem Sie einen neuen on-Trigger mit der Bezeichnung workflow_dispatch hinzufügen.

Hinweis

Wenn Sie einen einzelnen Knotenpool anstelle aller Knotenpools im Cluster aktualisieren möchten, fügen Sie dem Befehl az aks nodepool upgrade den Parameter --name hinzu, um den Namen des Knotenpools anzugeben. Beispiel:

az aks nodepool upgrade --resource-group <resourceGroupName> --cluster-name <aksClusterName> --name <nodePoolName> --node-image-only
  • Fügen Sie den workflow_dispatch-Trigger unter dem on-Schlüssel hinzu:

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

    Die YAML-Datei sollte dem folgenden Beispiel ähneln:

        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
    

Nächste Schritte

Weitere Informationen zu AKS-Upgrades finden Sie in den folgenden Artikeln und Ressourcen:

Eine ausführliche Erläuterung zu Best Practices für Upgrades und anderen Überlegungen finden Sie unter Patch- und Upgradeanleitungen für AKS.