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

このチュートリアルでは、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 のロギングをカスタマイズする

料金

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

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

始める前に

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

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

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

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

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

  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 クラスタの作成

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

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

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

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

    gcloud container clusters create gke-with-custom-fluentd \
       --zone us-east1-b \
       --no-enable-stackdriver-kubernetes \
       --tags=gke-cluster-with-customized-fluentd \
       --scopes=logging-write
    

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

デフォルトでは、デプロイするサンプル アプリケーションは、ランダムなログ ステートメントを発信し続けます。アプリケーションで使用する 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 つ の Pod を示すコマンド出力

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. Logging にログが表示されていることを確認します。コンソールで、左側の [Logging] > [ログビューア] の順に選択し、[Resource] リスト内のリソースタイプとして [Kubernetes コンテナ] を選択します。

    フィルタリングされる前のデータを示す 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-v3.2.0 --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>

クリーンアップ

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

プロジェクトを削除する

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

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

  1. Cloud Console で [リソースの管理] ページに移動します。

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

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

GKE クラスタの削除

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

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

次のステップ