
こんにちは。よっしーです(^^)
今日は、Kubernetes Engine での Cloud Logging について解説しています。
背景
下記のサイトを参考に実施したときの内容を自身のGCPプロジェクトに適用したときの内容を備忘として残しました。
実施内容
下記の手順で実施しました。
mkdir `作業ディレクトリ`
cd `作業ディレクトリ`
# terraformのバージョン指定
asdf local terraform 1.9.2
# terraformのバージョン確認
terraform --version
asdf local gcloud 482.0.0
asdf local python 3.12.4
# gcloudのバージョン確認
gcloud --version
# 必要なプラグインのインストール
gcloud components install kubectl
gcloud components install gke-gcloud-auth-plugin
# 操作アカウントの設定
gcloud config set account `アカウント`
# 操作アカウントの確認
gcloud config get-value account
# プロジェクト新規作成
gcloud projects create `プロジェクト`
# プロジェクトの情報確認
gcloud projects describe `プロジェクト`
# プロジェクトの設定
gcloud config set project `プロジェクト`
# 請求先アカウントの確認
gcloud beta billing accounts list
# 請求先アカウントのリンク
gcloud beta billing projects link `プロジェクト` --billing-account=`請求先アカウント`
# サンプルリソースの準備
git clone https://github.com/GoogleCloudPlatform/gke-logging-sinks-demo
cd gke-logging-sinks-demo
gcloud config set compute/region asia-northeast
gcloud config set compute/zone asia-northeast1-a
各ファイルを修正します。修正内容は下記になります。
terraform/main.tf
% git diff terraform/main.tf
diff --git a/terraform/main.tf b/terraform/main.tf
index 3eeaac9..f3e567c 100644
--- a/terraform/main.tf
+++ b/terraform/main.tf
@@ -44,6 +44,7 @@ resource "random_id" "server" {
 // terraform destroy
 resource "google_storage_bucket" "gke-log-bucket" {
   name          = "stackdriver-gke-logging-bucket-${random_id.server.hex}"
+  location      = "ASIA-NORTHEAST1"
   storage_class = "NEARLINE"
   force_destroy = true
 }
@@ -67,10 +68,11 @@ resource "google_bigquery_dataset" "gke-bigquery-dataset" {
 // Create the GKE Cluster
 // https://www.terraform.io/docs/providers/google/d/google_container_cluster.html
 resource "google_container_cluster" "primary" {
-  name               = "stackdriver-logging"
-  location           = var.zone
-  initial_node_count = 2
-  min_master_version = data.google_container_engine_versions.on-prem.latest_master_version
+  name                = "stackdriver-logging"
+  location            = var.zone
+  initial_node_count  = 2
+  min_master_version  = data.google_container_engine_versions.on-prem.latest_master_version
+  deletion_protection = false
 
   node_config {
     oauth_scopes = [
@@ -107,7 +109,7 @@ resource "google_container_cluster" "primary" {
 resource "google_logging_project_sink" "storage-sink" {
   name        = "gke-storage-sink"
   destination = "storage.googleapis.com/${google_storage_bucket.gke-log-bucket.name}"
-  filter      = "resource.type = container"
+  filter      = "resource.type = k8s_container"
 
   unique_writer_identity = true
 }
@@ -116,14 +118,15 @@ resource "google_logging_project_sink" "storage-sink" {
 resource "google_logging_project_sink" "bigquery-sink" {
   name        = "gke-bigquery-sink"
   destination = "bigquery.googleapis.com/projects/${var.project}/datasets/${google_bigquery_dataset.gke-bigquery-dataset.dataset_id}"
-  filter      = "resource.type = container"
+  filter      = "resource.type = k8s_container"
 
   unique_writer_identity = true
 }
 
 // Grant the role of Storage Object Creator
 resource "google_project_iam_binding" "log-writer-storage" {
-  role = "roles/storage.objectCreator"
+  project = var.project
+  role    = "roles/storage.objectCreator"
 
   members = [
     google_logging_project_sink.storage-sink.writer_identity,
@@ -132,7 +135,8 @@ resource "google_project_iam_binding" "log-writer-storage" {
 
 // Grant the role of BigQuery Data Editor
 resource "google_project_iam_binding" "log-writer-bigquery" {
-  role = "roles/bigquery.dataEditor"
+  project = var.project
+  role    = "roles/bigquery.dataEditor"
 
   members = [
     google_logging_project_sink.bigquery-sink.writer_identity,
terraform/provider.tf
% git diff terraform/provider.tf
diff --git a/terraform/provider.tf b/terraform/provider.tf
index 7cdd1c3..f715446 100644
--- a/terraform/provider.tf
+++ b/terraform/provider.tf
@@ -17,6 +17,5 @@ limitations under the License.
 // Configles the Google Cloud Provider with default settings
 provider "google" {
   project = var.project
-  version = "~> 2.11.0"
 }上記のファイルを作成後、下記のコマンドを実行します。
make create下記のような出力になれば成功です。
Apply complete! Resources: 1 added, 0 changed, 1 destroyed.解説
terraform/main.tf
はい、このコードを解説いたします。こちらのコードはTerraformを使用してGoogle Cloud Platform (GCP) 上にKubernetesクラスタ (GKE) を設定し、そのログをStackdriver(現在はCloud Operationsと呼ばれています)を通じて収集・エクスポートする環境を構築するものです。主要な部分を順に説明していきます。
- Google Container Engine のバージョン情報の取得:
   data "google_container_engine_versions" "on-prem" {
     location = var.zone
     project  = var.project
   }これは利用可能な最新のGKEバージョンを取得します。
- ログ保存用のCloud Storageバケットの作成:
   resource "google_storage_bucket" "gke-log-bucket" {
     name          = "stackdriver-gke-logging-bucket-${random_id.server.hex}"
     location      = "ASIA-NORTHEAST1"
     storage_class = "NEARLINE"
     force_destroy = true
   }ログを長期保存するためのバケットを作成します。
- ログ保存用のBigQueryデータセットの作成:
   resource "google_bigquery_dataset" "gke-bigquery-dataset" {
     dataset_id                  = "gke_logs_dataset"
     location                    = "US"
     default_table_expiration_ms = 3600000
   }ログを分析するためのBigQueryデータセットを作成します。
- GKEクラスタの作成:
   resource "google_container_cluster" "primary" {
     name                = "stackdriver-logging"
     location            = var.zone
     initial_node_count  = 2
     min_master_version  = data.google_container_engine_versions.on-prem.latest_master_version
     deletion_protection = false
     // ... 他の設定 ...
   }2つのノードを持つGKEクラスタを作成します。
- サンプルサービスのデプロイ:
 クラスタ作成後、local-execプロビジョナーを使用してサンプルのHello Worldアプリケーションをデプロイします。
- Stackdriver(Cloud Operations)ログエクスポートの設定:
   resource "google_logging_project_sink" "storage-sink" {
     name        = "gke-storage-sink"
     destination = "storage.googleapis.com/${google_storage_bucket.gke-log-bucket.name}"
     filter      = "resource.type = k8s_container"
     // ...
   }
   resource "google_logging_project_sink" "bigquery-sink" {
     name        = "gke-bigquery-sink"
     destination = "bigquery.googleapis.com/projects/${var.project}/datasets/${google_bigquery_dataset.gke-bigquery-dataset.dataset_id}"
     filter      = "resource.type = k8s_container"
     // ...
   }これらのリソースは、GKEコンテナのログをCloud StorageとBigQueryにエクスポートするための設定を行います。
- 必要な IAM 権限の付与:
   resource "google_project_iam_binding" "log-writer-storage" {
     project = var.project
     role    = "roles/storage.objectCreator"
     members = [
       google_logging_project_sink.storage-sink.writer_identity,
     ]
   }
   resource "google_project_iam_binding" "log-writer-bigquery" {
     project = var.project
     role    = "roles/bigquery.dataEditor"
     members = [
       google_logging_project_sink.bigquery-sink.writer_identity,
     ]
   }これらのリソースは、ログをCloud StorageとBigQueryに書き込むために必要な権限を付与します。
このコードを実行すると、GKEクラスタが作成され、そのクラスタ上にサンプルアプリケーションがデプロイされ、さらにクラスタのログがCloud StorageとBigQueryに自動的にエクスポートされる環境が構築されます。
この設定は、Kubernetesクラスタの運用とモニタリングを効率的に行うための基盤を提供します。ログの長期保存や分析が可能になり、トラブルシューティングやパフォーマンス分析に役立ちます。
おわりに
今日は、Kubernetes Engine での Cloud Loggingについて解説しました。

何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
 
  
  
  
  


コメント