Kubernetes は、Pod の強制排除、イメージのプル失敗、ノードのハードウェア例外の報告など、クラスターの状態が変化したときにイベントを生成します。デフォルトでは、Kubernetes はこれらのイベントを 1 時間しか保持しません。異常をタイムリーに検出し、イベントデータの損失を防ぐために、Container Service for Kubernetes (ACK) は、クラスターイベントを収集、保存、アラート、アーカイブするためのエンドツーエンドのイベントモニタリングソリューションを提供します。
ACK は、デフォルトでクラスターイベントを Simple Log Service に sink し、90 日間無料で保存します。詳細については、「イベントセンターの作成と使用」をご参照ください。
仕組み
ACK は、イベントモニタリングのために 2 つのオープンソースツールを使用します:
node-problem-detector (NPD):Kubernetes ノードを診断します。NPD は、ノードの異常 (Docker エンジンのハング、Linux カーネルのハング、アウトバウンドトラフィックの異常、ファイルディスクリプタの異常) を検出し、ノードイベントを生成し、kube-eventer と連携してアラート管理のクローズドループを実現します。詳細については、「NPD」をご参照ください。
kube-eventer:ACK がメンテナンスするオープンソースのイベントエミッターです。kube-eventer は、Kubernetes イベントを DingTalk、Simple Log Service、EventBridge などの sink に転送します。重大度レベルでイベントをフィルターし、リアルタイム収集、特定イベントのアラート、非同期アーカイブを可能にします。詳細については、「kube-eventer」をご参照ください。
Kubernetes は 2 種類のイベントを生成します:
| タイプ | 生成タイミング | 例 |
|---|---|---|
| Normal | ステートマシンが期待される状態に遷移した場合 | Pod のスケジュール、コンテナの開始 |
| Warning | ステートマシンが予期しない状態に遷移した場合 | Pod の強制排除、イメージのプル失敗、CrashLoopBackOff |
シナリオの選択
モニタリング要件に合ったシナリオを選択してください:
| シナリオ | 使用タイミング |
|---|---|
| シナリオ 1:NPD と Simple Log Service イベントセンターの使用 | 迅速に開始できます。すべてのクラスターイベントを Simple Log Service に sink し、一元的に可視化、クエリ、アラートを行います。 |
| シナリオ 2:NPD ノード診断の実行 | ノードレベルの異常 (ディスクプレッシャー、ネットワーク問題、Docker デーモンの障害) を検出し、クローズドループのアラート管理をトリガーします。 |
| シナリオ 3:DingTalk へのアラート送信 | `Warning` イベントを DingTalk グループにルーティングし、リアルタイムの ChatOps 通知を実現します。 |
| シナリオ 4:Simple Log Service へのイベントのアーカイブ | Kubernetes イベントを専用の Logstore に永続化し、長期保存、インデックス作成、オフライン分析を行います。 |
| シナリオ 5:EventBridge へのイベントのルーティング | イベント駆動型アーキテクチャを構築し、クラスターイベントから自動修復やダウンストリームのワークフローをトリガーします。 |
シナリオ 1:NPD と Simple Log Service イベントセンターの使用
NPD はサードパーティのプラグインと連携してノードの異常を検出し、クラスターイベントを生成します。また、Kubernetes は Pod の強制排除やイメージのプル失敗など、クラスターの状態が変化したときにもイベントを生成します。Simple Log Service の Kubernetes イベントセンターは、これらのイベントを収集、保存、可視化し、組み込みのクエリおよびアラート機能を提供します。
ステップ 1:ack-node-problem-detector コンポーネントのインストール
クラスター作成時に [node-problem-detector をインストールしてイベントセンターを作成] を選択した場合は、「ステップ 2:イベントセンターの表示」に進んでください。クラスター作成時のインストールに関する詳細については、「ACK マネージドクラスターの作成」をご参照ください。
このオプションを選択しなかった場合は、手動でコンポーネントをインストールしてください:
ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、対象のクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、[アドオン] をクリックします。
[ログとモニタリング] タブで、ack-node-problem-detector を見つけてインストールします。
ステップ 2:イベントセンターの表示
ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター]ページで、目的のクラスターを見つけ、その名前をクリックします。左側のナビゲーションウィンドウで、[操作]>[イベントセンター]を選択します。
[イベントセンター] ページで、[イベント概要 (イベントセンター)] タブをクリックします。このタブには、すべての Kubernetes イベント、その詳細情報、および Pod のライフサイクルが表示されます。詳細については、「Kubernetes イベントの収集」をご参照ください。
シナリオ 2:NPD ノード診断の実行
kube-eventer と統合された NPD は、ノードイベントに対するクローズドループのアラート管理を提供します。NPD が異常を検出すると、kube-eventer はイベントを設定済みの sink に転送し、アラートを発行します。
前提条件
開始する前に、以下を確認してください:
ack-node-problem-detector コンポーネントがインストールされていること。インストールされていない場合は、「ステップ 1:ack-node-problem-detector コンポーネントのインストール」をご参照ください。すでにインストールされている場合は、まず再インストールしてください。詳細については、「ack-node-problem-detector コンポーネントの再インストール」をご参照ください。
DaemonSet の実行状態の確認
[クラスター] ページで、対象のクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、[ワークロード] > [DaemonSet] を選択します。
[DaemonSet] タブで、kube-system 名前空間を選択し、ack-node-problem-detector-daemonset が実行中であることを確認します。NPD と kube-eventer の両方が実行されている場合、システムは kube-eventer の設定に基づいてイベントを sink し、アラートを発行します。
ノード診断プラグイン
NPD は、以下のノード診断プラグインをサポートしています:
| プラグイン | チェック内容 | デフォルトのしきい値 | デフォルトで有効 |
|---|---|---|---|
ntp_check | システムクロックが Network Time Protocol (NTP) を介して同期されているかどうか | — | はい |
network_problem_check | コネクショントラッキング (conntrack) テーブルの使用量がしきい値を超えているかどうか | 90% | はい |
inodes_usage_check | システムディスクの inode 使用量がしきい値 (調整可能) を超えているかどうか | 80% | はい |
pid_pressure_check | pid プロセス比率がカーネルの最大値のしきい値を超えているかどうか | 85% | はい |
docker_offline_check | Docker デーモンが実行中であるかどうか | — | はい |
fd_check | ファイルディスクリプタの使用量がしきい値 (調整可能) を超えているかどうか。 説明 このプラグインは大量のリソースを消費します。必要な場合にのみ有効にしてください。 | 80% | いいえ |
ram_role_check | ノードに必要な RAM ロールと AccessKey ID/シークレットが設定されているかどうか | — | いいえ |
nvidia_gpu_check | NVIDIA GPU が Xid メッセージを生成できるかどうか | — | いいえ |
csi_hang_check | Container Storage Interface (CSI) プラグインが実行中であるかどうか | — | いいえ |
ps_hang_check | 割り込み不可能なスリープ (D) 状態のプロセスが存在するかどうか | — | いいえ |
public_network_check | ノードがインターネットにアクセスできるかどうか | — | いいえ |
irqbalance_check | irqbalance デーモンが実行中であるかどうか | — | いいえ |
シナリオ 3:DingTalk へのアラート送信
DingTalk チャットボットを使用して Kubernetes イベントアラートを受信するのは、典型的な ChatOps の実装です。`Warning` レベルのイベントが発生すると、kube-eventer は Webhook を介して DingTalk グループにメッセージをプッシュします。
前提条件
開始する前に、以下を確認してください:
ack-node-problem-detector コンポーネントがインストールされていること。インストールされていない場合は、「ステップ 1:ack-node-problem-detector コンポーネントのインストール」をご参照ください。すでにインストールされている場合は、まず再インストールしてください。詳細については、「ack-node-problem-detector コンポーネントの再インストール」をご参照ください。
ステップ 1:DingTalk チャットボットの追加
チャットボックスの右上隅にある
をクリックして [グループ設定] を開きます。[Bot] をクリックし、次に [ロボットを追加] をクリックします。チャットボットの種類として [カスタム] を選択します。

