Share via


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

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

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

Note

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

開始する前に

  • この記事は、AKS クラスターがすでに存在していることを前提としています。 AKS クラスターが必要な場合は、Azure CLIAzure 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 はノードを自動的に再起動しません。

Note

--node-image-only フラグを指定して az aks upgrade を実行すると、ノード イメージのみがアップグレードされます。 フラグを指定せずにコマンドを実行すると、ノード イメージと 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. [New workflow] (新しいワークフロー)>[Set up a workflow yourself] (ワークフローを自分で設定する) の順に選択します。

  4. 15 日ごと午前 3 時に実行するスケジュール トリガーを使用して、Upgrade cluster node images という名前 の 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. [Search Marketplace for Actions] (アクションの Marketplace の検索) バーで、[Azure ログイン] を検索します。

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

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

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

  4. インストール コード スニペットから YAML に steps キーと次の情報を追加します。

    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 に置き換えます。

    Note

    この例では、"サブスクリプション" スコープで 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. [設定]>[シークレットと変数]>[アクション]>[新しいリポジトリ シークレット] を選択します。

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

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

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

Azure CLI コマンドを実行するステップを作成する

  1. ワークフロー YAML でウィンドウに移動します。

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

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

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

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

    ヒント

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

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

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

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

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

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

Note

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

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

    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 のパッチとアップグレードのガイダンス」を参照してください。