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

Last reviewed 2022-10-03 UTC

このチュートリアルでは、Google Kubernetes Engine クラスタの Fluentd ロギングをカスタマイズする方法について説明します。Fluentd デーモンの設定を許可しない Google Kubernetes Engine(GKE)クラスタを作成する際に、Cloud Logging オプションを選択せずに独自の構成可能な Fluentd DaemonSet をホストして、Cloud Logging にログを送信する方法を説明します。

目標

  • 独自の Fluentd DaemonSet を Google Kubernetes Engine クラスタにデプロイし、データを Cloud Logging に記録するように設定します。ここでは、すでに Kubernetes の知識があることを前提とします。
  • GKE のロギングをカスタマイズして、Cloud Logging のログから機密データを削除します。
  • ノードレベルのイベントを Cloud Logging のログに追加するように GKE のロギングをカスタマイズします。

費用

このチュートリアルでは、Google Cloud の課金対象となる以下のコンポーネントを使用します。

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

始める前に

  1. Google Cloud アカウントにログインします。Google Cloud を初めて使用する場合は、アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
  2. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

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

  4. Google Kubernetes Engine, Compute Engine API を有効にします。

    API を有効にする

  5. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  6. Google Cloud プロジェクトで課金が有効になっていることを確認します

  7. Google Kubernetes Engine, Compute Engine API を有効にします。

    API を有効にする

共通変数の初期化

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

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

    export region=us-east1
    export zone=${region}-b
    export 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 クラスタの作成

  1. Cloud Shell で、サンプル リポジトリのクローンを作成します。

    git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-customize-fluentd
    

    サンプル リポジトリには、Fluentd DaemonSet の Kubernetes マニフェストと、このチュートリアルの後半でデプロイするテストロギング プログラムが含まれています。

  2. 作業ディレクトリをクローニングしたリポジトリに変更します。

    cd kubernetes-engine-customize-fluentd
    
  3. システムのロギングとモニタリングのみを有効にして GKE クラスタを作成します。

    gcloud container clusters create gke-with-custom-fluentd \
       --zone us-east1-b \
       --logging=SYSTEM \
       --tags=gke-cluster-with-customized-fluentd \
       --scopes=logging-write,storage-rw
    

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

デフォルトでは、デプロイするサンプル アプリケーションは、ランダムなログ ステートメントを発信し続けます。Docker コンテナは、test-logger サブディレクトリのソースコードからビルドされます。

  1. Cloud Shell で、test-logger コンテナ イメージをビルドします。

    docker build -t test-logger test-logger
    
  2. レジストリに push する前に、コンテナにタグを付けます。

    docker tag test-logger gcr.io/${project_id}/test-logger
    
  3. コンテナ イメージを push します

    docker push gcr.io/${project_id}/test-logger
    
  4. Deployment ファイルを更新します。

    envsubst < kubernetes/test-logger.yaml > kubernetes/test-logger-deploy.yaml
    
  5. test-logger アプリケーションを GKE クラスタにデプロイします。

    kubectl apply -f kubernetes/test-logger-deploy.yaml
    
  6. test-logger Pod のステータスを表示します。

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

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

Fluentd DaemonSet をクラスタにデプロイする

次に、Fluentd DaemonSet を構成してデプロイします。

  1. Cloud Shell で Fluentd 構成をデプロイします。

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

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

    kubectl get pods --namespace=kube-system
    

    Pod が走行している場合は、次のような出力が表示されます。

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

  4. Logging にログが表示されていることを確認します。コンソールで、左側の [ロギング] > [ログ エクスプローラ] の順に選択し、[リソース] リスト内のリソースタイプとして [Kubernetes コンテナ] を選択します。

  5. [クエリを実行] をクリックします。

  6. ログ フィールド エクスプローラで、CONTAINER_NAMEtest-logger を選択します。

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

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

次のステップでは、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 DaemonSet を更新する

fluentd-gcp-config の代わりに ConfigMap fluentd-gcp-config-filtered をマウントするように kubernetes/fluentd-daemonset.yaml を変更します。

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

  2. configMap.name フィールドを編集して、ConfigMap の名前を fluentd-gcp-config から fluentd-gcp-config-filtered に変更します。

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

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

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

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

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

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

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

ノードレベルのイベントのロギング

GKE ノードで発生するイベントを Logging にも表示するには、次の行を ConfigMap に追加し、最後のセクションで説明されている手順を行います。

<source>
  @type systemd
  filters [{ "SYSLOG_IDENTIFIER": "sshd" }]
  pos_file /var/log/journal/gcp-journald-ssh.pos
  read_from_head true
  tag sshd
</source>

<source>
  @type systemd
  filters [{ "SYSLOG_IDENTIFIER": "sudo" }]
  pos_file /var/log/journal/gcp-journald-sudo.pos
  read_from_head true
  tag sudo
</source>

クリーンアップ

チュートリアルが終了したら、Google Cloud で作成したリソースをクリーンアップして今後料金が発生しないようにします。

プロジェクトの削除

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

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

  1. Google Cloud コンソールで、[リソースの管理] ページに移動します。

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

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

GKE クラスタの削除

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

gcloud container clusters delete gke-with-custom-fluentd --zone us-east1-b

次のステップ

  • Fluentd のドキュメントで詳細を確認する。
  • Google Kubernetes Engine のドキュメントで詳細を確認する。
  • Google Cloud に関するリファレンス アーキテクチャ、図、ベスト プラクティスを確認する。Cloud Architecture Center をご覧ください。