[ロボットの詳細] ページで、[追加] をクリックして [ロボットを追加] ページを開きます。以下のパラメーターを設定し、DingTalk カスタムロボットサービス利用規約に同意して、[完了] をクリックします:
パラメーター 説明 プロフィール画像の編集 チャットボットのアバターです。任意です。 チャットボット名 チャットボットの表示名です。 グループに追加 チャットボットを追加する DingTalk グループです。 セキュリティ設定 3 つのオプションがサポートされています:[カスタムキーワード]、追加の署名、IP アドレス (または CIDR ブロック)。クラスターイベントアラートのフィルタリングには [カスタムキーワード] のみがサポートされています。[カスタムキーワード] を選択し、 Warningと入力します。フィルターを絞り込むために、最大 10 個のキーワードを追加できます。
[コピー] をクリックして Webhook URL をコピーします。
[ChatBot] ページで、チャットボットの横にある
をクリックすると、アバターと名前の変更、メッセージプッシュの有効化/無効化、Webhook URL のリセット、またはチャットボットの削除ができます。
ステップ 2:kube-eventer の設定 (DingTalk へのイベント送信)
[クラスター] ページで、対象のクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、[アプリケーション] > [Helm] を選択します。
[Helm] ページで ack-node-problem-detector を見つけ、[操作] 列の [更新] をクリックします。
以下のパラメーターを設定し、[OK] をクリックします:
npdセクションで、enabledをfalseに設定します。eventer.sinks.dingtalk.enabledをtrueに設定します。コピーした Webhook URL からトークンを入力します。
結果
kube-eventer はデプロイ後 30 秒で有効になります。`Warning` レベルのイベントが発生すると、アラートが DingTalk グループに送信されます。

