イベントモニタリングは、リソースモニタリングを補完し、より優れたリアルタイムの応答性、正確性、およびシナリオカバレッジを提供します。たとえば、Pod の退去、イメージプルの失敗、ノードのハードウェア例外の報告などが該当します。Kubernetes は、デフォルトでこれらのイベントを 1 時間しか保持しません。データが期限切れになる前に異常を検出するために、Container Service for Kubernetes (ACK) は、クラスターイベントを収集、保存、アラート、およびアーカイブするエンドツーエンドのイベントモニタリングを提供します。
ACK は、デフォルトでクラスターイベントを Simple Log Service にシンクし、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 などのシンクに転送し、重要度レベルでイベントをフィルタリングし、リアルタイムの収集、アラート、非同期のアーカイブを可能にします。詳細については、「kube-eventer」をご参照ください。
Kubernetes は 2 種類のイベントを発行します。
タイプ | 生成タイミング | 例 |
正常 | ステートマシンが期待される状態に遷移した場合 | Pod のスケジューリング、コンテナの起動 |
警告 | ステートマシンが予期しない状態に遷移した場合 | Pod の退去、イメージプルの失敗、 |
ユースケース
モニタリングのニーズに基づいてシナリオを選択します。
シナリオ | 使用する状況 |
迅速に利用を開始できます。すべてのクラスターイベントを Simple Log Service にシンクし、可視化、クエリ、アラートを 1 か所で実行します。 | |
ディスクプレッシャー、ネットワークの問題、Docker デーモンの障害などのノードレベルの例外を検出し、クローズドループのアラート管理をトリガーします。 | |
警告イベントを DingTalk グループにルーティングし、リアルタイムの ChatOps 通知を受け取ります。 | |
Kubernetes イベントを専用の Logstore に永続化し、長期保存、インデックス作成、オフライン分析を行います。 | |
イベント駆動型アーキテクチャを構築し、クラスターイベントから自動修復やダウンストリームのワークフローをトリガーします。 |
シナリオ1:NPDとSimple Log Serviceイベントセンターの使用
NPD はサードパーティのプラグインと連携してノードの例外を検出し、クラスターイベントを生成します。Simple Log Service イベントセンターは、これらのイベントを収集、保存、可視化し、組み込みのクエリおよびアラート機能を提供します。
手順1:ack-node-problem-detectorコンポーネントのインストール
クラスターの作成時に [Install node-problem-detector and Create Event Center] を選択した場合は、「手順2:イベントセンターの表示」に進んでください。クラスター作成時にインストールする方法については、「ACK マネージドクラスターの作成」をご参照ください。
それ以外の場合は、コンポーネントを手動でインストールします。
ACK コンソールにログインします。左側のナビゲーションペインで、[クラスター] を選択します。
[クラスター] ページで、対象のクラスターを見つけてその名前をクリックします。左側のナビゲーションペインで、[アドオン] をクリックします。
オブザーバビリティ タブで、[ack-node-problem-detector] を見つけてインストールします。
手順2:イベントセンターの表示
ACK コンソールにログインします。左側のナビゲーションペインで、[クラスター] を選択します。
[クラスター] ページで、対象のクラスターを見つけてその名前をクリックします。左側のナビゲーションペインで、[O&M] > [イベントセンター] を選択します。
[イベントセンター] ページで、[イベント概要 (イベントセンター)] タブをクリックして、すべての Kubernetes イベント、その詳細、および Pod のライフサイクルを表示します。詳細については、「Kubernetes イベントの収集」をご参照ください。
シナリオ2:NPDノード診断の実行
NPD と kube-eventer を組み合わせることで、ノードイベントに対するクローズドループのアラート管理が可能になります。NPD が例外を検出すると、kube-eventer は設定されたシンクにイベントを転送し、アラートを発行します。
前提条件
開始する前に、次のことを確認してください。
[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 の設定に従ってイベントをシンクし、アラートを発行します。
ノード診断プラグイン
NPD 1.2.29 以降、GPU 異常検出プラグインは ack-accel-health-monitor という名前の別の DaemonSet としてデプロイされます。
プラグイン | チェック内容 | デフォルトのしきい値 | デフォルトで有効 |
| システムクロックが Network Time Protocol (NTP) を介して同期されているかどうか | — | はい |
| コネクショントラッキング (conntrack) テーブルの使用率がしきい値を超えているかどうか | 90% | はい |
| システムディスクの inode 使用率がしきい値 (調整可能) を超えているかどうか | 80% | はい |
| PID プロセス比率がカーネルの最大しきい値を超えているかどうか | 85% | はい |
| Docker デーモンが実行されているかどうか | — | はい |
| ファイルディスクリプタの使用率がしきい値 (調整可能) を超えているかどうか。 説明 このプラグインは大量のリソースを消費します。必要な場合にのみ有効にしてください。 | 80% | いいえ |
| ノードに必要な RAM ロールと AccessKey ID/Secret が設定されているかどうか | — | いいえ |
| Whether NVIDIA GPUs can generate | — | No |
| Container Storage Interface (CSI) プラグインが実行されているかどうか | — | いいえ |
| 割り込み不可能なスリープ (D) 状態のプロセスが存在するかどうか | — | いいえ |
| ノードがインターネットにアクセスできるかどうか | — | いいえ |
|
| — | いいえ |
シナリオ3:DingTalkへのアラート送信
DingTalk チャットボットで Kubernetes イベントのアラートを受信するのは、典型的な ChatOps パターンです。警告レベルのイベントが発生すると、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 秒で有効になります。警告レベルのイベントは、DingTalk グループでアラートをトリガーします。

シナリオ4:Simple Log Serviceへのイベントのアーカイブ
Kubernetes イベントを Simple Log Service にシンクして、永続的な保存、インデックス作成、および監査を行います。長期保存やオフラインアーカイブのためには、Logstore と、オプションで MaxCompute または Object Storage Service (OSS) へのデータ転送を設定します。詳細については、「イベントセンターの作成と使用」をご参照ください。
前提条件
開始する前に、次のことを確認してください。
プロジェクトと Logstore を指定して [ack-node-problem-detector] がインストールされていること。すでにインストールされている場合は、まず再インストールしてください。詳細については、「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の作成] パネルの主要な設定項目は次のとおりです。
Logstore タイプ:標準
データ保持期間:30 日 (固定日数)
シャード数:2
自動シャード分割:有効、最大 64 分割
パブリック IP の記録:有効
WebTracking:デフォルトで無効
Logstore が作成されたら、[データインポートウィザード] をクリックして [データのインポート] ダイアログボックスを開きます。
[Log4j 1/2] を選択し、設定を完了します。この例ではデフォルト設定を使用します。
データソース設定ページの [ログの説明] エリアでは、Log4j は優先度レベル (ERROR、WARN、INFO、DEBUG)、出力先、出力形式の 3 つのコンポーネントで構成されると説明されています。Alibaba Cloud Log Log4j Appender は、ログを Simple Log Service (SLS) に出力できます (ダウンロードアドレスと使用手順については、GitHub をご参照ください)。[使用上の注意] エリアで、[ヘルプの表示] リンクをクリックして詳細な取り込みガイダンスを取得し、[次へ] をクリックします。
手順2:kube-eventerがSimple Log Serviceにイベントをシンクするように設定
[クラスター] ページで、対象のクラスターを見つけてその名前をクリックします。左側のナビゲーションペインで、[アプリケーション] > [Helm] を選択します。
[Helm] ページで [ack-node-problem-detector] を見つけ、[操作] 列の [更新] をクリックします。
以下のパラメーターを設定し、[OK] をクリックします。
npdセクションで、enabledをfalseに設定します。eventer.sinks.sls.enabledをtrueに設定します。
手順3:イベント収集の確認とインデックスの設定
Pod の削除やアプリケーションの作成など、クラスターイベントをトリガーします。
Simple Log Service コンソールにログインして、収集されたイベントを表示します。詳細については、「Simple Log Service SDK を使用したログデータの消費」をご参照ください。
[消費プレビュー] ダイアログボックスで、インデックス名 (例:
k8s-event) を選択し、[シャード] と時間範囲を設定してから、[プレビュー] をクリックします。ログデータが正常にアップロードされると、テーブルにはlevel、eventId、namespace、reason、messageなどのフィールドを含む、JSON 形式の Kubernetes イベントのログレコードが表示されます。クエリと分析のためにインデックスを設定します。詳細については、「インデックスの作成」をご参照ください。
[プロジェクト] セクションで、プロジェクト名をクリックします。
Logstore 名の横にある
をクリックし、[検索と分析] を選択します。右上隅で、[インデックスを有効にする] をクリックします。
[検索と分析] パネルで、パラメーターを設定し、[OK] をクリックします。> [注意:] インデックス設定は 1 分以内に有効になり、インデックスが有効化または変更された後に取り込まれたデータにのみ適用されます。
(任意) オフライン分析のためにイベントをアーカイブするには、Logstore から [MaxCompute] または Object Storage Service (OSS) にデータを転送します。詳細については、「新バージョンのデータ転送ジョブを作成してデータを MaxCompute に転送する」および「OSS データ転送ジョブの作成 (新バージョン)」をご参照ください。
シナリオ5:EventBridgeへのイベントのルーティング
EventBridge は、Alibaba Cloud サービス、カスタムアプリケーション、およびサービスとしてのソフトウェア (SaaS) アプリケーションを、標準化された一元的な方法で接続するサーバーレスのイベントサービスです。ACK イベントを EventBridge にルーティングすることで、疎結合のイベント駆動型アーキテクチャを構築できます。たとえば、特定のイベントが発生したときに自動修復をトリガーするなどです。詳細については、「EventBridge とは」をご参照ください。
前提条件
開始する前に、次のことを確認してください。
EventBridge が有効化されていること。詳細については、「EventBridge の有効化と RAM ユーザーへの権限付与」をご参照ください。
[ack-node-problem-detector] がインストールされていること。インストールされていない場合は、「手順1:ack-node-problem-detector コンポーネントのインストール」をご参照ください。すでにインストールされている場合は、まず再インストールしてください。詳細については、「ack-node-problem-detector コンポーネントの再インストール」をご参照ください。
EventBridgeをイベントシンクとして有効にする
[クラスター] ページで、対象のクラスターを見つけてその名前をクリックします。左側のナビゲーションペインで、[アプリケーション] > [Helm] を選択します。
[Helm] ページで [ack-node-problem-detector] を見つけ、[操作] 列の [更新] をクリックします。
eventer.sinks.eventbridge.enabledをtrueに設定し、[OK] をクリックします。eventer: accessKeyId: "" accessKeySecret: "" enabled: true env: - TZ: Asia/Shanghai image: pullPolicy: Always repository: registry-cn-hangzhou-vpc.ack.aliyuncs.com/acs/kube-eventer tag: v1.2.11-0620284-aliyun othersinks: null resources: limits: cpu: "1.0" memory: 1024Mi requests: cpu: 100m memory: 200Mi sinks: dingtalk: enabled: false label: "" level: Warning monitorkinds: Node,Pod monitornamespaces: "" token: "" eventbridge: enabled: true
EventBridgeでKubernetesイベントを表示する
EventBridge コンソールにログインします。
左側のナビゲーションペインで、[イベントバス] をクリックします。
[イベントバス] ページで、対象のイベントバスをクリックします。
左側のナビゲーションペインで、[イベント追跡] をクリックします。
クエリ方法を選択し、条件を設定して、[クエリ] をクリックします。
イベントを見つけ、[操作] 列の [詳細] をクリックします。詳細については、「イベント ID によるイベントのクエリ」をご参照ください。
ack-node-problem-detector コンポーネントの再インストール
シンクターゲットを変更する場合 (例:Simple Log Service から DingTalk へ) や、コンポーネント設定を更新する場合には、コンポーネントを再インストールします。
ACK コンソールにログインします。左側のナビゲーションペインで、[クラスター] を選択します。
[クラスター] ページで、対象のクラスターを見つけてその名前をクリックします。左側のナビゲーションペインで、[ワークロード] > [Job] を選択します。
[Job] ページで、
kube-eventer-init-v1.7-xxxxの横にある [その他] をクリックし、[削除] をクリックします。[クラスター] ページで、対象のクラスターを見つけてその名前をクリックします。左側のナビゲーションペインで、[アプリケーション] > [Helm] を選択します。
[Helm] ページで、[ack-node-problem-detector] コンポーネントを削除します。
[クラスター] ページで、対象のクラスターを見つけてその名前をクリックします。左側のナビゲーションペインで、[O&M] > [アドオン] を選択します。
オブザーバビリティ タブで、[ack-node-problem-detector] を見つけて再インストールします。