AKS - コントロール プレーン アプリケーションのログの収集
このページでは、Azure で管理されるマスタ ノード ログを Azure Kubernetes Service (AKS) で収集してイベント ハブに、Azure 関数に、そして最終的に Sumo Logic の Hosted Collector 上にある HTTP Source に転送するためのパイプラインを設定する手順を紹介します。
AKS - コントロール プレーン ログ
AKS - コントロール プレーン アプリケーションは、Azure Kubernetes Service (AKS) で、Azure で管理されるマスタ ノード ログを使用します。AKS - コントロール プレーン アプリケーションは、以下のサービスのログを収集します。
-
kube-apiserver - API サーバは、基礎となる Kubernetes API を提供します。このコンポーネントは、kubectl や Kubernetes ダッシュボードなどの管理ツールのインタラクションを提供します。
-
kube-scheduler - Scheduler は、アプリケーションを作成またはスケーリングして起動するときにワークロードを実行できるノードを決定します。
-
kube-controller-manager - Controller Manager は、ポッドの複製やノード オペレーションの処理などのアクションを実行する多くの小さいコントローラを監督します。
Sumo Logic Kubernetes アプリケーションは、AKS - コントロール プレーン アプリケーションと連携して動作し、ワーカー ノード ログや Azure Monitor およびワーカー ノードのメトリクスをモニタリングできるようにします。
収集プロセス
AKS - コントロール プレーン アプリケーションのログとメトリクスの収集は、2 ステップのプロセスで設定します。
- 収集のセットアップと Sumo Logic Kubernetes アプリケーションのインストール。
- AKS での Azure Monitor の設定とマスタ ノード ログの有効化
ステップ 1.Sumo Logic Kubernetes アプリケーションのセットアップとインストール
Sumo Logic Kubernetes アプリケーションは、Kubernetes ワーカー ノードの管理とモニタリングを行うサービスを提供します。AKS - コントロール プレーン アプリケーションの収集を設定する前に、Kubernetes アプリケーションの収集をセットアップしてアプリケーションをインストールする必要があります。このプロセスでは、ログとメトリクスの収集を設定します。
Kubernetes アプリケーションをセットアップしてインストールするにはこのドキュメントの手順に従ってください。
ステップ 2.AKS での Azure Monitor の設定とログの有効化
このセクションでは、Azure Monitor から Sumo Logic にログを送信するためのパイプラインの設定プロセスを順を追って説明します。AKS - コントロール プレーン アプリケーションは次のログ タイプを使用します。
- kube-apiserver
- kube-scheduler
- kube-controller-manager
Azure Monitor を設定して AKS ログを有効化するには、次の手順を実行します。
- このページの「Azure Monitor からログを収集する」のステップ 1 とステップ 2 を実行します。
- 前のステップで作成したイベント ハブにログを送信するように Kubernetes マスタ ノード ログを Azure Kubernetes Service で有効化します。
ログ メッセージのサンプル
kube-apiserver
{ "operationName":"Microsoft.ContainerService/managedClusters/diagnosticLogs/Read", "category":"kube-apiserver", "resourceId":"/SUBSCRIPTIONS/C111111-DXXX-4XXX-AXXX-900000000/RESOURCEGROUPS/AG-AKS-RG/PROVIDERS/MICROSOFT.CONTAINERSERVICE/MANAGEDCLUSTERS/AG-AKS-CLUSTER", "properties":▼{ "log":"I0624 20:14:59.855669 1 wrap.go:47] PUT /api/v1/namespaces/kube-system/endpoints/kube-scheduler?timeout=10s: (9.05251ms) 200 [hyperkube/v1.12.8 (linux/amd64) kubernetes/a89f8c1/leader-election 172.31.1.1:48110] ", "stream":"stderr", "pod":"kube-apiserver-796bd9b775-xqk5s", "containerID":"2d6cac1300da3226323fd1b936fe8278b87cba2b7a1bbd9c8401da6f8e786f5e" }, "time":"2019-06-24T20:14:59.000Z" }
kube-controller-manager
{ "operationName":"Microsoft.ContainerService/managedClusters/diagnosticLogs/Read", "category":"kube-controller-manager", "resourceId":"/SUBSCRIPTIONS/C111111-DXXX-4XXX-AXXX-900000000/RESOURCEGROUPS/AG-AKS-RG/PROVIDERS/MICROSOFT.CONTAINERSERVICE/MANAGEDCLUSTERS/AG-AKS-CLUSTER", "properties":▼{ "log":"I0624 07:27:25.976386 1 event.go:221] Event(v1.ObjectReference{Kind:\"DaemonSet\", Namespace:\"kube-system\", Name:\"kube-proxy\", UID:\"2dfb3905-7dac-11e9-b60d-0a58ac1f01f6\", APIVersion:\"apps/v1\", ResourceVersion:\"4150266\", FieldPath:\"\"}): type: 'Normal' reason: 'SuccessfulCreate' Created pod: kube-proxy-xhmv7 ", "stream":"stderr", "pod":"kube-controller-manager-59fd65c5bd-694kh", "containerID":"667b540db41b66e914ca2ed496e0bef6d4a0b73fc832f5d5eba958d8a56a5e93" }, "time":"2019-06-24T07:27:25.000Z" }
kube-scheduler
{ "operationName":"Microsoft.ContainerService/managedClusters/diagnosticLogs/Read", "category":"kube-scheduler", "resourceId":"/SUBSCRIPTIONS/C111111-DXXX-4XXX-AXXX-900000000/RESOURCEGROUPS/AG-AKS-RG/PROVIDERS/MICROSOFT.CONTAINERSERVICE/MANAGEDCLUSTERS/AG-AKS-CLUSTER", "properties":▼{ "log":"W0622 22:50:25.377565 1 reflector.go:256] k8s.io/client-go/informers/factory.go:131: watch of *v1.StorageClass ended with: too old resource version: 3828720 (3970094) ", "stream":"stderr", "pod":"kube-scheduler-744886667c-cxnvk", "containerID":"6093b28d82e1f850fb5a9f59ed8c31aa7179e8a3907449dcd2450a6605341a60" }, "time":"2019-06-22T22:50:25.000Z" }
クエリのサンプル
kube-apiserver
_sourceCategory="azure/aks" "kube-apiserver" | json "properties.log", "category", "time", "properties.pod", "resourceId" as log, category, time, pod, resourceId | where category ="kube-apiserver" | parse regex field=log "(?<severity>W|I|F|E)(?<tt>[\S]+) (?<times>[\d:.]+)[\s]+(?<log_msg>.*)" | parse regex field=resourceId "RESOURCEGROUPS\/(?<resource_grp>[\S]+)\/PROVIDERS\/MICROSOFT\.CONTAINERSERVICE\/MANAGEDCLUSTERS\/(?<cluster>[\S]+)" | timeslice 1h | count by _timeslice, severity | transpose row _timeslice column severity | fillmissing timeslice(1h)
kube-controller-manager
_sourceCategory="azure/aks" ("kube-controller-manager") | json "properties.log", "category", "time", "properties.pod", "resourceId" as log, category, time, pod, resourceId | where category ="kube-controller-manager" | parse regex field=log "(?<severity>W|I|F|E)(?<tt>[\S]+) (?<times>[\d:.]+)[\s]+(?<log_msg>.*)" | parse regex field=resourceId "RESOURCEGROUPS\/(?<resource_grp>[\S]+)\/PROVIDERS\/MICROSOFT\.CONTAINERSERVICE\/MANAGEDCLUSTERS\/(?<cluster>[\S]+)" | timeslice 1h | count by _timeslice, severity | transpose row _timeslice column severity | fillmissing timeslice(1h)
kube-scheduler
_sourceCategory="azure/aks" "kube-scheduler" | json "properties.log", "category", "time", "properties.pod", "resourceId" as log, category, time, pod, resourceId | where category ="kube-scheduler" | parse regex field=log "(?<severity>W|I|F|E)(?<tt>[\S]+) (?<times>[\d:.]+)[\s]+(?<log_msg>.*)" | parse regex field=resourceId "RESOURCEGROUPS\/(?<resource_grp>[\S]+)\/PROVIDERS\/MICROSOFT\.CONTAINERSERVICE\/MANAGEDCLUSTERS\/(?<cluster>[\S]+)" | timeslice 1h | count by _timeslice, severity | transpose row _timeslice column severity | fillmissing timeslice(1h)