このドキュメントでは、eventer を使用して Kubernetes からイベントを収集し、Simple Log Service (SLS) に送信する方法について説明します。
Kubernetes アーキテクチャはステートマシンに基づいています。状態間の遷移により、対応するイベントが生成されます。正常な状態間の遷移では Normal レベルのイベントが生成され、正常な状態と異常な状態の間の遷移では Warning レベルのイベントが生成されます。
Container Service for Kubernetes (ACK) は、コンテナシナリオ向けにすぐに使えるイベント監視ソリューションを提供します。ACK がメンテナンスする Node Problem Detector (NPD) とそれに含まれる kube-eventer を使用して、コンテナイベントの監視を提供します。
Node Problem Detector (NPD) は、Kubernetes ノードの診断ツールです。Docker Engine のハング、Linux カーネルのハング、ネットワーク Egress の問題、ファイル記述子の異常などのノードの異常をノードイベントに変換します。kube-eventer と組み合わせることで、NPD はノードイベントアラートのクローズドループシステムを可能にします。
kube-eventer は、Kubernetes イベントのオフライン処理のために ACK によってメンテナンスされているオープンソースツールです。クラスターイベントを DingTalk、SLS、EventBridge などの外部システムにプッシュします。また、さまざまなイベントレベルのフィルター条件を提供し、リアルタイム収集、ターゲットを絞ったアラート、非同期アーカイブを可能にします。
Node Problem Detector (NPD) は、Kubernetes ノードの診断ツールです。Docker Engine のハング、Linux カーネルのハング、ネットワーク Egress の問題、ファイル記述子の異常などのノードの異常をノードイベントに変換します。kube-eventer と組み合わせることで、NPD はノードイベントアラートのクローズドループシステムを可能にします。
kube-eventer は、Kubernetes イベントのオフライン処理のために ACK によってメンテナンスされているオープンソースツールです。クラスターイベントを DingTalk、SLS、EventBridge などの外部システムにプッシュします。また、さまざまなイベントレベルのフィルター条件を提供し、リアルタイム収集、ターゲットを絞ったアラート、非同期アーカイブを可能にします。
前提条件
Alibaba Cloud ACK クラスターや ACK サーバーレスクラスターなどの 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 サーバーレスクラスターの場合、kube-eventer コンポーネントをデプロイする必要があります。
NPD は、設定とサードパーティのプラグインに基づいてノードの問題や障害を検出し、対応するクラスターイベントを生成します。Kubernetes クラスターは、Pod の退去やイメージのプル失敗など、状態遷移によってさまざまなイベントも生成します。SLS の Kubernetes イベントセンターは、すべての Kubernetes イベントをリアルタイムで集約し、ストレージ、クエリ、分析、可視化、およびアラート機能を提供します。次の手順では、クラスターイベントを SLS の Kubernetes イベントセンターに送信する方法について説明します:
クラスターの作成時に [Node-problem-detector (NPD) のインストールとイベントセンターの作成] を選択した場合は、 ステップ 2 に進み、Kubernetes イベントセンターを確認します。
クラスターの作成時に [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
string
はい
SLS のエンドポイント。詳細については、「エンドポイント」をご参照ください。
project
string
はい
SLS プロジェクト。
logStore
string
はい
SLS Logstore。
internal
string
セルフマネージド Kubernetes クラスターに必須です。
セルフマネージド Kubernetes クラスターの場合、このパラメーターを false に設定する必要があります。
regionId
string
セルフマネージド Kubernetes クラスターに必須です。
SLS が存在するリージョンの ID。詳細については、「エンドポイント」をご参照ください。
accessKeyId
string
セルフマネージド Kubernetes クラスターに必須です。
AccessKey ID。Resource Access Management (RAM) ユーザーの AccessKey ペアを使用することを推奨します。詳細については、「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をデプロイします。
ステップ 2:K8s イベントセンターインスタンスの作成
K8s イベントセンターインスタンスを作成すると、SLS は宛先プロジェクトに k8s-event という名前の Logstore と関連ダッシュボードを自動的に作成します。
Simple Log Service コンソールにログインします。
ログアプリケーション セクションで、インテリジェント O&M タブをクリックし、K8s イベントセンター をクリックします。
イベントセンター管理 ページで、右上隅の 追加 をクリックします。
イベントセンターの追加 パネルで、パラメーターを設定し、次へ をクリックします。
既存のプロジェクト を選択した場合は、[プロジェクト] ドロップダウンリストから既存のプロジェクトを選択し、K8s イベントセンターインスタンスのリソース (Logstore やダッシュボードなど) を管理します。
Kubernetes クラスター を選択した場合は、K8s Cluster ドロップダウンリストから既存の K8s クラスターを選択します。この方法を使用すると、SLS は
k8s-log-{cluster-id}という名前のプロジェクトを自動的に作成し、K8s イベントセンターインスタンスのリソース (Logstore やダッシュボードなど) を管理します。
ステップ 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 イベントセンターをアップグレードできます。 |
ログサンプル
次にログのサンプルを示します。
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 日に設定することを推奨します。データが見つからない場合、通常は次の 2 つの原因が考えられます:
K8s イベントセンターをデプロイしてから、Kubernetes クラスターで新しいイベントが生成されていない。
kubectl get events --all-namespacesコマンドを実行して、クラスターで新しいイベントが生成されているかどうかを確認できます。kube-eventerおよびnode-problem-detectorのデプロイで、パラメーターが正しく設定されていません。ACK クラスターを使用している場合は、次の手順を実行します:
ACK コンソールにログインします。
クラスターリスト ページで、対象クラスターの名前をクリックします。
左側のナビゲーションペインで、 を選択します。
[Helm] ページで、[ack-node-problem-detector] を見つけて 更新 をクリックします。
パラメーター設定を確認および変更します。
セルフマネージド Kubernetes クラスターを使用している場合は、「Kubernetes イベントの収集」でパラメーター設定をご参照ください。
イベントのコンテナログを表示する方法
ACK クラスターを使用している場合は、次の手順を実行します:
ACK コンソールにログインします。
クラスターリスト ページで、対象クラスターの名前をクリックします。
左側のナビゲーションペインで、 を選択します。
名前空間 を [kube-system] に設定します。
ポッド リストで、対象の Pod を見つけて Log をクリックします。
セルフマネージド Kubernetes クラスターを使用している場合は、[kube-system] 名前空間内の
kube-eventerというプレフィックスを持つ Pod のログを確認します。