GitHub Actions を使用して Azure Kubernetes Service (AKS) ノードに自動セキュリティ アップグレードを適用する

セキュリティ更新プログラムは、基になる OS の最新の修正プログラムに対する AKS クラスターのセキュリティとコンプライアンスを維持するための重要な部分です。 これらの更新プログラムには、OS のセキュリティ修正プログラムやカーネルの更新プログラムが含まれています。 一部の更新プログラムでは、プロセスを完了するためにノードの再起動が必要です。

この記事では、GitHub Actions と Azure CLI を使用して AKS ノードの更新プロセスを自動化し、自動的に実行される cron に基づいて更新タスクを作成する方法について説明します。

注

また、ノード イメージのアップグレードを自動的に実行し、計画メンテナンスを使用してこれらのアップグレードをスケジュールすることもできます。 詳細については、「ノード イメージを自動的にアップグレードする」を参照してください。

開始する前に

  • この記事は、AKS クラスターがすでに存在していることを前提としています。 AKS クラスターが必要な場合は、Azure CLI、Azure PowerShell、または Azure portal を使用して作成します。
  • また、この記事では、 GitHub アカウント と、アクションをホストするための プロファイル リポジトリ があることを前提としています。 リポジトリがない場合は、GitHub ユーザー名と同じ名前のリポジトリを作成します。
  • Azure CLI バージョン 2.0.59 以降がインストールされて構成されている必要があります。 バージョンを確認するには、az --version を実行します。 インストールまたはアップグレードが必要な場合は、Azure CLI のインストールを参照してください。

を使用してノードを更新する az aks upgrade

az aks upgrade コマンドを使用すると、ダウンタイムをゼロにして更新プログラムを適用できます。 このコマンドは、次のアクションを実行します。

  1. すべてのクラスターのノードに最新の更新プログラムを適用します。
  2. ノードへのトラフィックを遮断 (ノードを新しいワークロードのスケジュール設定に使用できないようにする) および、ドレイン (存在するワークロードを他のノードに移動する) します。
  3. ノードを再起動します。
  4. 更新されたノードがトラフィックを再び受信できるようにします。

別の方法を使用してノードを更新しても、AKS はノードを自動的に再起動しません。

注

az aks upgrade フラグを指定して--node-image-onlyを実行すると、ノード イメージのみがアップグレードされます。 フラグを指定せずにコマンドを実行すると、ノード イメージと Kubernetes コントロール プレーンのバージョンの両方がアップグレードされます。 詳細については、 ノードでのマネージド アップグレードのドキュメント と 、クラスターのアップグレードに関するドキュメントを参照してください。

すべての Kubernetes ノードは、標準の Windows または Linux ベースの Azure 仮想マシン (VM) で実行されます。 Linux ベースの VM は、OS が構成された Ubuntu イメージを使用して、毎晩更新プログラムを自動的にチェックします。

az aks upgrade コマンドを実行すると、Azure CLI により、最新のセキュリティおよびカーネル更新プログラムが適用されたノードが新たに作成されます。 これらの新しいノードは、更新が完了するまで最初は隔離され、アプリが割り当てられないようにされます。 更新が完了すると、Azure は古いノードを立ち入り禁止にして排出し、新しいノードで立ち入り禁止を解除し、スケジュールされたすべてのアプリケーションを新しいノードに転送します。

このプロセスは、Linux ベースのカーネルを手動で更新するよりも優れています。これは、新しいカーネル更新プログラムをインストールするときに Linux を再起動する必要があるためです。 OS を手動で更新する場合は、VM を再起動し、すべてのアプリを手動で切断してドレインする必要もあります。

タイミングの設定された GitHub アクションを作成する

cron は、一連のコマンドまたは ジョブを自動スケジュールで実行できるユーティリティです。 自動スケジュールで AKS ノードを更新するジョブを作成するには、アクションをホストするためのリポジトリが必要です。 GitHub Actions は通常、アプリケーションと同じリポジトリで構成されますが、任意のリポジトリを使用できます。

  1. GitHub でリポジトリに移動します。

  2. [アクション] を選択します。

  3. [新しいワークフロー] を選択>ワークフローを自分で設定します。

  4. 午前 3 時に 15 日ごとに実行するスケジュール トリガーを使用して、 クラスター ノード イメージのアップグレード という名前の GitHub アクションを作成します。 次のコードを YAML にコピーします。

    name: Upgrade cluster node images
    on:
      schedule:
        - cron: '0 3 */15 * *'
    
  5. Ubuntu エージェントで実行され、Azure CLI アカウントに接続してノード アップグレード コマンドを実行する upgrade-node という名前のジョブを作成します。 on キーの下の YAML に次のコードをコピーします。

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

