このページでは、接続クラスタから Cloud Logging と Cloud Monitoring にログと指標をエクスポートする方法について説明します。
仕組み
Google Cloud Observability は、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 Daemonset です。
- 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 つの接続クラスタ。クラスタが登録済みかどうかは、次のコマンドで確認します。
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.
テストアプリケーションをクラスタにデプロイします。これは、負荷生成ツールを含む基本的な 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 コンソールの [ログ エクスプローラ] に移動します。
ログ エクスプローラで、次のサンプルクエリを [クエリビルダー] フィールドにコピーします。
${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/spec
で、ロギング エージェントのインストールの説明に従って、クラウド プロバイダに一致する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