Anthos 接続クラスタのロギングとモニタリング
このページでは、Anthos に接続されたクラスタから Cloud Logging と Cloud Monitoring にログと指標をエクスポートする方法について説明します。
仕組み
Google Cloud のオペレーション スイートは、Google Cloud の組み込みオブザーバビリティ ソリューションです。接続されたクラスタからクラスタレベルのテレメトリーを Google Cloud にエクスポートするには、次のオープンソースのエクスポート エージェントをクラスタにデプロイする必要があります。
- Stackdriver Log Aggregator(stackdriver-log-aggregator-*): Cloud Logging(旧称 Stackdriver Logging)API にログを送信する Fluentd StatefulSet です。
- Stackdriver Log Forwarder(stackdriver-log-forwarder-*): 各 Kubernetes ノードから Stackdriver Log Aggregator にログを転送する Fluentbit デーモンセットです。
- Stackdriver Metrics Collector(stackdriver-prometheus-k8s-*): Stackdriver Export サイドカー コンテナを使用して構成された Prometheus StatefulSet は、Prometheus 指標を Cloud Monitoring(旧 Stackdriver Monitoring)API に送ります。サイドカーは、同じ Pod 内の別のコンテナで、prometheus サーバーがディスクに保存する指標を読み取って Cloud Monitoring API に転送します。
要件
課金を有効にした Google Cloud プロジェクト。Cloud Operations の費用については、料金ガイドをご覧ください。
このガイドを使用して作成した 1 つの Anthos 接続クラスタ。次のコマンドを実行して、クラスタが登録済みであることを確認します。
gcloud container fleet memberships list
出力例:
NAME EXTERNAL_ID eks ae7b76b8-7922-42e9-89cd-e46bb8c4ffe4
クラスタにアクセスして
kubectl
コマンドを実行できるローカル環境。gcloud を使用してkubectl
をインストールする方法については、GKE のクイックスタートをご覧ください。次のコマンドを実行して、kubectl
を使用して接続されたクラスタにアクセスできることを確認します。kubectl cluster-info
出力例:
Kubernetes master is running at https://[redacted].gr7.us-east-2.eks.amazonaws.com
設定
サンプル リポジトリのクローンを作成し、このガイドのディレクトリに移動します。
git clone https://github.com/GoogleCloudPlatform/anthos-samples cd anthos-samples/attached-logging-monitoring
プロジェクト ID 変数を、クラスタを登録したプロジェクトに設定します。
PROJECT_ID="your-project-id"
Cloud Monitoring API と Cloud Logging API に指標とログを書き込む権限を持つ Google Cloud サービス アカウントを作成します。このサービス アカウントの鍵を、次のセクションでデプロイするワークロードに追加します。
gcloud iam service-accounts create anthos-lm-forwarder gcloud projects add-iam-policy-binding $PROJECT_ID \ --member="serviceAccount:anthos-lm-forwarder@${PROJECT_ID}.iam.gserviceaccount.com" \ --role=roles/logging.logWriter gcloud projects add-iam-policy-binding $PROJECT_ID \ --member="serviceAccount:anthos-lm-forwarder@${PROJECT_ID}.iam.gserviceaccount.com" \ --role=roles/monitoring.metricWriter
作成したサービス アカウントの JSON キーを作成してダウンロードし、そのキーを使用してクラスタの Kubernetes Secret を作成します。
gcloud iam service-accounts keys create credentials.json \ --iam-account anthos-lm-forwarder@${PROJECT_ID}.iam.gserviceaccount.com kubectl create secret generic google-cloud-credentials -n kube-system --from-file credentials.json
ロギング エージェントをインストールする
logging/
ディレクトリに移動します。cd logging/
aggregator.yaml
を開きます。ファイルの一番下で、次の変数をプロジェクトとクラスタに対応する値に設定します。project_id [PROJECT_ID] k8s_cluster_name [CLUSTER_NAME] k8s_cluster_location [CLUSTER_LOCATION]
クラスタの場所を確認するには、接続されているクラスタのメンバーシップ名で次のコマンドを実行して、
/locations/<location>
に表示される場所を取得します。gcloud container fleet memberships describe eks | grep name
出力:
name: projects/my-project/locations/global/memberships/eks
aggregator.yaml
のvolumeClaimTemplates/spec
で、クラスタの PersistentVolumeClaimstorageClassName
を指定します。EKS と AKS にはデフォルト値があり、必要に応じてコメント化を解除します。EKS を使用している場合、これはgp2
です。AKS の場合、これはdefault
です。AWS または Azure でカスタムの Kubernetes ストレージ クラスを構成している場合、デフォルト以外のストレージ クラスを使用する場合、または別の標準準拠のクラスタタイプを使用している場合は、独自の
storageClassName
を追加できます。適切なstorageClassName
は、StorageClass
を使用するクラスタに対して管理者がプロビジョニングした PersistentVolume(PV)のタイプに基づいています。他の主要な Kubernetes プロバイダのストレージ クラスとデフォルトのストレージ クラスについて詳しくは、Kubernetes のドキュメントをご覧ください。# storageClassName: standard #Google Cloud # storageClassName: gp2 #AWS EKS # storageClassName: default #Azure AKS
ログ アグリゲータとフォワーダをクラスタにデプロイします。
kubectl apply -f aggregator.yaml kubectl apply -f forwarder.yaml
Pod が起動したことを確認します。Kubernetes ワーカーノードごとに 2 つのアグリゲータ Pod と 1 つのフォワーダー Pod が表示されます。たとえば、4 ノードクラスタの場合、4 つのフォワーダー Pod が表示されます。
kubectl get pods -n kube-system | grep stackdriver-log
出力:
stackdriver-log-aggregator-0 1/1 Running 0 139m stackdriver-log-aggregator-1 1/1 Running 0 139m stackdriver-log-forwarder-2vlxb 1/1 Running 0 139m stackdriver-log-forwarder-dwgb7 1/1 Running 0 139m stackdriver-log-forwarder-rfrdk 1/1 Running 0 139m stackdriver-log-forwarder-sqz7b 1/1 Running 0 139m
アグリゲータ ログを取得し、ログが Google Cloud に送信されていることを確認します。
kubectl logs stackdriver-log-aggregator-0 -n kube-system
出力:
2020-10-12 14:35:40 +0000 [info]: #3 [google_cloud] Successfully sent gRPC to Stackdriver Logging API.
クラスタにテスト アプリケーションをデプロイします。これは、loadgenerator を備えた基本的な HTTP ウェブサーバーです。
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/istio-samples/master/sample-apps/helloserver/server/server.yaml kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/istio-samples/master/sample-apps/helloserver/loadgen/loadgen.yaml
Cloud Logging ダッシュボードでクラスタのログを表示できることを確認するには、Google Cloud Console の [ログ エクスプローラ] に移動します。
ログ エクスプローラで、次のサンプルクエリを [クエリビルダー] フィールドにコピーします。
${your-cluster-name}
はクラスタ名で置き換えます。[クエリを実行] をクリックします。最近のクラスタログが [クエリ結果] に表示されます。resource.type="k8s_container" resource.labels.cluster_name="${your-cluster-name}"
モニタリング エージェントのインストール
logging/
ディレクトリからmonitoring/
ディレクトリに移動します。cd ../monitoring
prometheus.yaml
を開きます。stackdriver-prometheus-sidecar/args
で、環境に合わせて次の変数を設定します。"--stackdriver.project-id=[PROJECT_ID]" "--stackdriver.kubernetes.location=[CLUSTER_LOCATION]" "--stackdriver.generic.location=[CLUSTER_LOCATION]" "--stackdriver.kubernetes.cluster-name=[CLUSTER_NAME]"
prometheus.yaml の
volumeClaimTemplates
で、ロギング エージェントのインストールの説明に従って、クラウド プロバイダに一致するstorageClassName
のコメントを解除します。# storageClassName: standard #Google Cloud # storageClassName: gp2 #AWS EKS # storageClassName: default #Azure AKS
エクスポータ サイドカーで構成された stackdriver-prometheus StatefulSet をクラスタにデプロイします。
kubectl apply -f server-configmap.yaml kubectl apply -f sidecar-configmap.yaml kubectl apply -f prometheus.yaml
stackdriver-prometheus
Pod が動作していることを確認します。 出力:watch kubectl get pods -n kube-system | grep stackdriver-prometheus
stackdriver-prometheus-k8s-0 2/2 Running 0 5h24m
Stackdriver Prometheus サイドカー コンテナのログを取得して、Pod が起動したことを確認します。
出力:kubectl logs stackdriver-prometheus-k8s-0 -n kube-system stackdriver-prometheus-sidecar
level=info ts=2020-11-18T21:37:24.819Z caller=main.go:598 msg="Web server started" level=info ts=2020-11-18T21:37:24.819Z caller=main.go:579 msg="Stackdriver client started"
クラスタ指標が Cloud Monitoring に正常にエクスポートされていることを確認します。Google Cloud コンソールの Metrics Explorer に移動します。
[クエリエディタ] をクリックし、次のコマンドで
${your-project-id}
と${your-cluster-name}
を実際のプロジェクトとクラスタの情報に置き換えてコピーします。[クエリを実行] をクリックします。1.0.
のように表示されます。fetch k8s_container | metric 'kubernetes.io/anthos/up' | filter resource.project_id == '${your-project-id}' && (resource.cluster_name =='${your-cluster-name}') | group_by 1m, [value_up_mean: mean(value.up)] | every 1m
クリーンアップ
このガイドで作成したリソースをすべて削除するには:
kubectl delete -f logging kubectl delete -f monitoring kubectl delete secret google-cloud-credentials -n kube-system kubectl delete -f https://raw.githubusercontent.com/GoogleCloudPlatform/istio-samples/master/sample-apps/helloserver/loadgen/loadgen.yaml kubectl delete -f https://raw.githubusercontent.com/GoogleCloudPlatform/istio-samples/master/sample-apps/helloserver/server/server.yaml rm -r credentials.json gcloud compute service-accounts delete anthos-lm-forwarder