Google Kubernetes Engine の Stackdriver ログを Fluentd でカスタマイズする

このチュートリアルでは、Google Kubernetes Engine クラスタの Fluentd ロギングをカスタマイズする方法について説明します。Fluentd デーモンを構成できない Google Kubernetes Engine(GKE)クラスタを作成する場合に、クラウド ロギング オプションを選択するのではなく、Stackdriver にログを送信する独自の Fluentd デーモンセットをホストする方法についても説明します。

目標

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

料金

このチュートリアルでは、以下を含む 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 クラスタの作成

特に明記のない限り、このチュートリアルのすべてのコマンドはパソコンまたは 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 beta container clusters create gke-with-custom-fluentd \
       --zone us-east1-b \
       --no-enable-cloud-logging \
       --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 つのポッドを示すコマンド出力

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] > [ロギング] > [ログ] の順にクリックし、リストから [Kubernetes コンテナ] を選択します。

    フィルタリングされる前のデータを示す 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 デーモンセットを更新する

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 つのポッドを示すコマンド出力

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

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

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

GKE ノードで発生するイベントを Stackdriver に表示するには、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. GCP Console で [プロジェクト] ページに移動します。

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

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

GKE クラスタの削除

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

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

次のステップ

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

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