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. このガイドを使用して作成した 1 つの Anthos 接続クラスタ。次のコマンドを実行して、クラスタが登録済みであることを確認します。

    gcloud container fleet 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 fleet 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 ストレージ クラスを構成している場合、デフォルト以外のストレージ クラスを使用する場合、または別の標準準拠のクラスタタイプを使用している場合は、独自の 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 つのアグリゲータ 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
    

  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 コンソールの 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 について学習する