Fluentd を使用した Kubernetes Engine の Stackdriver ログのカスタマイズ

このチュートリアルでは、Google Kubernetes Engine クラスタの Fluentd ロギングをカスタマイズする方法について説明します。Fluentd デーモンの構成が許可されない Kubernetes Engine クラスタの作成時に Cloud Logging オプションを選択する代わりに、Stackdriver にログを送る独自の構成可能な Fluentd デーモンセットをホストする方法について学習します。

目標

  • Google Stackdriver にログデータを記録するよう構成された、独自の Fluentd デーモンセットを Kubernetes Engine クラスタにデプロイします。ここでは、すでに Kubernetes の知識があることを前提とします。
  • Stackdriver ログから機密データを取り除くために、Kubernetes GKE のロギングをカスタマイズします。

料金

このチュートリアルでは、以下を含む Cloud Platform の有料コンポーネントを使用します。

料金計算ツールの見積もりでは、この環境の費用は 8 時間あたり約 1.14 ドルです。

始める前に

  1. Google アカウントにログインします。

    Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。

  2. GCP プロジェクトを選択または作成します。

    [リソースの管理] ページに移動

  3. プロジェクトに対して課金が有効になっていることを確認します。

    課金を有効にする方法について

  4. 必要な Google Kubernetes Engine、Compute Engine APIを有効にします。

    APIを有効にする

共通変数の初期化

インフラストラクチャの要素がデプロイされる場所を制御する変数をいくつか定義する必要があります。

  1. テキスト エディタを使用して次のスクリプトを編集し、[YOUR_PROJECT_ID] を実際のプロジェクト ID に置き換えます。このスクリプトは、リージョンを us-east-1 に設定します。スクリプトを変更した場合は、ゾーンの値が指定したリージョンを参照していることを確認してください。

    region=us-east1
    zone=${region}-b
    project_id=[YOUR_PROJECT_ID]
    
  2. Cloud Shell に移動します。

    Cloud Shell を開く

  3. スクリプトを Cloud Shell ウィンドウにコピーして実行します。

  4. 次のコマンドを実行して、以降の各コマンドでこれらの値を指定する必要がないように、デフォルトのゾーンとプロジェクト ID を設定します。

    gcloud config set compute/zone ${zone}
    gcloud config set project ${project_id}
    

クラスタのサービス アカウントの作成

次のステップでは、ロギング用のサービス アカウントと、GKE クラスタの作成に使用するサービス アカウントのキーを作成します。このサービス アカウントは、以下でデプロイするデーモンセットで実行される Fluentd エージェントのアプリケーションのデフォルト認証情報になります。

  1. サービス アカウントを作成します。

    gcloud iam service-accounts create cluster-service-account \
        --display-name "cluster-service-account"
    
  2. logging.logWriter の役割をサービス アカウントに追加します。

    gcloud projects add-iam-policy-binding ${project_id} \
        --member serviceAccount:cluster-service-account@${project_id}.iam.gserviceaccount.com \
        --role roles/logging.logWriter
    
  3. monitoring.metricWriter の役割をサービス アカウントに追加します。

    gcloud projects add-iam-policy-binding ${project_id} \
       --member serviceAccount:cluster-service-account@${project_id}.iam.gserviceaccount.com \
       --role roles/monitoring.metricWriter
    
  4. container.admin の役割をサービス アカウントに追加します。

    gcloud projects add-iam-policy-binding ${project_id} \
       --member serviceAccount:cluster-service-account@${project_id}.iam.gserviceaccount.com \
       --role roles/container.admin
    

GKE クラスタの作成

特に明記のない限り、このチュートリアルのすべてのコマンドはパソコンまたは Cloud Shell のコマンドラインで入力します。

  1. サンプル リポジトリのクローンを作成します。サンプル リポジトリには、Fluentd デーモンセット用の Kubernetes マニフェストと、デプロイするテストロギング プログラムが存在します。

    git clone https://github.com/GoogleCloudPlatform/container-engine-customize-fluentd
    
  2. 作業ディレクトリをクローニングしたリポジトリに変更します。

    cd container-engine-customize-fluentd
    
  3. Cloud Logging はオフにしたまま、GKE クラスタを作成します。

    gcloud beta container clusters create gke-with-custom-fluentd \
        --service-account=cluster-service-account@${project_id}.iam.gserviceaccount.com \
        --zone us-east1-b \
        --no-enable-cloud-logging \
        --tags=gke-cluster-with-customized-fluentd
    

テスト ロガー アプリケーションのデプロイ

デフォルトでは、デプロイするサンプル アプリケーションは、ランダムなログ ステートメントを発信し続けます。アプリケーションで使用する Docker コンテナは gcr.io/cloud-solutions-images/test-logger にあり、そのソースコードは test-logger サブディレクトリに含まれています。

  1. test-logger アプリケーションを GKE クラスタにデプロイします。

    kubectl apply -f kubernetes/test-logger.yaml
    
  2. test-logger ポッドのステータスを表示します。

    kubectl get pods
    
  3. 3 つの test-logger ポッドすべてが実行されている状態で、次のように出力されるまでこのコマンドを繰り返します。

    実行中の 3 つのポッドを示すコマンド出力

Fluentd デーモンセットをクラスタにデプロイする