シナリオ 4:Simple Log Service へのイベントのアーカイブ
Kubernetes イベントを Simple Log Service に sink して、永続的な保存、インデックス作成、および監査を行います。長期保存やオフラインでのアーカイブのためには、Logstore の設定と、オプションで MaxCompute または Object Storage Service (OSS) へのデータ転送を設定します。詳細については、「イベントセンターの作成と使用」をご参照ください。
前提条件
開始する前に、以下を確認してください:
ack-node-problem-detector コンポーネントがインストールされていること。インストール時にプロジェクトと Logstore を指定します。すでにインストールされている場合は、まず再インストールしてください。詳細については、「ack-node-problem-detector コンポーネントの再インストール」をご参照ください。
ステップ 1:Simple Log Service プロジェクトと Logstore の作成
Simple Log Service コンソールにログインします。
[プロジェクト] セクションで、[プロジェクトの作成] をクリックします。[プロジェクトの作成] パネルで、パラメーターを設定し、[作成] をクリックします。
Simple Log Service プロジェクトは、ご利用のクラスターと同じリージョンに作成してください。同一リージョン内の転送は内部ネットワークを使用するため、レイテンシーが短縮され、リージョン間の帯域幅コストが不要になります。この例では、中国 (杭州) リージョンに
k8s-log4jという名前のプロジェクトを作成します。[プロジェクト] セクションで、k8s-log4j をクリックしてプロジェクトの詳細ページを開きます。
[Logstore] ペインで、[+] をクリックして [Logstore の作成] パネルを開きます。
パラメーターを設定し、[OK] をクリックします。この例では、
k8s-logstoreという名前の Logstore を作成します。
Logstore が作成されたら、[データインポートウィザード] をクリックします。[データのインポート] ダイアログボックスが表示されます。
[Log4j 1/2] を選択し、設定手順を完了します。この例では、デフォルト設定を使用します。

