GitHub Actions を使用して Azure Kubernetes Service (AKS) ノードに自動セキュリティ アップグレードを適用する
セキュリティ更新プログラムは、AKS クラスターのセキュリティと、基になる OS の最新の修正プログラムへの準拠を維持するための重要な部分です。 これらの更新プログラムには、OS のセキュリティ修正プログラムやカーネルの更新プログラムが含まれています。 一部の更新プログラムでは、プロセスを完了するためにノードの再起動が必要になります。
この記事では、GitHub Actions と Azure CLI を使用して AKS ノードの更新プロセスを自動化し、自動的に実行する cron
に基づいて更新タスクを作成する方法について説明します。
Note
また、ノード イメージのアップグレードを自動的に実行し、計画メンテナンスを使用してこれらのアップグレードをスケジュールすることもできます。 詳細については、「ノード イメージを自動的にアップグレードする」をご覧ください。
開始する前に
- この記事は、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
コマンドを実行すると、ダウンタイムなしで更新プログラムを適用できます。 コマンドでは、次のアクションが実行されます。
- すべてのクラスターのノードに最新の更新プログラムを適用します。
- ノードへのトラフィックを切断 (ノードを新しいワークロードのスケジュール設定で使用できないように) し、ドレイン (存在するワークロードを他のノードに移動) します。
- ノードを再起動します。
- 更新されたノードがトラフィックを再び受信できるようにします。
別の方法を使用してノードを更新した場合、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 はお使いのアプリケーションと同じリポジトリで構成されますが、任意のリポジトリを使用できます。
GitHub の自分のリポジトリに移動します。
アクションを選択します。
[New workflow] (新しいワークフロー)>[Set up a workflow yourself] (ワークフローを自分で設定する) の順に選択します。
15 日ごと午前 3 時に実行するスケジュール トリガーを使用して、Upgrade cluster node images という名前 の GitHub アクションを作成します。 次のコードを YAML にコピーします。
name: Upgrade cluster node images on: schedule: - cron: '0 3 */15 * *'
Ubuntu エージェントで実行され、Azure CLI アカウントに接続してノード アップグレード コマンドを実行する upgrade-node という名前のジョブを作成します。
on
キーの下の YAML に次のコードをコピーします。jobs: upgrade-node: runs-on: ubuntu-latest
ワークフローで Azure CLI を設定する
[Search Marketplace for Actions] (アクションの Marketplace の検索) バーで、[Azure ログイン] を検索します。
[Azure ログイン] を選択します。
[インストール] で、v1.4.6 などのバージョンを選択し、インストール コード スニペットをコピーします。
インストール コード スニペットから 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 の資格情報を作成する
新しいブラウザー ウィンドウで、
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" }
出力をコピーし、GitHub リポジトリに移動します。
[設定]>[シークレットと変数]>[アクション]>[新しいリポジトリ シークレット] を選択します。
名前には、
AZURE_CREDENTIALS
を入力します。[シークレット] の場合は、サービス プリンシパル作成時に受信した出力の内容をコピーします。
シークレットの追加を選択します。
Azure CLI コマンドを実行するステップを作成する
ワークフロー YAML でウィンドウに移動します。
[Search Marketplace for Actions] (アクションの Marketplace の検索) バーで、[Azure CLI Action] (Azure CLI アクション) を検索します。
[Azure CLI Action] (Azure CLI アクション) を選択します。
[インストール] で、v1.0.8 などのバージョンを選択し、インストール コード スニペットをコピーします。
次の例のように、アクションの内容を手順
*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
ヒント
AZURE_CREDENTIALS
の場合と同様に、新しいリポジトリ シークレットを作成することで、--resource-group
パラメータ-と--name
パラメーターをコマンドから切り離すことができます。これらのパラメーターのシークレットを作成する場合は、プレースホルダー
<resourceGroupName>
とプレースホルダー<aksClusterName>
を対応するシークレットに置き換える必要があります。 たとえば、${{secrets.RESOURCE_GROUP_NAME}}
や${{secrets.AKS_CLUSTER_NAME}}
のようになりますYAML の名前を
upgrade-node-images.yml
に変更します。.[Commit changes...] (変更のコミット...) を選択し、コミット メッセージを追加してから、[Commit changes] (変更のコミット) を選択します。
GitHub アクションを手動で実行する
workflow_dispatch
という新しい on
トリガーを追加することにより、スケジュールされた実行に加えて、ワークフローを手動で実行できます。
Note
クラスター上のすべてのノード プールではなく、単一のノード プールをアップグレードするには、az aks nodepool upgrade
コマンドに --name
パラメーターを追加して、ノード プール名を指定します。 次に例を示します。
az aks nodepool upgrade --resource-group <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 のパッチとアップグレードのガイダンス」を参照してください。
Azure Kubernetes Service