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 に転送します。

要件

  1. 課金を有効にした Google Cloud プロジェクト。Cloud Operations の費用については、料金ガイドをご覧ください。

  2. このガイドを使用して登録した Anthos 接続クラスタ。次のコマンドを実行して、クラスタが登録済みであることを確認します。

    gcloud container hub memberships list
    

    出力例:

    NAME  EXTERNAL_ID
    eks   ae7b76b8-7922-42e9-89cd-e46bb8c4ffe4
    

  3. クラスタにアクセスして、kubectl コマンドを実行するためのローカル環境。gcloud を使用して kubectl をインストールする方法については、GKE クイックスタートをご覧ください。次のコマンドを実行して、接続されたクラスタにアクセスできるかどうかを kubectl で確認します。

    kubectl cluster-info
    

    出力例:

    Kubernetes master is running at https://[redacted].gr7.us-east-2.eks.amazonaws.com
    

設定

  1. サンプル リポジトリのクローンを作成し、このガイド用のディレクトリに移動します。

    git clone https://github.com/GoogleCloudPlatform/anthos-samples
    cd anthos-samples/attached-logging-monitoring
    
  2. プロジェクト ID 変数を、クラスタを登録したプロジェクトに設定します。

    PROJECT_ID="your-project-id"
    
  3. 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
    
  4. 作成したサービス アカウントの 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
    

ロギング エージェントをインストールする

  1. logging/ ディレクトリに移動します。

    cd logging/
    
  2. aggregator.yaml を開きます。ファイルの最後で、プロジェクトとクラスタに対応する値に以下の変数を設定します。

    project_id [PROJECT_ID]
    k8s_cluster_name [CLUSTER_NAME]
    k8s_cluster_location [CLUSTER_LOCATION]
    

    クラスタの場所を確認するには、接続されたクラスタのメンバーシップ名で次のコマンドを実行して、/locations/<location> に表示される場所を取得します。

    gcloud container hub memberships describe eks | grep name
    

    出力:

    name: projects/my-project/locations/global/memberships/eks
    

  3. aggregator.yamlvolumeClaimTemplates/spec で、クラスタの PersistentVolumeClaim storageClassName を指定します。EKS と AKS にはデフォルト値があり、必要に応じてコメントを解除できます。EKS を使用している場合は、gp2 です。AKS の場合、これは default です。

    AWS または Azure でカスタム Kubernetes Storage クラスを構成している場合や、デフォルト以外のストレージ クラスを使用する場合、あるいは適合する別のクラスタタイプを使用する場合は、所有する storageClassName。適切な storageClassName は、StorageClass を使用してクラスタのプロビジョニングされた PersistentVolume(PV)のタイプに基づきます。Kubernetes のドキュメントで、他の主要な Kubernetes プロバイダのストレージ クラスとデフォルトのストレージ クラスについて詳細を確認できます。

    # storageClassName: standard #Google Cloud
    # storageClassName: gp2 #AWS EKS
    # storageClassName: default #Azure AKS
    
  4. ログ アグリゲータとフォワーダをクラスタにデプロイします。

    kubectl apply -f aggregator.yaml
    kubectl apply -f forwarder.yaml
    
  5. Pod が起動したことを確認します。Kubernetes ワーカーノードごとに 2 つのアグリゲータ ポッドと 1 つのフォワーダ ポッドが表示されます。たとえば、4 ノードクラスタでは、フォワーダポッドが 4 つ表示されるはずです。

    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
    

  6. アグリゲータ ログを取得し、ログが 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.
    

  7. クラスタにテスト アプリケーションをデプロイします。これは、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
    
  8. Cloud Logging ダッシュボードでクラスタのログを表示できることを確認するには、Google Cloud Console の [ログ エクスプローラ] に移動します。

    [ログ エクスプローラ] に移動

  9. ログビューアで、以下のサンプルクエリを [クエリビルダー] フィールドにコピーします。${your-cluster-name} はクラスタ名に置き換えます。[実行] をクリックします。最近のクラスタログが [クエリ結果] に表示されます。

    resource.type="k8s_container" resource.labels.cluster_name="${your-cluster-name}"
    

接続されたクラスタのログ

モニタリング エージェントのインストール

  1. logging/ ディレクトリから monitoring/ ディレクトリに移動します。

    cd ../monitoring
    
  2. 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]"
    
  3. prometheus.yaml の volumeClaimTemplates で、ロギング エージェントのインストールの説明に従って、クラウド プロバイダに一致する storageClassName のコメントを解除します。

    # storageClassName: standard #Google Cloud
    # storageClassName: gp2 #AWS EKS
    # storageClassName: default #Azure AKS
    
  4. エクスポータ サイドカーを使用して構成された stackdriver-prometheus StatefulSet をクラスタにデプロイします。

    kubectl apply -f server-configmap.yaml
    kubectl apply -f sidecar-configmap.yaml
    kubectl apply -f prometheus.yaml
    
  5. stackdriver-prometheus Pod が動作していることを確認します。

    watch kubectl get pods -n kube-system | grep stackdriver-prometheus
    
    出力:
    stackdriver-prometheus-k8s-0         2/2     Running   0          5h24m
    
  6. 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"
    
  7. クラスタの指標が Cloud Monitoring に正常にエクスポートされていることを確認します。Google Cloud Console で Metrics Explorer に移動します。

    Metrics Explorer に移動

  8. [クエリエディタ] をクリックし、次のコマンドで ${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
    

接続されたクラスタのモニタリング

クリーンアップ

  1. このガイドで作成したリソースをすべて削除するには:

    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
    

次のステップ

Cloud Logging について学習する

Cloud Monitoring について学習する