ワークフローで Azure CLI を設定する

  1. アクションのマーケットプレイスで「Azure Login」を検索バーに入力します。

  2. [ Azure ログイン] を選択します。

    2 つの行を示す検索結果。最初のアクションは

  3. [ インストール] で、 v1.4.6 などのバージョンを選択し、インストール コード スニペットをコピーします。

  4. steps キーと次の情報をインストール コード スニペットから 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 }}
    

Azure CLI の資格情報を作成する

  1. 新しいブラウザー ウィンドウで、 az ad sp create-for-rbac コマンドを使用して新しいサービス プリンシパルを作成します。 *{subscriptionID}*を自分のサブスクリプション ID に置き換えてください。

    注

    この例では、Contributor スコープで ロールを作成します。 ニーズに合ったロールとスコープを指定できます。 詳細については、 Azure の組み込みロール と Azure RBAC スコープ レベルに関するページを参照してください。

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

    出力は次の出力例のようになります:

    {
      "appId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
      "displayName": "xxxxx-xxx-xxxx-xx-xx-xx-xx-xx",
      "password": "xxxxxxxxxxxxxxxxxxxxxxxxxxxx",
      "tenant": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
    }
    
  2. 出力をコピーし、GitHub リポジトリに移動します。

  3. 設定>Secrets と変数>Actions>新しいリポジトリ シークレットを選択します。

  4. 名前には、AZURE_CREDENTIALSを入力します。

  5. シークレットの場合は、サービス プリンシパルの作成時に受信した出力の内容をコピーします。

  6. [ シークレットの追加] を選択します。

Azure CLI コマンドを実行する手順を作成する

  1. ワークフロー YAML を使用してウィンドウに移動します。

  2. [Search Marketplace for Actions] バーで、[Azure CLI アクション] を検索します。

  3. [Azure CLI アクション] を選択します。

  4. [ インストール] で、 v1.0.8 などのバージョンを選択し、インストール コード スニペットをコピーします。

  5. 次の例のように、アクションの内容を *Azure Login* ステップの下の 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 }}
          - name: Upgrade node images
            uses: Azure/cli@v1.0.8
            with:
              inlineScript: az aks upgrade --resource-group <resourceGroupName> --name <aksClusterName> --node-image-only --yes
    

    ヒント

    --resource-groupの場合と同様に、新しいリポジトリ シークレットを作成することで、--nameパラメーターとAZURE_CREDENTIALS パラメーターをコマンドから切り離すことができます。

    これらのパラメーターのシークレットを作成する場合は、 <resourceGroupName> プレースホルダーと <aksClusterName> プレースホルダーを、対応するシークレットに置き換える必要があります。 たとえば、 ${{secrets.RESOURCE_GROUP_NAME}} や ${{secrets.AKS_CLUSTER_NAME}}

  6. YAML の名前を upgrade-node-images.yml に変更します。

  7. [ 変更のコミット...] を選択し、コミット メッセージを追加して、[ 変更のコミット] を選択します。

GitHub アクションを手動で実行する

スケジュールされた実行に加えて、ワークフローを手動で実行するには、onという新しいworkflow_dispatch トリガーを追加します。

注

クラスター上のすべてのノード プールではなく単一ノード プールをアップグレードする場合は、 --name パラメーターを az aks nodepool upgrade コマンドに追加して、ノード プール名を指定します。 例えば次が挙げられます。

az aks nodepool upgrade --resource-group <resourceGroupName> --cluster-name <aksClusterName> --name <nodePoolName> --node-image-only
  • workflow_dispatch キーの下にon トリガーを追加します。

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

    YAML は次の例のようになります。

        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
    

次のステップ

AKS のアップグレードの詳細については、次の記事とリソースを参照してください。

アップグレードのベスト プラクティスとその他の考慮事項の詳細については、「AKS のパッチとアップグレードのガイダンス」を参照してください。