Google Kubernetes Engine (GKE) 上の CloudPrem
This product is not supported for your selected
Datadog site. (
).
CloudPrem は Preview 版です
CloudPrem Preview に参加すると、新しいセルフ ホスト型のログ管理機能を利用できます。
Request Access概要
このインストール ガイドでは、Datadog CloudPrem を Google Kubernetes Engine (GKE) にデプロイする手順を説明します。
GKE 上の CloudPrem では、次の Google Cloud サービスを使用します:
- Google Kubernetes Engine (GKE): CloudPrem の各コンポーネントを実行するためのコンテナ オーケストレーション基盤
- Cloud Storage (GCS): テレメトリー データとインデックスを保存するオブジェクト ストレージ
- Cloud SQL for PostgreSQL: メタデータ保存用のマネージド PostgreSQL データベース
- Workload Identity: GKE ワークロードと Google Cloud サービスの間で安全な認証を実現する仕組み
前提条件
開始する前に、次の項目を確認してください:
Google Cloud CLI がインストールされ、設定済みであること
kubectl がインストールされていること
Helm 3.x がインストールされていること
課金が有効な GCP Project があること
gcloud config set project YOUR_PROJECT_ID
必要な IAM 権限:
roles/container.admin (Kubernetes Engine Admin)roles/iam.serviceAccountAdmin (Service Account Admin)roles/compute.admin (Compute Admin)
API キーを作成または取得する
必要な API が有効になっていること:
gcloud services enable container.googleapis.com \
compute.googleapis.com \
sqladmin.googleapis.com \
storage.googleapis.com
インストール手順
ステップ 1: 環境変数を設定する
後続のコマンドを簡潔にし、コピー & ペースト時のミスを減らすため、次の環境変数を設定します。
export PROJECT_ID="your-gcp-project-id"
export REGION="us-central1"
export CLUSTER_NAME="cloudprem-cluster"
export DATADOG_SITE="datadoghq.com" # または datadoghq.eu, us3.datadoghq.com, us5.datadoghq.com
export BUCKET_NAME="${PROJECT_ID}-cloudprem"
ステップ 2: GKE クラスターを作成する
Workload Identity を有効にした GKE クラスターを作成します:
gcloud container clusters create ${CLUSTER_NAME} \
--region ${REGION} \
--num-nodes 1 \
--workload-pool=${PROJECT_ID}.svc.id.goog \
--machine-type n1-standard-4
Small (Dev/Test): ノード 3 台、n1-standard-4 (1 日あたり約 100 GB)
Medium (Production): ノード 5 台、n1-standard-8 (1 日あたり約 500 GB)
Large (Enterprise): ノード 7 台以上、n1-standard-16 (1 日あたり 1 TB 以上)
クラスターの認証情報を取得します:
gcloud container clusters get-credentials ${CLUSTER_NAME} --region ${REGION}
GKE 認証プラグインをインストールします:
gcloud components install gke-gcloud-auth-plugin
export USE_GKE_GCLOUD_AUTH_PLUGIN=True
クラスターにアクセスできることを確認します:
kubectl cluster-info
kubectl get nodes
ステップ 3: Cloud Storage バケットを作成する
CloudPrem のデータ保存用に GCS バケットを作成します:
export BUCKET_NAME="cloudprem-data-${PROJECT_ID}"
gcloud storage buckets create gs://${BUCKET_NAME} \
--project=${PROJECT_ID} \
--location=${REGION} \
--uniform-bucket-level-access
ステップ 4: Cloud SQL for PostgreSQL インスタンスを作成する
メタデータ保存用の Cloud SQL for PostgreSQL インスタンスを作成します:
# 安全なパスワードを生成する
export DB_PASSWORD=$(openssl rand -base64 32)
echo "Database password: ${DB_PASSWORD}"
# このパスワードは安全な場所に保存してください。後で必要になります
# Cloud SQL インスタンスを作成する
gcloud sql instances create cloudprem-postgres \
--database-version=POSTGRES_15 \
--region=${REGION} \
--root-password="${DB_PASSWORD}"
完了まで数分かかることがあります。インスタンスの準備が整ってから、次を実行します:
gcloud sql instances describe cloudprem-postgres \
--format="value(state)"
# 出力例: RUNNABLE
CloudPrem 用のデータベースを作成します:
gcloud sql databases create cloudprem \
--instance=cloudprem-postgres
接続情報を取得します:
export DB_CONNECTION_NAME=$(gcloud sql instances describe cloudprem-postgres \
--format="value(connectionName)")
export DB_PUBLIC_IP=$(gcloud sql instances describe cloudprem-postgres \
--format="value(ipAddresses[0].ipAddress)")
echo "Connection Name: ${DB_CONNECTION_NAME}"
echo "Public IP: ${DB_PUBLIC_IP}"
GKE ノードから Cloud SQL に接続できるように許可します:
# GKE ノードの外部 IP を取得する
export NODE_IPS=$(kubectl get nodes -o jsonpath='{.items[*].status.addresses[?(@.type=="ExternalIP")].address}' | tr ' ' ',')
# 取得した IP を許可する
gcloud sql instances patch cloudprem-postgres \
--authorized-networks=${NODE_IPS} \
--quiet
ステップ 5: IAM と Workload Identity を設定する
CloudPrem 用の GCP サービス アカウントを作成します:
export SERVICE_ACCOUNT_NAME="cloudprem-sa"
gcloud iam service-accounts create ${SERVICE_ACCOUNT_NAME} \
--display-name="CloudPrem Service Account" \
--project=${PROJECT_ID}
必要な IAM ロールを付与します:
# Cloud SQL Client ロール
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
--member="serviceAccount:${SERVICE_ACCOUNT_NAME}@${PROJECT_ID}.iam.gserviceaccount.com" \
--role="roles/cloudsql.client"
# GCS バケット用の Storage Object Admin ロール
gsutil iam ch \
serviceAccount:${SERVICE_ACCOUNT_NAME}@${PROJECT_ID}.iam.gserviceaccount.com:objectAdmin \
gs://${BUCKET_NAME}
Kubernetes の名前空間とサービス アカウントを作成します:
kubectl create namespace datadog-cloudprem
kubectl create serviceaccount cloudprem-ksa \
--namespace datadog-cloudprem
kubectl annotate serviceaccount cloudprem-ksa \
--namespace datadog-cloudprem \
iam.gke.io/gcp-service-account=${SERVICE_ACCOUNT_NAME}@${PROJECT_ID}.iam.gserviceaccount.com
GCP サービス アカウントを Kubernetes サービス アカウントにバインドします:
gcloud iam service-accounts add-iam-policy-binding \
${SERVICE_ACCOUNT_NAME}@${PROJECT_ID}.iam.gserviceaccount.com \
--role=roles/iam.workloadIdentityUser \
--member="serviceAccount:${PROJECT_ID}.svc.id.goog[datadog-cloudprem/cloudprem-ksa]"
ステップ 6: Kubernetes シークレットを作成する
Datadog API キー用のシークレットを作成します:
kubectl create secret generic datadog-secret \
--from-literal=api-key=${DD_API_KEY} \
--namespace=datadog-cloudprem
PostgreSQL 接続情報用のシークレットを作成します:
パスワードは URL エンコードする必要があります。例: / → %2F、+ → %2B、= → %3D。
# まずパスワードを URL エンコードします
# 例: パスワードが "abc/def+ghi=" の場合、"abc%2Fdef%2Bghi%3D" になります
kubectl create secret generic cloudprem-metastore-config \
--from-literal=QW_METASTORE_URI="postgresql://postgres:${DB_PASSWORD}@${DB_PUBLIC_IP}:5432/cloudprem" \
--namespace=datadog-cloudprem
ステップ 7: Helm を使って CloudPrem をインストールする
Datadog Helm リポジトリを追加します:
helm repo add datadog https://helm.datadoghq.com
helm repo update
values.yaml ファイルを作成します:
使用する Datadog サイト を に設定します。
# Datadog の設定
datadog:
# 接続先の Datadog サイトです。既定値は `datadoghq.com` です。
# site: datadoghq.com
# Datadog API キーを格納した既存の Secret 名です。シークレットのキー名は `api-key` である必要があります。
apiKeyExistingSecret: datadog-secret
# Workload Identity を使用するサービス アカウント
serviceAccount:
create: false
name: cloudprem-ksa
extraAnnotations:
iam.gke.io/gcp-service-account: cloudprem-sa@${YOUR_PROJECT_ID}.iam.gserviceaccount.com
# CloudPrem ノードの設定
config:
# インデックス データを保存するルート URI です。gs パスを指定してください。
# CloudPrem で作成されるすべてのインデックスは、この場所の下に保存されます。
default_index_root_uri: gs://${BUCKET_NAME}/indexes
# VPC 内からアクセスするための内部 Ingress の設定
# Helm チャートは、まだ GKE Ingress をサポートしていません。
#
# 追加のアノテーションを使って ALB の動作をカスタマイズできます。
ingress:
internal:
enabled: false
# Metastore の設定
# Metastore は、インデックス メタ データの保存と管理を担います。
# Kubernetes シークレットで PostgreSQL データベースの接続文字列を渡す必要があります。
# このシークレットには、次の形式の値を持つ `QW_METASTORE_URI` という名前のキーが必要です:
# postgresql://<username>:<password>@<host>:<port>/<database>
#
# Secret を参照するために extraEnvFrom を使い、Metastore の接続文字列を Pod にマウントします。
metastore:
extraEnvFrom:
- secretRef:
name: cloudprem-metastore-uri
# Indexer の設定
# Indexer は、さまざまなソース (例: Datadog Agent、ログ コレクター) から受け取ったデータを処理してインデックス化し、
# それを S3 に保存される "splits" と呼ばれる検索可能なファイルに変換します。
#
# Indexer は水平スケールに対応しています。より高いインデックス処理スループットが必要な場合は、`replicaCount` を増やしてください。リソースの要求量と上限は、実際のインデックス ワークロードに合わせて調整する必要があります。
#
# `podSize` パラメーターを使うと、vCPU、メモリ、コンポーネント固有の設定が自動的に決まります。既定値は、indexer Pod あたり最大 20 MB/s 程度の中規模なインデックス負荷に適しています。
# 利用可能なティアとその構成については、サイジング ガイドを参照してください。
indexer:
replicaCount: 2
podSize: xlarge
# Searcher の設定
# `podSize` パラメーターを使うと、vCPU、メモリ、コンポーネント固有の設定が自動的に決まります。
# クエリの複雑さ、同時実行数、データ アクセス パターンに応じてティアを選択してください。
searcher:
replicaCount: 2
podSize: xlarge
CloudPrem をインストールする:
helm install cloudprem datadog/cloudprem \
--namespace datadog-cloudprem \
--values values.yaml
ステップ 8: 内部 GCE Ingress を追加する
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: cloudprem-internal
namespace: datadog-cloudprem
annotations:
kubernetes.io/ingress.class: "gce-internal"
spec:
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: cloudprem-indexer
port:
number: 7280
kubectl apply -f ingress-values.yaml
ステップ 9: Datadog Agent をインストールする (推奨)
CloudPrem コンポーネントからメトリクスを収集し、Datadog に送信するために Datadog Agent をインストールします。
Datadog Agent 用に別の名前空間を作成します:
kubectl create namespace datadog
# API キーのシークレットを Agent 用の名前空間にコピーする
kubectl get secret datadog-secret -n datadog-cloudprem -o yaml | \
sed 's/namespace: datadog-cloudprem/namespace: datadog-agent/' | \
kubectl apply -f -
Datadog Operator をインストールします:
# GKE Autopilot 向け Datadog Agent の Helm values
apiVersion: datadoghq.com/v2alpha1
kind: DatadogAgent
metadata:
name: datadog
namespace: datadog
spec:
global:
clusterName: <CLUSTER_NAME>
site: datadoghq.com
credentials:
apiSecret:
secretName: datadog-secret
keyName: api-key
env:
- name: DD_LOGS_CONFIG_LOGS_DD_URL
value: http://<RELEASE_NAME>-indexer.<NAMESPACE_NAME>.svc.cluster.local:7280
- name: DD_LOGS_CONFIG_EXPECTED_TAGS_DURATION
value: "1000000h"
features:
logCollection:
enabled: true
containerCollectAll: true
dogstatsd:
port: 8125
useHostPort: false # Autopilot では false である必要があります
nonLocalTraffic: true
Datadog Agent をインストールします:
kubectl apply -f datadog-operator-values.yaml
Datadog Agent が稼働していることを確認します:
kubectl get pods -n datadog
CloudPrem が Datadog Agent の DogStatsD サービスにメトリクスを送信するように更新します。次の設定を values.yaml に追加してください:
# DogStatsD の設定 - メトリクスを Datadog Agent に送信する
dogstatsdServer:
host:
value: "datadog-agent.datadog.svc.cluster.local"
port: 8125
新しい設定を反映して CloudPrem をアップグレードします:
helm upgrade cloudprem datadog/cloudprem \
--namespace datadog-cloudprem \
--values values.yaml \
--timeout 10m
DogStatsD の設定を確認します:
kubectl get pod -n datadog-cloudprem -l app.kubernetes.io/component=metastore -o jsonpath='{.items[0].spec.containers[0].env[?(@.name=="CP_DOGSTATSD_SERVER_HOST")].value}'
# 出力例: datadog-agent.datadog.svc.cluster.local
ステップ 10: デプロイを確認する
Pod の状態を確認します:
kubectl get pods -n datadog-cloudprem
すべての Pod が Running 状態で、READY 列にも適切な値が表示されているはずです:
NAME READY STATUS RESTARTS AGE
cloudprem-control-plane-xxx 1/1 Running 0 5m
cloudprem-indexer-0 1/1 Running 0 5m
cloudprem-indexer-1 1/1 Running 0 5m
cloudprem-janitor-xxx 1/1 Running 0 5m
cloudprem-metastore-xxx 1/1 Running 0 5m
cloudprem-metastore-yyy 1/1 Running 0 5m
cloudprem-searcher-0 1/1 Running 0 5m
cloudprem-searcher-1 1/1 Running 0 5m
データベースへの接続が正常に確立されていることを metastore のログで確認します:
kubectl logs -n datadog-cloudprem -l app.kubernetes.io/component=metastore --tail=50
アンインストール
CloudPrem を完全に削除するには、次のコマンドを実行します:
# Helm リリースをアンインストールする
helm uninstall cloudprem --namespace datadog-cloudprem
# 名前空間を削除する
kubectl delete namespace datadog-cloudprem
# Cloud SQL インスタンスを削除する
gcloud sql instances delete cloudprem-postgres --quiet
# GCS バケットを削除する
gsutil -m rm -r gs://${BUCKET_NAME}
# GCP サービス アカウントを削除する
gcloud iam service-accounts delete \
${SERVICE_ACCOUNT_NAME}@${PROJECT_ID}.iam.gserviceaccount.com \
--quiet
# GKE クラスターを削除する
gcloud container clusters delete ${CLUSTER_NAME} \
--region ${REGION} \
--quiet
ベスト プラクティス
- Workload Identity を使用する: セキュリティを高めるため、サービス アカウント キーではなくこちらを利用します。
- Cloud SQL のバックアップを有効にする: 障害復旧に備えます。
- リージョナル GKE クラスターを使用する: 高可用性を確保しやすくなります。
- indexer ノードのディスク使用量を監視する: あわせてオート スケーリングも有効にします。
- Datadog でアラートを設定する: CloudPrem コンポーネントの健全性を継続的に監視します。
- 本番環境ではプライベート GKE クラスターを使用する: セキュリティをさらに強化できます。
- CloudPrem を定期的に更新する: バグ修正と新機能を取り込むため、最新バージョンを維持します。
- 本番変更の前にステージング環境でスケーリングを検証する: 予期しない性能問題を避けやすくなります。
- データベースのパスワードは Secret Manager に保存する: External Secrets Operator (ESO) または Secrets Store CSI Driver を使って、metastore Pod にパスワードを渡します。
次のステップ
- アプリケーションがテレメトリーを CloudPrem に送信するよう設定する
- Datadog で CloudPrem のパフォーマンスを監視するダッシュボードを用意する
- Datadog アカウントで CloudPrem のログとメトリクスを確認する
- データ量に応じてキャパシティ計画を立てる
参考資料