Kubernetes (K8s) イベントは、Pod の作成、実行、削除、コンポーネントの例外など、クラスターの状態変化を記録します。K8s イベントセンターは、ご利用の Kubernetes クラスターからすべてのイベントをリアルタイムで収集し、ストレージ、クエリ、分析、可視化、およびアラート機能を提供します。このトピックでは、K8s イベントセンターの作成方法と使用方法について説明します。
背景情報
Kubernetes のアーキテクチャは状態機械に基づいています。状態間の遷移は、対応するイベントを生成します。正常な状態間の遷移は Normal レベルのイベントを生成し、正常な状態と異常な状態の間の遷移は Warning レベルのイベントを生成します。
Container Service for Kubernetes (ACK) は、コンテナシナリオ向けにすぐに使えるイベントモニタリングソリューションを提供します。ACK がメンテナンスする NPD とそれに含まれる kube-eventer を使用して、コンテナイベントのモニタリングを提供します。
Node Problem Detector (NPD) は、Kubernetes ノードの診断ツールです。Docker Engine のハング、Linux カーネルのハング、ネットワーク出力の問題、ファイルディスクリプタの異常など、ノードの異常をノードイベントに変換します。kube-eventer と組み合わせることで、NPD はノードイベントアラートのクローズドループシステムを実現します。詳細については、「NPD」をご参照ください。
kube-eventer は、Kubernetes イベントのオフライン処理のために ACK がメンテナンスするオープンソースツールです。クラスターイベントを DingTalk、SLS、EventBridge などの外部システムにプッシュします。また、さまざまなイベントレベルのフィルター条件を提供し、リアルタイム収集、ターゲットを絞ったアラート、非同期アーカイブを可能にします。詳細については、「kube-eventer」をご参照ください。
前提条件
ACK クラスターや ACK Serverless クラスターなどの Kubernetes クラスターが作成されていること。
課金
以下の条件を満たす場合、K8s イベントセンターは無料です。
-
K8s イベントセンターに関連付けられた Logstore のデータ保持期間が 90 日 (デフォルト値) であること。
-
K8s イベントセンターに書き込まれるデータ量が 1 日あたり 256 MB 未満 (約 250,000 イベント) であること。
例:
-
デフォルトの 90 日間の保持期間を使用し、K8s クラスターが 1 日に 1,000 イベントを生成する場合、K8s イベントセンターの使用は無料です。
-
保持期間を 105 日に変更し、K8s クラスターが 1 日に 1,000 イベントを生成する場合、最初の 90 日間を過ぎると Logstore のストレージ料金が発生します。課金項目はストレージスペース - ログストレージです。この課金項目の詳細については、「機能別課金モデルの課金項目」をご参照ください。
ステップ 1: kube-eventer と node-problem-detector のデプロイ
Alibaba Cloud Kubernetes
ACK クラスターの場合、ack-node-problem-detector コンポーネントには既に eventer と node-problem-detector の機能が統合されています。このコンポーネントをデプロイするだけで済みます。詳細については、「イベントモニタリング」をご参照ください。ACK Serverless クラスターの場合、kube-eventer コンポーネントをデプロイする必要があります。
NPD は、設定とサードパーティのプラグインに基づいてノードの問題や障害を検出し、対応するクラスターイベントを生成します。Kubernetes クラスターは、Pod のエビクションやイメージのプル失敗など、状態遷移によってさまざまなイベントも生成します。Simple Log Service (SLS) の Kubernetes イベントセンターは、すべての Kubernetes イベントをリアルタイムで集約し、ストレージ、クエリ、分析、可視化、およびアラート機能を提供します。以下の手順では、クラスターイベントを SLS の Kubernetes イベントセンターに送信する方法について説明します。
クラスターを作成する際に、[node-problem-detector のインストールおよびイベントセンターの作成] を選択した場合は、Kubernetes イベントセンターを表示するには、ステップ 2 に進んでください。NPD コンポーネントをクラスター作成時にインストールする方法について詳しくは、「ACK マネージドクラスターの作成」をご参照ください。
クラスターの作成時に [node-problem-detector のインストールとイベントセンターの作成] を選択しなかった場合は、手動でインストールできます。
ACK コンソールにログインします。左側のナビゲーションウィンドウで、クラスターリスト をクリックします。
「クラスター」ページで、対象クラスターの名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。
[ログとモニタリング] タブで、[ack-node-problem-detector] を検索してインストールします。
その他の Kubernetes
-
kube-eventer をデプロイします。
-
kubectl ツールをインストールします。詳細については、「kubeconfig ファイルを取得し、kubectl を使用してクラスターに接続する」をご参照ください。
-
以下の内容で `eventer.yaml` という名前のファイルを作成します。
apiVersion: apps/v1 kind: Deployment metadata: labels: name: kube-eventer name: kube-eventer namespace: kube-system spec: replicas: 1 selector: matchLabels: app: kube-eventer template: metadata: labels: app: kube-eventer annotations: scheduler.alpha.kubernetes.io/critical-pod: '' spec: dnsPolicy: ClusterFirstWithHostNet serviceAccount: kube-eventer containers: - image: registry.cn-hangzhou.aliyuncs.com/acs/kube-eventer:v1.2.5-cc7ec54-aliyun name: kube-eventer command: - "/kube-eventer" - "--source=kubernetes:https://kubernetes.default" ## .sls に送信 ## --sink=sls:https://{endpoint}?project={project}&logStore=k8s-event®ionId={region-id}&internal=false&accessKeyId={accessKeyId}&accessKeySecret={accessKeySecret} - --sink=sls:https://cn-beijing.log.aliyuncs.com?project=k8s-xxxx&logStore=k8s-event®ionId=cn-beijing&internal=false&accessKeyId=xxx&accessKeySecret=xxx env: # TZ が割り当てられている場合、TZ の値をタイムゾーンとして設定します - name: TZ value: "Asia/Shanghai" volumeMounts: - name: localtime mountPath: /etc/localtime readOnly: true - name: zoneinfo mountPath: /usr/share/zoneinfo readOnly: true resources: requests: cpu: 10m memory: 50Mi limits: cpu: 500m memory: 250Mi volumes: - name: localtime hostPath: path: /etc/localtime - name: zoneinfo hostPath: path: /usr/share/zoneinfo --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: kube-eventer rules: - apiGroups: - "" resources: - events verbs: - get - list - watch --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: kube-eventer roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: kube-eventer subjects: - kind: ServiceAccount name: kube-eventer namespace: kube-system --- apiVersion: v1 kind: ServiceAccount metadata: name: kube-eventer namespace: kube-systemパラメーター
タイプ
必須
説明
endpoint
文字列
はい
Simple Log Service のエンドポイント。詳細については、「エンドポイント」をご参照ください。
project
文字列
はい
Simple Log Service のプロジェクト。
logStore
文字列
はい
Simple Log Service の Logstore。YAML ファイルではパラメーター名が
logStoreであることに注意してください。internal
文字列
自己管理型 Kubernetes の場合は必須。
内部エンドポイントを使用するかどうかを指定します。自己管理型 Kubernetes クラスターの場合は、このパラメーターを false に設定します。
regionId
文字列
自己管理型 Kubernetes の場合は必須。
Simple Log Service プロジェクトが存在するリージョンの ID。詳細については、「エンドポイント」をご参照ください。
accessKeyId
文字列
自己管理型 Kubernetes の場合は必須。
AccessKey ID。RAM ユーザーの AccessKey ペアを使用することを推奨します。詳細については、「AccessKey ペア」をご参照ください。
accessKeySecret
文字列
自己管理型 Kubernetes の場合は必須。
AccessKey Secret。RAM ユーザーの AccessKey ペアを使用することを推奨します。詳細については、「AccessKey ペア」をご参照ください。
-
次のコマンドを実行して、eventer.yaml の設定をクラスターに適用します。
kubectl apply -f eventer.yaml期待される出力:
deployment.apps/kube-eventer created clusterrole.rbac.authorization.k8s.io/kube-eventer created clusterrolebinding.rbac.authorization.k8s.io/kube-eventer created serviceaccount/kube-eventer created
-
-
node-problem-detector をデプロイします。
詳細については、「GitHub の node-problem-detector」をご参照ください。
ステップ 2: K8s イベントセンターインスタンスの作成
K8s イベントセンターを作成すると、Simple Log Service は対象プロジェクトに k8s-event という名前の Logstore と関連するダッシュボードを自動的に作成します。
-
Simple Log Service コンソールにログインします。
-
[ログアプリケーション] セクションの [インテリジェント O&M] タブで、[K8s イベントセンター] をクリックします。
-
[イベントセンター管理] ページで、右上隅の [追加] をクリックします。
-
[イベントセンターの作成] パネルで、パラメーターを設定してから、[次へ] をクリックします。
-
「既存のプロジェクトを選択」を選択した場合、K8s イベントセンターのリソース(例:Logstore およびダッシュボード)を管理するために、[プロジェクト] ドロップダウンリストから既存のプロジェクトを選択します。
-
「Container Service For Kubernetes から Kubernetes クラスターを選択」を選択した場合、[K8s クラスター] ドロップダウンリストから既存の K8s クラスターを選択します。この方法では、Simple Log Service がデフォルトで
k8s-log-{cluster-id}という名前のプロジェクトを作成し、K8s イベントセンターのリソースを管理します。
-
ステップ 3: K8s イベントセンターインスタンスの使用
K8s イベントセンターを作成し、eventer と NPD コンポーネントをデプロイした後、K8s イベントセンターでイベント統計の表示、イベント詳細のクエリ、Pod ライフサイクルの表示、ノードイベントの表示、コアコンポーネントイベントの表示、アラートの設定、カスタムクエリの実行、バージョンの更新ができます。
[K8s イベントセンター] ページで、目的の K8s イベントセンターインスタンスを探し、
アイコンをクリックして以下の操作を実行します。

