このページでは、GKE のロギング関連の問題を調査して解決する方法について説明します。
さらにサポートが必要な場合は、Cloud カスタマーケアにお問い合わせください。Cloud Logging にクラスタログがない
プロジェクトでロギングが有効になっていることを確認する
有効なサービスを一覧表示します。
gcloud services list --enabled --filter="NAME=logging.googleapis.com"
次の出力は、プロジェクトでロギングが有効になっていることを示しています。
NAME TITLE logging.googleapis.com Cloud Logging API
省略可: ログビューアのログを調べて、API を無効にしたユーザーと API を無効にした日時を確認します。
protoPayload.methodName="google.api.serviceusage.v1.ServiceUsage.DisableService" protoPayload.response.services="logging.googleapis.com"
ロギングが無効になっている場合は、ロギングを有効にします。
gcloud services enable logging.googleapis.com
クラスタでロギングが有効になっていることを確認する
クラスタを一覧表示します。
gcloud container clusters list \ --project=PROJECT_ID \ '--format=value(name,loggingConfig.componentConfig.enableComponents)' \ --sort-by=name | column -t
次のように置き換えます。
PROJECT_ID
: Google Cloud プロジェクト ID。
出力は次のようになります。
cluster-1 SYSTEM_COMPONENTS cluster-2 SYSTEM_COMPONENTS;WORKLOADS cluster-3
クラスタの値が空の場合、ロギングは無効です。たとえば、この出力の
cluster-3
ではロギングが無効になっています。NONE
に設定されている場合は、クラスタログを有効にします。gcloud container clusters update CLUSTER_NAME \ --logging=SYSTEM,WORKLOAD \ --location=COMPUTE_LOCATION
次のように置き換えます。
CLUSTER_NAME
: クラスタの名前。COMPUTE_LOCATION
: クラスタの Compute Engine のロケーション。
ノードプール内のノードに Cloud Logging のアクセス スコープが設定されていることを確認する
ノードが Cloud Logging にログを書き込むには、次のいずれかのスコープが必要です。
https://www.googleapis.com/auth/logging.write
https://www.googleapis.com/auth/cloud-platform
https://www.googleapis.com/auth/logging.admin
クラスタ内の各ノードプールで構成されているスコープを確認します。
gcloud container node-pools list --cluster=CLUSTER_NAME \ --format="table(name,config.oauthScopes)" \ --location COMPUTE_LOCATION
次のように置き換えます。
CLUSTER_NAME
: クラスタの名前。COMPUTE_LOCATION
: クラスタの Compute Engine のロケーション。
古いノードプールから新しく作成されたノードプールにワークロードを移行し、進捗状況をモニタリングします。
新しいノードプールを作成して正しいロギング スコープを構成します。
gcloud container node-pools create NODE_POOL_NAME \ --cluster=CLUSTER_NAME \ --location=COMPUTE_LOCATION \ --scopes="gke-default"
次のように置き換えます。
CLUSTER_NAME
: クラスタの名前。COMPUTE_LOCATION
: クラスタの Compute Engine のロケーション。
ログの書き込みに関する権限の問題を特定して修正する
GKE は、ノードに接続されている IAM サービス アカウントを使用して、ロギングやモニタリングなどのシステムタスクを実行します。少なくとも、これらのノード サービス アカウントには、プロジェクトに対する Kubernetes Engine デフォルト ノード サービス アカウント(roles/container.defaultNodeServiceAccount
)ロールが必要です。デフォルトでは、GKE はプロジェクトで自動的に作成される Compute Engine のデフォルトのサービス アカウントをノード サービス アカウントとして使用します。
組織で iam.automaticIamGrantsForDefaultServiceAccounts
組織のポリシー制約が適用されている場合、プロジェクトのデフォルトの Compute Engine サービス アカウントに GKE に必要な権限が自動的に付与されないことがあります。
問題を特定するには、クラスタのシステム ロギング ワークロードで
401
エラーを確認します。[[ $(kubectl logs -l k8s-app=fluentbit-gke -n kube-system -c fluentbit-gke | grep -cw "Received 401") -gt 0 ]] && echo "true" || echo "false"
出力が
true
の場合、システム ワークロードで 401 エラーが発生しています。これは、権限がないことを示します。出力がfalse
の場合は、残りの手順をスキップして、別のトラブルシューティングの手順を試します。
-
ノードが使用するサービス アカウントの名前を確認します。
console
- [Kubernetes クラスタ] ページに移動します。
- クラスタリストで、検査するクラスタの名前をクリックします。
- クラスタの運用モードに応じて、次のいずれかを行います。
- Autopilot モードのクラスタの場合は、[セキュリティ] セクションで [サービス アカウント] フィールドを見つけます。
- Standard モード クラスタの場合は、次の操作を行います。
- [ノード] タブをクリックします。
- [ノードプール] テーブルで、ノードプールの名前をクリックします。[ノードプールの詳細] ページが開きます。
- [セキュリティ] セクションで、[サービス アカウント] フィールドを見つけます。
[サービス アカウント] フィールドの値が
default
の場合、ノードは Compute Engine のデフォルトのサービス アカウントを使用します。このフィールドの値がdefault
でない場合、ノードはカスタム サービス アカウントを使用します。カスタム サービス アカウントに必要なロールを付与するには、最小権限の IAM サービス アカウントを使用するをご覧ください。gcloud
Autopilot モードのクラスタの場合は、次のコマンドを実行します。
gcloud container clusters describe
CLUSTER_NAME
\ --location=LOCATION
\ --flatten=autoscaling.autoprovisioningNodePoolDefaults.serviceAccountStandard モードのクラスタの場合は、次のコマンドを実行します。
gcloud container clusters describe
CLUSTER_NAME
\ --location=LOCATION
\ --format="table(nodePools.name,nodePools.config.serviceAccount)"出力が
default
の場合、ノードは Compute Engine のデフォルトのサービス アカウントを使用します。出力がdefault
でない場合、ノードはカスタム サービス アカウントを使用しています。必要なロールをカスタム サービス アカウントに付与するには、最小権限の IAM サービス アカウントを使用するをご覧ください。 -
Compute Engine のデフォルト サービス アカウントに
roles/container.defaultNodeServiceAccount
ロールを付与する手順は次のとおりです。console
- [ようこそ] ページに移動します。
- [プロジェクト番号] フィールドで、 [クリップボードにコピー] をクリックします。
- [IAM] ページに移動します。
- [ アクセスを許可] をクリックします。
- [新しいプリンシパル] フィールドに次の値を指定します。
PROJECT_NUMBER-compute@developer.gserviceaccount.com
PROJECT_NUMBER
は、コピーしたプロジェクト番号に置き換えます。 - [ロールを選択] メニューで、[Kubernetes Engine のデフォルト ノード サービス アカウント] ロールを選択します。
- [保存] をクリックします。
gcloud
- Google Cloud プロジェクト番号を確認します。
gcloud projects describe PROJECT_ID \ --format="value(projectNumber)"
PROJECT_ID
を実際のプロジェクト ID に置き換えます。出力は次のようになります。
12345678901
- Compute Engine のデフォルト サービス アカウントに
roles/container.defaultNodeServiceAccount
ロールを付与します。gcloud projects add-iam-policy-binding PROJECT_ID \ --member="serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com" \ --role="roles/container.defaultNodeServiceAccount"
PROJECT_NUMBER
は、前の手順で取得したプロジェクト番号に置き換えます。
Cloud Logging の書き込み API 割り当てに達していないことを確認する
Cloud Logging の API 書き込み割り当ての上限に達していないことを確認します。
Google Cloud コンソールで、[割り当て] ページに移動します。
テーブルを「Cloud Logging API」でフィルタリングします。
どの割り当ての上限にも達していないことを確認します。
gcpdiag を使用して GKE のロギングの問題をデバッグする
GKE クラスタからログが取得されない場合や、不完全なログが取得される場合は、gcpdiag
ツールを使用してトラブルシューティングを行います。
gcpdiag
はオープンソース ツールです。正式にサポートされている Google Cloud プロダクトではありません。
gcpdiag
ツールを使用すると、Google Cloud プロジェクトの問題を特定して修正できます。詳細については、GitHub の gcpdiag プロジェクトをご覧ください。
- プロジェクト レベルのロギング: GKE クラスタが格納されている Google Cloud プロジェクトで Cloud Logging API が有効になっていることを確認します。
- クラスタレベルのロギング: GKE クラスタの構成内でロギングが明示的に有効になっていることを確認します。
- ノードプールの権限: クラスタのノードプール内のノードで「Cloud Logging 書き込み」スコープが有効になっていることを確認します。有効になっていれば、ログデータが送信されます。
- サービス アカウントの権限: ノードプールで使用されるサービス アカウントに、Cloud Logging の操作に必要な IAM 権限があることを確認します。通常は roles/logging.logWriter ロールが必要です。
- Cloud Logging API の書き込み割り当て: 指定された期間内に Cloud Logging API の書き込み割り当てが超過していないことを確認します。
Google Cloud コンソール
- 次のコマンドを入力してコピーします。
- Google Cloud コンソールを開き、Cloud Shell をアクティブにします。 Cloud コンソールを開く
- コピーしたコマンドを貼り付けます。
gcpdiag
コマンドを実行します。gcpdiag
Docker イメージがダウンロードされ、診断チェックが実行されます。該当する場合は、出力指示に従って失敗したチェックを修正します。
gcpdiag runbook gke/logs \
--parameter project_id=PROJECT_ID \
--parameter name=GKE_NAME \
--parameter location=LOCATION
Docker
Docker コンテナで gcpdiag
を起動するラッパーを使用して gcpdiag
を実行できます。Docker または Podman がインストールされている必要があります。
- ローカル ワークステーションで次のコマンドをコピーして実行します。
curl https://gcpdiag.dev/gcpdiag.sh >gcpdiag && chmod +x gcpdiag
-
gcpdiag
コマンドを実行します。./gcpdiag runbook gke/logs \ --parameter project_id=PROJECT_ID \ --parameter name=GKE_NAME \ --parameter location=LOCATION
このランブックで使用可能なパラメータを表示します。
次のように置き換えます。
- PROJECT_ID: リソースを含むプロジェクトの ID。
- GKE_NAME: GKE クラスタの名前。
- LOCATION: GKE クラスタのゾーンまたはリージョン。
有用なフラグ:
--universe-domain
: 該当する場合、リソースをホストする信頼できるパートナーのソブリン クラウド ドメイン--parameter
または-p
: ランブック パラメータ
gcpdiag
ツールのフラグの一覧と説明については、gcpdiag
の使用手順をご覧ください。