このチュートリアルでは、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 の課金対象となる以下のコンポーネントを使用します。
- 3 ノード Google Kubernetes Engine クラスタ。
料金計算ツールの見積もりでは、この環境の費用は 8 時間あたり約 1.14 ドルです。
始める前に
- Google Cloud アカウントにログインします。Google Cloud を初めて使用する場合は、アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
-
Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。
-
Google Kubernetes Engine, Compute Engine API を有効にします。
-
Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。
-
Google Kubernetes Engine, Compute Engine API を有効にします。
共通変数の初期化
インフラストラクチャの要素がデプロイされる場所を制御する変数をいくつか定義する必要があります。
テキスト エディタを使用して次のスクリプトを編集し、
[YOUR_PROJECT_ID]
を実際のプロジェクト ID に置き換えます。このスクリプトは、リージョンをus-east-1
に設定します。スクリプトを変更した場合は、ゾーンの値が指定したリージョンを参照していることを確認してください。export region=us-east1 export zone=${region}-b export project_id=[YOUR_PROJECT_ID]
Cloud Shell に移動します。
スクリプトを Cloud Shell ウィンドウにコピーして実行します。
次のコマンドを実行して、以降の各コマンドでこれらの値を指定する必要がないように、デフォルトのゾーンとプロジェクト ID を設定します。
gcloud config set compute/zone ${zone} gcloud config set project ${project_id}
GKE クラスタの作成
Cloud Shell で、サンプル リポジトリのクローンを作成します。
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-customize-fluentd
サンプル リポジトリには、Fluentd DaemonSet の Kubernetes マニフェストと、このチュートリアルの後半でデプロイするテストロギング プログラムが含まれています。
作業ディレクトリをクローニングしたリポジトリに変更します。
cd kubernetes-engine-customize-fluentd
システムのロギングとモニタリングのみを有効にして 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
サブディレクトリのソースコードからビルドされます。
Cloud Shell で、
test-logger
コンテナ イメージをビルドします。docker build -t test-logger test-logger
レジストリに push する前に、コンテナにタグを付けます。
docker tag test-logger gcr.io/${project_id}/test-logger
コンテナ イメージを push します
docker push gcr.io/${project_id}/test-logger
Deployment ファイルを更新します。
envsubst < kubernetes/test-logger.yaml > kubernetes/test-logger-deploy.yaml
test-logger
アプリケーションを GKE クラスタにデプロイします。kubectl apply -f kubernetes/test-logger-deploy.yaml
test-logger
Pod のステータスを表示します。kubectl get pods
3 つの
test-logger
Pod すべてが実行されている状態で、次のように出力されるまでこのコマンドを繰り返します。
Fluentd DaemonSet をクラスタにデプロイする
次に、Fluentd DaemonSet を構成してデプロイします。
Cloud Shell で Fluentd 構成をデプロイします。
kubectl apply -f kubernetes/fluentd-configmap.yaml
Fluentd デーモンセットをデプロイします。
kubectl apply -f kubernetes/fluentd-daemonset.yaml
Fluentd Pod が起動していることを確認します。
kubectl get pods --namespace=kube-system
Pod が走行している場合は、次のような出力が表示されます。
Logging にログが表示されていることを確認します。コンソールで、左側の [ロギング] > [ログ エクスプローラ] の順に選択し、[リソース] リスト内のリソースタイプとして [Kubernetes コンテナ] を選択します。
[クエリを実行] をクリックします。
ログ フィールド エクスプローラで、CONTAINER_NAME に test-logger を選択します。
ログファイルの情報をフィルタリングする
次のステップでは、Fluentd でログに記録しない特定のデータをフィルタリングするように指定します。このチュートリアルでは、社会保障番号、クレジット カード番号、メールアドレスを除外します。この更新を行うには、これらのフィルタを含む別の ConfigMap を使用するようデーモンセットを変更します。Kubernetes のローリング更新機能を使用し、旧バージョンの ConfigMap を保存します。
エディタで
kubernetes/fluentd-configmap.yaml
ファイルを開きます。### sample log scrubbing filters
と### end sample log scrubbing filters
の間の行をコメント解除し、除外します。metadata.name
フィールドを編集して、ConfigMap の名前をfluentd-gcp-config
からfluentd-gcp-config-filtered
に変更します。ファイルを保存して閉じます。
新しい構成を使用するよう Fluentd DaemonSet を更新する
fluentd-gcp-config
の代わりに ConfigMap fluentd-gcp-config-filtered
をマウントするように kubernetes/fluentd-daemonset.yaml
を変更します。
エディタで
kubernetes/fluentd-daemonset.yaml
ファイルを開きます。configMap.name
フィールドを編集して、ConfigMap の名前をfluentd-gcp-config
からfluentd-gcp-config-filtered
に変更します。新しいバージョンの ConfigMap をクラスタにデプロイします。
kubectl apply -f kubernetes/fluentd-configmap.yaml
新しいバージョンのデーモンセットをロールアウトします。
kubectl apply -f kubernetes/fluentd-daemonset.yaml
更新をロールアウトし、完了するまで待ちます。
kubectl rollout status ds/fluentd-gcp --namespace=kube-system
ロールアウトが完了したら、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 で作成したリソースをクリーンアップして今後料金が発生しないようにします。
プロジェクトの削除
課金をなくす最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。
プロジェクトを削除するには:
- Google Cloud コンソールで、[リソースの管理] ページに移動します。
- プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
- ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。
GKE クラスタの削除
プロジェクト全体を削除したくない場合は、次のコマンドを実行して GKE クラスタを削除します。
gcloud container clusters delete gke-with-custom-fluentd --zone us-east1-b
次のステップ
- Fluentd のドキュメントで詳細を確認する。
- Google Kubernetes Engine のドキュメントで詳細を確認する。
- Google Cloud に関するリファレンス アーキテクチャ、図、ベスト プラクティスを確認する。Cloud Architecture Center をご覧ください。