|
操作 |
説明 |
|
イベント概要の表示 |
「[イベントの概要]」ページには、イベント総数、本日のエラーイベントと昨日のエラーイベントの比較、アラート統計、エラーイベントの傾向、Pod OOM の詳細など、コアイベントのサマリ統計が表示されます。 説明
現在、Pod OOM 情報は特定の Pod を特定できません。イベントが発生したノード、プロセス名、プロセス ID のみを識別できます。カスタムクエリを使用して、OOM イベント発生前後の Pod 再起動イベントを検索し、特定の Pod を特定できます。 |
|
イベント詳細のクエリ |
[イベントの詳細] ページでは、イベントタイプ、イベントオブジェクト、ホスト、ネームスペース、および名前などのさまざまなディメンションでフィルター処理されたイベントの詳細情報を表示します。 |
|
Pod ライフサイクルの表示 |
「[Pod ライフサイクル]」ページでは、Pod の全体のライフサイクルにわたるイベント情報をグラフィカルに表示します。また、イベントレベル別に重要度の高い Pod イベントをフィルター処理できます。 |
|
ノードイベントの表示 |
[ノードイベント] ページには、ノードのライフサイクルやイベントリストなど、ノードイベントの詳細が表示されます。 |
|
コアコンポーネントイベントの表示 |
「[コアコンポーネントイベント]」ページでは、ECS の再起動失敗や URL モードが実装されていないなどのコアコンポーネントイベントの詳細を表示します。 |
|
アラートの設定 |
[アラート設定] ページでは、K8s イベントセンターのアラートを設定できます。詳細については、「アラートを設定する」をご参照ください。 |
|
カスタムクエリ |
「[カスタムクエリ]」ページでは、独自のクエリと分析文を作成および実行できます。 K8s イベントセンターのすべてのイベントは Logstore に保存されます。カスタムクエリ、イベント消費、カスタムレポート、カスタムアラートなど、Logstore のすべての機能を使用できます。詳細については、「検索と分析のクイックスタート」をご参照ください。 K8s イベントセンターを含むプロジェクトにアクセスするには、次のいずれかの方法でプロジェクト名を見つけることができます。
|
|
バージョン更新 |
[バージョンアップデート] ページでは、K8s イベントセンターのバージョンをアップグレードできます。 |
K8s イベントセンターインスタンスの削除
ページで、削除するインスタンスを見つけ、[アクション] 列の
アイコンをクリックします。
ログサンプル
以下は収集されたログのサンプルです。
hostname: cn-hangzhou.i-***********"
level: Normal
pod_id: 2a360760-****
pod_name: logtail-ds-blkkr
event_id: {
"metadata":{
"name":"logtail-ds-blkkr.157b7cc90de7e192",
"namespace":"kube-system",
"selfLink":"/api/v1/namespaces/kube-system/events/logtail-ds-blkkr.157b7cc90de7e192",
"uid":"2aaf75ab-****",
"resourceVersion":"6129169",
"creationTimestamp":"2019-01-20T07:08:19Z"
},
"involvedObject":{
"kind":"Pod",
"namespace":"kube-system",
"name":"logtail-ds-blkkr",
"uid":"2a360760-****",
"apiVersion":"v1",
"resourceVersion":"6129161",
"fieldPath":"spec.containers{logtail}"
},
"reason":"Started",
"message":"Started container",
"source":{
"component":"kubelet",
"host":"cn-hangzhou.i-***********"
},
"firstTimestamp":"2019-01-20T07:08:19Z",
"lastTimestamp":"2019-01-20T07:08:19Z",
"count":1,
"type":"Normal",
"eventTime":null,
"reportingComponent":"",
"reportingInstance":""
}
|
フィールド |
タイプ |
説明 |
|
hostname |
文字列 |
イベントが発生したホスト名。 |
|
level |
文字列 |
イベントレベル。有効な値: Normal と Warning。 |
|
pod_id |
文字列 |
Pod の一意の ID。このフィールドは、イベントが Pod に関連する場合にのみ存在します。 |
|
pod_name |
文字列 |
Pod の名前。このフィールドは、イベントが Pod に関連する場合にのみ存在します。 |
|
event_id |
json |
イベントの詳細な内容。このフィールドの値は JSON 文字列です。 |
よくある質問
K8s イベントセンターにデータがない場合
K8s イベントセンターをデプロイすると、新しく生成されたイベントは自動的に収集されます。[カスタムクエリ] ページで検索できます。右上隅の時間範囲を 1 日に設定することをお勧めします。データが表示されない場合は、以下の考えられる原因を確認してください。
-
K8s イベントセンターをデプロイしてから、K8s クラスターで新しいイベントが生成されていない。
kubectl get events --all-namespacesコマンドを実行して、クラスター内の新しいイベントを確認できます。 -
eventer および node-problem-detector コンポーネントをデプロイする際に、パラメーターが正しく設定されていなかった。
-
ACK クラスターを使用している場合は、次の手順に従ってください。
-
ACK コンソールにログインします。
-
「[クラスター]」ページで、対象のクラスターをクリックします。
-
左側のナビゲーションウィンドウで、 を選択します。
-
「Helm」ページで、「ack-node-problem-detector」を探し、「更新」をクリックします。
-
パラメーター設定を確認し、変更します。詳細については、「ステップ 1: kube-eventer と node-problem-detector のデプロイ」をご参照ください。
-
-
自己管理型 Kubernetes クラスターを使用している場合は、パラメーター設定について「Kubernetes イベントの収集」をご参照ください。
-
イベントコンテナログの表示
-
ACK クラスターを使用している場合は、次の手順に従ってください。
-
ACK コンソールにログインします。
-
[クラスター] ページで、対象のクラスターをクリックします。
-
左側のナビゲーションウィンドウで、 を選択します。
-
[名前空間] を [kube-system] に設定します。
-
[Pods] リストで、対象の Pod を見つけ、[ログ] をクリックします。
-
-
自己管理型 Kubernetes クラスターを使用している場合、[kube-system] Namespace の
eventer-slsで始まるプレフィックスを持つ Pod のログを表示します。