ステップ 2:kube-eventer の設定 (Simple Log Service へのイベント sink)
[クラスター] ページで、対象のクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、[アプリケーション] > [Helm] を選択します。
[Helm] ページで ack-node-problem-detector を見つけ、[操作] 列の [更新] をクリックします。
以下のパラメーターを設定し、[OK] をクリックします:
npdセクションで、enabledをfalseに設定します。eventer.sinks.sls.enabledをtrueに設定します。
ステップ 3:イベント収集の確認とインデックス作成の設定
クラスターイベントをトリガーします。たとえば、Pod を削除したり、アプリケーションを作成したりします。
Simple Log Service コンソールにログインして、収集されたイベントを表示します。詳細については、「Simple Log Service SDK を使用したログデータの消費」をご参照ください。

クエリと分析のためにインデックス作成を設定します。詳細については、「インデックスの作成」をご参照ください。
[プロジェクト] セクションで、プロジェクト名をクリックします。
Logstore 名の横にある
をクリックし、[検索と分析] を選択します。右上隅で、[インデックスを有効化] をクリックします。
[検索と分析] パネルで、パラメーターを設定し、[OK] をクリックします。ログのクエリと分析ページが表示されます。
> 注:インデックス設定は 1 分以内に有効になり、インデックスが有効化または変更された後に取り込まれたデータにのみ適用されます。(オプション) オフライン分析のためにイベントをアーカイブするには、Logstore から MaxCompute または Object Storage Service (OSS) にデータを転送します。詳細については、「MaxCompute にデータを転送するための新しいバージョンのデータ転送ジョブの作成」および「OSS データ転送ジョブの作成 (新バージョン)」をご参照ください。
シナリオ 5:EventBridge へのイベントのルーティング
EventBridge は、Alibaba Cloud サービス、カスタムアプリケーション、および SaaS (Software as a Service) アプリケーションが標準化された集中管理方式で接続できるサーバーレスイベントサービスです。ACK イベントを EventBridge にルーティングすることで、疎結合のイベント駆動型アーキテクチャを構築できます。たとえば、特定のイベントが発生したときに自動修復ワークフローをトリガーするなどです。詳細については、「EventBridge とは」をご参照ください。
前提条件
開始する前に、以下を確認してください:
EventBridge が有効化されていること。詳細については、「EventBridge の有効化と RAM ユーザーへの権限付与」をご参照ください。
ack-node-problem-detector コンポーネントがインストールされていること。インストールされていない場合は、「ステップ 1:ack-node-problem-detector コンポーネントのインストール」をご参照ください。すでにインストールされている場合は、まず再インストールしてください。詳細については、「ack-node-problem-detector コンポーネントの再インストール」をご参照ください。
イベント sink としての EventBridge の有効化
[クラスター] ページで、対象のクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、[アプリケーション] > [Helm] を選択します。
[Helm] ページで ack-node-problem-detector を見つけ、[操作] 列の [更新] をクリックします。
eventer.sinks.eventbridge.enableをtrueに設定し、[OK] をクリックします。
EventBridge での Kubernetes イベントの表示
EventBridge コンソールにログインします。
左側のナビゲーションウィンドウで、[イベントバス] をクリックします。
[イベントバス] ページで、対象のイベントバスをクリックします。
左側のナビゲーションウィンドウで、[イベント追跡] をクリックします。
クエリメソッドを選択し、クエリ条件を設定して、[クエリ] をクリックします。
イベントを見つけ、[操作] 列の [詳細] をクリックします。詳細については、「イベント ID によるイベントのクエリ」をご参照ください。
ack-node-problem-detector コンポーネントの再インストール
sink ターゲットを変更する場合 (例:Simple Log Service から DingTalk への切り替え) や、コンポーネントの設定を更新する場合には、コンポーネントを再インストールします。
ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、目的のクラスターを見つけ、その名前をクリックします。左側のナビゲーションウィンドウで、[ワークロード] > [ジョブ] を選択します。
[ジョブ] ページで、
kube-eventer-init-v1.7-xxxxの横にある [その他] をクリックし、[削除] をクリックします。[クラスター] ページで、対象のクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、[アプリケーション] > [Helm] を選択します。
[Helm] ページで、ack-node-problem-detector コンポーネントを削除します。
[クラスター] ページで、対象のクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、[運用管理] > [アドオン] を選択します。
[ログとモニタリング] タブで、ack-node-problem-detector を見つけて再インストールします。