次に、Fluentd デーモンセットを構成してデプロイします。

  1. Fluentd の構成をデプロイします。

    kubectl apply -f kubernetes/fluentd-configmap.yaml
    
  2. Fluentd デーモンセットをデプロイします。

    kubectl apply -f kubernetes/fluentd-daemonset.yaml
    
  3. Fluentd のポッドが起動していることを確認します。

    kubectl get pods --namespace=kube-system
    

    ポッドが実行されている場合は、次のような出力が表示されます。

    実行中の 3 つのポッドを示すコマンド出力

  4. Stackdriver にログが表示されていることを確認します。コンソールの左側のメニューで [Stackdriver] > [Logging] をクリックし、リスト内の [GKE cluster] を選択します。

    フィルタリングされる前のデータを示す Stackdriver のリスト

ログファイルの情報をフィルタリングする

次のステップでは、Fluentd でログに記録しない特定のデータをフィルタリングするように指定します。このチュートリアルでは、社会保障番号、クレジット カード番号、メールアドレスを除外します。この更新を行うには、これらのフィルタを含む別の ConfigMap を使用するようデーモンセットを変更します。Kubernetes のローリング更新機能を使用し、旧バージョンの ConfigMap を保存します。

  1. エディタで kubernetes/fluentd-configmap.yaml ファイルを開きます。

  2. ### sample log scrubbing filters### end sample log scrubbing filters の間の行をコメント解除し、除外します。

    ############################################################################################################
    #  ### sample log scrubbing filters
    #  #replace social security numbers
    # <filter reform.**>
    #   @type record_transformer
    #   enable_ruby true
    #   <record>
    #     log ${record["log"].gsub(/[0-9]{3}-*[0-9]{2}-*[0-9]{4}/,"xxx-xx-xxxx")}
    #   </record>
    # </filter>
    # # replace credit card numbers that appear in the logs
    # <filter reform.**>
    #   @type record_transformer
    #   enable_ruby true
    #   <record>
    #      log ${record["log"].gsub(/[0-9]{4} *[0-9]{4} *[0-9]{4} *[0-9]{4}/,"xxxx xxxx xxxx xxxx")}
    #   </record>
    # </filter>
    # # replace email addresses that appear in the logs
    # <filter reform.**>
    #   @type record_transformer
    #   enable_ruby true
    #   <record>
    #     log ${record["log"].gsub(/[\w+\-]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+/i,"user@email.tld")}
    #   </record>
    # </filter>
    # ### end sample log scrubbing filters
    #############################################################################################################
  3. metadata.name を編集して、ConfigMap の名前を fluentd-gcp-config から fluentd-gcp-config-filtered に変更します。

    name: fluentd-gcp-config
    namespace: kube-system
    labels:
      k8s-app: fluentd-gcp-custom
  4. ファイルを保存して閉じます。

新しい構成を使用するよう Fluentd デーモンセットを更新する

ファイル kubernetes/fluentd-daemonset-filtered.yaml は、fluentd-gcp-config の代わりに ConfigMap fluentd-gcp-config-filtered をマウントします。

- configMap:
    defaultMode: 420
    name: fluentd-gcp-config-filtered
  1. 新しいバージョンの ConfigMap をクラスタにデプロイします。

    kubectl apply -f kubernetes/fluentd-configmap.yaml
    
  2. 新しいバージョンのデーモンセットをロールアウトします。

    kubectl apply -f kubernetes/fluentd-daemonset-filtered.yaml
  3. 更新をロールアウトし、完了するまで待ちます。

    kubectl rollout status ds/fluentd-gcp-v2.0 --namespace=kube-system
    

    「待機中」メッセージが表示されたのち成功した 3 つのポッドを示すコマンド出力

  4. ロールアウトが完了したら、Stackdriver のログを更新して社会保障番号、クレジット カード番号、メールアドレスのデータが除外されていることを確認します。

    フィルタリングされた同じデータを示す Stackdriver のリスト

クリーンアップ

チュートリアルが終了したら、GCP で作成したリソースについて料金が発生しないようにクリーンアップすることができます。

プロジェクトの削除

課金を停止する最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。

プロジェクトを削除するには:

  1. GCP Console で [プロジェクト] ページに移動します。

    プロジェクト ページに移動

  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。

GKE クラスタの削除

プロジェクト全体を削除したくない場合は、次のコマンドを実行して GKE クラスタを削除します。

gcloud container clusters delete gke-with-custom-fluentd

サービス アカウントの削除

サービス アカウントだけを削除するには、次のコマンドを実行します。

gcloud projects remove-iam-policy-binding ${project_id} \
    --member serviceAccount:cluster-service-account@${project_id}.iam.gserviceaccount.com \
    --role roles/logging.logWriter

gcloud projects remove-iam-policy-binding ${project_id} \
    --member serviceAccount:cluster-service-account@${project_id}.iam.gserviceaccount.com \
    --role roles/monitoring.metricWriter

gcloud projects remove-iam-policy-binding ${project_id} \
    --member serviceAccount:cluster-service-account@${project_id}.iam.gserviceaccount.com \
    --role roles/container.admin

gcloud iam service-accounts delete \
    "cluster-service-account@${project_id}.iam.gserviceaccount.com"

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...