イベントはKubernetesクラスターのステータス変更を記録します。 たとえば、ポッドを作成、実行、または削除したとき、またはコンポーネントの例外が発生したときに、イベントでステータスの変更を記録できます。 K8s Event Centerは、Kubernetesクラスター内のすべてのイベントをリアルタイムで収集します。 これにより、イベントに対してさまざまな操作を実行できます。 たとえば、イベントデータを保存、クエリ、分析、視覚化したり、イベントのアラートを設定したりできます。 このトピックでは、K8sイベントセンターでイベントセンターを作成して使用する方法について説明します。
Kubernetesはステートマシンに基づいて設計されています。 イベントは、異なる状態間の遷移によって生成される。 通常、正常イベントは、状態マシンが予想される状態に変化するときに生成され、警告イベントは、状態マシンが予想されない状態に変化するときに生成される。
ACKは、コンテナ化シナリオを対象とする既成のイベント監視ソリューションを提供します。 ACKは、NPDによって提供されるNPDおよびkube − eventerを使用してコンテナイベントを監視する。
NPDは、Kubernetesノードを診断するためのツールです。 NPDはノード例外を検出し、ノードイベントを生成し、kube-eventerと連携してこれらのイベントにアラートを発生させ、アラートの閉ループ管理を有効にします。 NPDは、Dockerエンジンのハング、Linuxカーネルのハング、アウトバウンドトラフィックの例外、およびファイル記述子の例外が検出されると、ノードイベントを生成します。 詳細は、「NPD」をご参照ください。
kube-eventerは、ACKによって維持されるオープンソースのイベントエミッタです。 kube-eventerは、KubernetesイベントをDingTalk、Simple Log Service、EventBridgeなどのシンクに送信します。 kube-eventerは、さまざまなレベルのイベントをフィルタリングするフィルタ条件も提供します。 kube-eventerを使用して、イベントをリアルタイムで収集したり、特定のイベントでアラートをトリガーしたり、イベントを非同期にアーカイブしたりできます。 詳細については、『kube-eventer』をご参照ください。
NPDは、Kubernetesノードを診断するためのツールです。 NPDはノード例外を検出し、ノードイベントを生成し、kube-eventerと連携してこれらのイベントにアラートを発生させ、アラートの閉ループ管理を有効にします。 NPDは、Dockerエンジンのハング、Linuxカーネルのハング、アウトバウンドトラフィックの例外、およびファイル記述子の例外が検出されると、ノードイベントを生成します。 詳細は、「NPD」をご参照ください。
kube-eventerは、ACKによって維持されるオープンソースのイベントエミッタです。 kube-eventerは、KubernetesイベントをDingTalk、Simple Log Service、EventBridgeなどのシンクに送信します。 kube-eventerは、さまざまなレベルのイベントをフィルタリングするフィルタ条件も提供します。 kube-eventerを使用して、イベントをリアルタイムで収集したり、特定のイベントでアラートをトリガーしたり、イベントを非同期にアーカイブしたりできます。 詳細については、『kube-eventer』をご参照ください。
前提条件
Container Service for Kubernetes (ACK) クラスターやACKサーバーレスクラスターなどのKubernetesクラスターが作成されます。
課金
次の条件が満たされている場合、イベントセンターを使用しても課金されません。
イベントセンターに関連付けられているLogstoreのデータ保持期間は90日で、これがデフォルト値です。
イベントセンターに書き込まれる1日あたりのデータ量は256 MB未満で、これは約250,000イベントに相当します。
例:
関連付けられたLogstoreにデフォルトのデータ保持期間が指定されており、1,000イベントがKubernetesクラスターで1日あたりに生成される場合、イベントセンターを無料で使用できます。
データ保持期間を105日に変更した場合、Kubernetesクラスターで1日あたり1,000イベントが生成された場合、90日間データが保存された後、関連付けられたLogstoreに保存されたデータに対して課金されます。 料金は、ログデータが占有するストレージスペースの請求可能項目に基づいて計算されます。. 請求可能なアイテムの詳細については、「ペイバイフィーチャーの請求可能なアイテム」をご参照ください。
ステップ1: kube-eventerおよびnode-problem-detectorコンポーネントのデプロイ
ACKクラスター
ACKクラスターを使用する場合、コンポーネントはkube-eventerおよびnode-problem-detectorコンポーネントの機能と統合されているため、ack-node-problem-detectorコンポーネントのみをデプロイする必要があります。 詳細については、「イベントモニタリング」をご参照ください。 ACKサーバーレスクラスターを使用する場合は、kube-eventerコンポーネントをデプロイする必要があります。
NPDは、サードパーティのプラグインと連携して、ノード例外を検出し、クラスターイベントを生成します。 Kubernetesクラスターは、クラスターのステータスが変更されたときにもイベントを生成します。 たとえば、ポッドが追い出されたり、イメージプル操作が失敗したりすると、関連するイベントが生成されます。 Simple Log ServiceのKubernetesイベントセンターは、クラスターイベントを収集、保存、および視覚化します。 これらのイベントをクエリおよび分析し、アラートを設定できます。 以下の方法を使用して、クラスターイベントをSimple Log ServiceのKubernetesイベントセンターにシンクできます。
クラスターの作成時に [node-problem-detectorのインストールとイベントセンターの作成] を選択している場合は、手順2に進み、Kubernetesイベントセンターを表示します。 クラスターの作成時にack-node-problem-detectorコンポーネントをインストールする方法の詳細については、「ACK管理クラスターの作成」をご参照ください。
クラスターの作成時に [ノード問題検出器のインストールとイベントセンターの作成] を選択しなかった場合は、次の手順を実行して手動でインストールします。
ACKコンソールにログインします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、 を選択します。
[ロギングとモニタリング] タブで、[ack-node-problem-detector] を見つけてインストールします。
その他のKubernetesクラスター
kube-eventerコンポーネントをデプロイします。
kubectlツールをインストールします。 詳細については、「kubectlを使用したACKクラスターへの接続」をご参照ください。
次のサンプルコードを使用して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" ## .send to 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: # If TZ is assigned, set the TZ value as the time zone - 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
String
課金されます
Simple Log Serviceエンドポイント。 詳細については、「エンドポイント」をご参照ください。
project
String
課金されます
Simple Log Serviceプロジェクト。
logStore
String
課金されます
Simple Log Service Logstore。
内部
String
自己管理型Kubernetesクラスターの場合ははい
自己管理型Kubernetesクラスターを使用する場合は、値をfalseに設定します。
regionId
String
自己管理型Kubernetesクラスターの場合ははい
Simple Log Serviceプロジェクトが存在するリージョンのID。 詳細については、「エンドポイント」をご参照ください。
accessKeyId
String
自己管理型Kubernetesクラスターの場合ははい
AccessKey ID。 Resource Access Management (RAM) ユーザーのAccessKey IDを使用することを推奨します。 詳細は、「AccessKeyペア」をご参照ください。
accessKeySecret
String
自己管理型Kubernetesクラスターの場合ははい
AccessKeyシークレット。 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』をご参照ください。
ステップ2: イベントセンターを作成する
イベントセンターを作成すると、Simple Log Serviceは指定されたプロジェクトにk8s-event
という名前のLogstoreを自動的に作成します。 関連するダッシュボードもイベントセンター用に作成されます。
Simple Log Serviceコンソールにログインします。
[ログアプリケーション] セクションで、[インテリジェントO&M] タブをクリックします。 [K8sイベントセンター] をクリックします。
[イベントセンターの管理] ページで、右上隅の [追加] をクリックします。
[イベントセンターの作成] パネルでパラメーターを設定し、[次へ] をクリックします。
[既存のプロジェクトの選択] を選択した場合、[プロジェクト] ドロップダウンリストから既存のプロジェクトを選択して、イベントセンターのリソースを管理できます。 リソースには、Logstoreと関連するダッシュボードが含まれます。
[Container Service for KubernetesからKubernetesクラスターを選択] を選択した場合、[K8sクラスター] ドロップダウンリストから既存のKubernetesクラスターを選択できます。 この方法を使用してイベントセンターを作成すると、Simple Log Serviceは、イベントセンターのリソースを管理するために、名前が
k8s-log-{cluster-id}
形式のプロジェクトを自動的に作成します。 リソースには、Logstoreと関連するダッシュボードが含まれます。
ステップ3: イベントセンターを使用する
K8s event centerでイベントセンターを作成し、kube-eventerコンポーネントとnode-problem-detectorコンポーネントをデプロイしたら、イベントセンターを使用できます。 たとえば、イベントセンターを使用して、イベント統計の表示、イベントの詳細の照会、ポッドのライフサイクルの表示、ノードイベントの表示、コアコンポーネントイベントの表示、アラートの設定、カスタムクエリ操作の実行、K8sイベントセンターのバージョンの更新を行うことができます。
[K8sイベントセンター] ページの左側のナビゲーションウィンドウで、管理するイベントセンターを見つけ、アイコンをクリックします。 次に、次の操作を実行できます。
API 操作 | 説明 |
イベント統計の表示 | [イベントの概要] タブには、コアイベントの統計が表示されます。 統計には、イベントの総数、当日と前日のエラーイベントの数の差、アラートの統計、エラーイベントの傾向、ポッドOOMイベントの詳細が含まれます。 説明 ポッドOOMイベントが記録されている場合、イベントが発生したノード、プロセス名、およびプロセスIDのみを表示できます。 イベントが発生したポッドを特定できません。 ただし、ポッドOOMイベントの前後に発生するポッド再起動イベントを照会できます。 このようにして、ポッドを識別できます。 |
イベントの詳細の照会 | [イベントの詳細] タブには、イベントの種類、イベントの宛先、ホスト、名前空間、名前など、さまざまなフィルター条件を使用して返されるイベントの詳細が表示されます。 |
ポッドのライフサイクルを表示する | ポッドのライフサイクルタブには、ポッドのライフサイクル内で発生するイベントの詳細が表示されます。 イベントレベルで重要なポッドイベントをフィルタリングできます。 |
ノードイベントの表示 | [ノードイベント] タブには、ノードイベントの詳細が表示されます。 ノードのライフサイクルと、ノードで発生するイベントを表示できます。 |
コアコンポーネントのイベントの表示 | [イベントコア] タブには、コアコンポーネントのイベントの詳細が表示されます。 イベントには、NLC.Task.RestartECS.FailとNLC.Task.URL.Mode.Unimplementedが含まれます。 |
アラートの設定 | [アラート設定] をクリックした後に表示されるページで、イベントセンターのアラートを設定できます。 詳細については、「アラートの設定」をご参照ください。 |
カスタムクエリ操作の実行 | [カスタムクエリ] をクリックした後に表示されるページで、カスタムクエリ文を実行できます。 イベントセンター内のすべてのイベントはLogstoreに保存されます。 Logstoreのすべての機能を使用できます。 たとえば、カスタムクエリ文を実行したり、イベントデータを消費したり、カスタムレポートを作成したり、カスタムアラートを設定したりできます。 詳細については、「ログの照会と分析」をご参照ください。 イベントセンターに指定されたプロジェクトにアクセスする場合は、次のいずれかの方法でプロジェクトの名前を取得できます。
|
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 | String | イベントが発生したサーバーのホスト名。 |
level | String | ログのレベル。 有効な値: Normal および Warning。 |
pod_id | String | pod の一意の識別子。 このフィールドは、イベントタイプがポッドに関連している場合にのみ使用できます。 |
pod_name | String | ポッドの名前。 このフィールドは、イベントタイプがポッドに関連している場合にのみ使用できます。 |
event_id | JSON | イベントの詳細。 このフィールドの値はJSON文字列です。 |
よくある質問
イベントセンターにデータが存在しないのはなぜですか?
イベントセンターをデプロイすると、新しいイベントがイベントセンターに自動的に収集されます。 [カスタムクエリ] をクリックすると、イベントを検索できます。 右上隅の時間範囲を1日に設定することをお勧めします。 次の理由により、イベントセンターでデータが見つからない場合があります。
イベントセンターをデプロイした後、関連付けられたKubernetesクラスターにはイベントは生成されません。
kubectl get events -- all-namespaces
コマンドを実行して、クラスターで新しいイベントが生成されているかどうかを確認できます。kube-eventerおよびnode-problem-detectorコンポーネントのデプロイに使用されるパラメーターには、無効な値が指定されています。
ACKクラスターを使用する場合は、次の手順を実行します。
ACKコンソールにログインします。
[クラスター] ページで、管理するクラスターを見つけ、クラスターの名前をクリックします。
左側のナビゲーションウィンドウで、
を選択します。Helmページで、ack-node-problem-detectorを見つけ、[操作] 列の [更新] をクリックします。
パラメータ設定を確認して変更します。 詳細については、「手順1: kube-eventerおよびnode-problem-detectorコンポーネントのデプロイ」をご参照ください。
セルフマネージドKubernetesクラスターを使用する場合は、「Kubernetesイベントの収集」の手順に従ってください。
イベントが発生したコンテナのログを表示するにはどうすればよいですか?
ACKクラスターを使用する場合は、次の手順を実行します。
ACKコンソールにログインします。
[クラスター] ページで、管理するクラスターを見つけ、クラスターの名前をクリックします。
左側のナビゲーションウィンドウで、
を選択します。名前空間パラメーターをkube-systemに設定します。
[ポッド] ページで、管理するポッドを見つけ、[操作] 列の [ログ] をクリックします。
自己管理型Kubernetesクラスターを使用している場合は、kube-system名前空間と、名前がeventer-slsの接頭辞を付けられたファイルを見つけて、ポッドログを表示します。