接続クラスタのロギングとモニタリング

このページでは、接続クラスタから 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 に転送します。

前提条件

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

  2. このガイドを使用して作成した 1 つの接続クラスタ。クラスタが登録済みかどうかは、次のコマンドで確認します。

    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. テストアプリケーションをクラスタにデプロイします。これは、負荷生成ツールを含む基本的な 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 コンソールの [ログ エクスプローラ] に移動します。

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

  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/spec で、ロギング エージェントのインストールの説明に従って、クラウド プロバイダに一致する 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 について学習する