Kubernetes イベントは、クラスター内の状態変化を記録します。たとえば、Pod の作成、実行、削除、またはコンポーネントのエラーなどです。K8s イベントセンターは、すべての Kubernetes クラスターイベントをリアルタイムで収集し、ストレージ、クエリ、分析、可視化、およびアラート機能を提供します。このトピックでは、K8s イベントセンターを作成して使用する手順について説明します。
背景情報
Kubernetes アーキテクチャはステートマシンに基づいています。システムが状態間を遷移すると、イベントが生成されます。通常の状態間の遷移では Normal イベントが生成され、通常状態と異常状態の間の遷移では Warning イベントが生成されます。
Container Service for Kubernetes (ACK) は、コンテナ化された環境向けのすぐに使えるイベント監視ソリューションを提供します。ACK が保守する node-problem-detector (NPD) とその内蔵コンポーネントである kube-eventer を使用して、イベント監視を提供します。
node-problem-detector (NPD) は、Kubernetes ノードを診断するためのツールです。Docker Engine のハング、Linux カーネルのハング、パブリックネットワークアクセスの例外、ファイル記述子の問題など、ノードの異常をノードイベントに変換します。kube-eventer と組み合わせることで、ノードイベントのクローズドループアラートシステムを実現します。
kube-eventer は、Kubernetes イベントをアーカイブするために ACK が保守するオープンソースツールです。DingTalk、Simple Log Service (SLS)、EventBridge などの外部システムにクラスターイベントをプッシュできます。また、イベントレベルに基づくフィルタリング機能も提供します。これにより、イベントのリアルタイム収集、ターゲットを絞ったアラート、および非同期アーカイブが可能になります。
前提条件
Alibaba Cloud ACK クラスターやACK Serverless クラスターなどの Kubernetes クラスターが作成されています。
課金
K8s イベントセンターは、以下の条件を満たす場合は無料です。
K8s イベントセンターに関連付けられた Logstore のデータ保持期間が 90 日 (デフォルト値) であること。
K8s イベントセンターに書き込まれるデータ量が 1 日あたり 256 MB 未満であること。これは約 250,000 イベントに相当します。
例:
デフォルトのデータ保持期間である 90 日を使用し、Kubernetes クラスターが 1 日あたり 1,000 イベントを生成する場合、K8s イベントセンターは無料です。
データ保持期間を 105 日に設定し、Kubernetes クラスターが 1 日あたり 1,000 イベントを生成する場合、90 日後から Logstore ストレージに対して課金されます。課金項目は「ログストレージ」。「ログストレージ」課金項目の詳細については、「従量課金モードの課金項目」をご参照ください。
ステップ 1: kube-eventer と node-problem-detector のデプロイ
ACK
ACK クラスタを使用する場合、ack-node-problem-detector コンポーネントはkube-eventer と node-problem-detector の両方の機能を統合しているため、このコンポーネントをデプロイするだけで済みます。ACK Serverless クラスタを使用する場合、kube-eventer コンポーネントをデプロイする必要があります。
NPD は、設定とサードパーティプラグインを使用してノードの問題を検出し、対応するクラスターイベントを生成します。Kubernetes クラスターは、Pod の退去やイメージプル失敗などの状態遷移中に独自のイベントも生成します。Simple Log Service (SLS) の K8s イベントセンターは、すべての Kubernetes イベントをリアルタイムで一元化し、ストレージ、クエリ、分析、可視化、およびアラート機能を提供します。クラスターイベントを K8s イベントセンターと統合するには、次の手順を実行します。
クラスターの作成時に [node-problem-detector のインストールとイベントセンターの作成] を選択した場合は、 ステップ 2 に進み、Kubernetes イベントセンターを表示できます。 クラスター作成時に 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が設定されている場合、その値をタイムゾーンとして設定します - 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。
internal
string
セルフマネージド Kubernetes クラスターでは必須。
セルフマネージド Kubernetes クラスターの場合、このパラメータを false に設定する必要があります。
regionId
string
セルフマネージド Kubernetes クラスターでは必須。
Simple Log Service が存在するリージョンの ID。詳細については、「エンドポイント」をご参照ください。
accessKeyId
string
セルフマネージド Kubernetes クラスターでは必須。
アクセスキー ID。Resource Access Management (RAM) ユーザーのアクセスキーペアを使用することを推奨します。詳細については、「アクセスキーペア」をご参照ください。
accessKeySecret
string
セルフマネージド Kubernetes クラスターでは必須。
アクセスキーシークレット。Resource Access Management (RAM) ユーザーのアクセスキーペアを使用することを推奨します。詳細については、「アクセスキーペア」をご参照ください。
次のコマンドを実行して、
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をデプロイします。
ステップ 2: K8s イベントセンターインスタンスの作成
K8s イベントセンターインスタンスを作成すると、Simple Log Service は自動的に k8s-event という名前の Logstore と関連するダッシュボードを宛先プロジェクト内に作成します。
Simple Log Service コンソールにログインします。
ログアプリケーション セクションで、インテリジェント O&M タブをクリックし、次に K8s イベントセンター をクリックします。
イベントセンター管理 ページで、右上隅にある 追加 をクリックします。
イベントセンターの追加 パネルで、パラメーターを設定し、次へ をクリックします。
既存のプロジェクト を選択した場合は、[プロジェクト] ドロップダウンリストから既存のプロジェクトを選択し、Logstore やダッシュボードなどの K8s イベントセンターインスタンスのリソースを管理します。
Kubernetes クラスター を選択した場合は、K8s Cluster ドロップダウンリストから既存の K8s クラスターを選択します。 この方法を使用すると、Simple Log Service は、Logstore やダッシュボードなどの K8s イベントセンターインスタンスのリソースを管理するために、
k8s-log-{cluster-id}という名前のプロジェクトを自動的に作成します。
ステップ 3: K8s イベントセンターインスタンスの使用
K8s イベントセンターインスタンスを作成し、kube-eventer と node-problem-detector をデプロイすると、イベントセンターの使用を開始できます。イベント概要の表示、イベント詳細のクエリ、Pod のライフサイクルの表示、ノードイベントの表示、コアコンポーネントイベントの表示、アラートの設定、カスタムクエリの実行、およびバージョンの更新を行うことができます。
K8s イベントセンター ページで、ターゲット K8s イベントセンターインスタンスを見つけ、[
] アイコンをクリックして以下の操作を実行します。
操作 | 説明 |
イベント概要の表示 | イベント概要 ページには、コアイベントの概要統計が表示されます。 統計には、イベントの総数、今日と昨日のエラーイベントの比較、アラート統計、エラーイベントの傾向、および Pod OOM の詳細が含まれます。 説明 Pod OOM 情報は特定の Pod を識別しません。イベントが発生したノード、プロセス名、およびプロセス ID のみを特定できます。カスタムクエリを実行して、Pod OOM の発生時刻付近で発生する 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 | string | イベントが発生したホストのホスト名。 |
level | string | ログレベル。有効な値:Normal および Warning。 |
pod_id | string | Pod の一意の ID。このフィールドは、イベントが Pod に関連している場合にのみ含まれます。 |
pod_name | string | Pod の名前。このフィールドは、イベントが Pod に関連している場合にのみ含まれます。 |
event_id | json | イベントの詳細。このフィールドの値は JSON 文字列です。 |
よくある質問
K8s イベントセンターインスタンスにデータがない
K8s イベントセンターインスタンスをデプロイすると、新しいイベントが自動的に収集されます。 収集されたイベントはカスタムクエリ ページで検索できます。 右上の時間範囲を 1 Day に設定することをお勧めします。 データが見つからない場合、通常、原因は 2 つあります。
K8s イベントセンターをデプロイして以降、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 に設定します。
ポッド リストで、目的のポッドの Log をクリックします。
自己管理型 Kubernetes クラスターを使用している場合、[kube-system] 名前空間内の、ファイル名のプレフィックスが
eventer-slsの Pod のログを確認してください。