このページでは、Google Distributed Cloud クラスタのインストールまたはアップグレードに関連する問題を解決する方法について説明します。
インストールに関する問題
以下のセクションでは、Google Distributed Cloud のインストールに関する問題のトラブルシューティングに役立つ情報を提供します。
一時的なエラー メッセージ
Google Distributed Cloud のインストール プロセスは継続的な調整ループです。そのため、インストール中に、一時的なエラー メッセージがログに表示されることがあります。
インストールが正常に完了している限り、これらのエラーは無視してかまいません。一般的な一時的エラーログ メッセージは次のとおりです。
Internal error occurred: failed calling webhook "webhook.cert-manager.io": Post
https://cert-manager-webhook.cert-manager.svc:443/mutate?timeout=10s:
dial tcp IP_ADDRESS:443: connect: connection refused
Internal error occurred: failed calling webhook "vcluster.kb.io": Post
https://webhook-service.kube-system.svc:443/validate-baremetal-cluster-gke-io-v1-cluster?timeout=30s:
dial tcp IP_ADDRESS:443: connect: connection refused
Failed to register cluster with GKE Hub; gcloud output: error running command
'gcloud container fleet memberships register CLUSTER_NAME --verbosity=error --quiet':
error: exit status 1, stderr: 'ERROR: (gcloud.container.hub.memberships.register)
Failed to check if the user is a cluster-admin: Unable to connect to the server: EOF
Get
https://127.0.0.1:34483/apis/infrastructure.baremetal.cluster.gke.io/v1/namespaces/cluster-
cluster1/baremetalmachines: dial tcp 127.0.0.1:34483: connect: connection refused"
Create Kind Cluster "msg"="apply run failed" "error"="unable to recognize \"/tmp/kout088683152\": no matches for kind \"NetworkLogging\" in version \"networking.gke.io/v1alpha1\""
Create Kind Cluster "msg"="apply run failed" "error"="unable to recognize \"/tmp/kout869681888\": no matches for kind \"Provider\" in version \"clusterctl.cluster.x-k8s.io/v1alpha3\""
Google Cloud サービス アカウント キーの有効期限が切れている場合、bmctl から次のエラー メッセージが返されます。
Error validating cluster config: 3 errors occurred:
* GKEConnect check failed: Get https://gkehub.googleapis.com/v1beta1/projects/project/locations/global/memberships/admin: oauth2: cannot fetch token: 400 Bad Request
Response: {"error":"invalid_grant","error_description":"Invalid JWT Signature."}
* ClusterOperations check failed: Post https://cloudresourcemanager.googleapis.com/v1/projects/project:testIamPermissions?alt=json&prettyPrint=false: oauth2: cannot fetch token: 400 Bad Request
Response: {"error":"invalid_grant","error_description":"Invalid JWT Signature."}
* GCR pull permission for bucket: artifacts.anthos-baremetal-release.appspot.com failed: Get https://storage.googleapis.com/storage/v1/b/artifacts.anthos-baremetal-release.appspot.com/iam/testPermissions?alt=json&permissions=storage.objects.get&permissions=storage.objects.list&prettyPrint=false: oauth2: cannot fetch token: 400 Bad Request
Response: {"error":"invalid_grant","error_description":"Invalid JWT Signature."}
新しいサービス アカウント キーを生成する必要があります。
ブートストラップ クラスタを使用して問題をデバッグする
Google Distributed Cloud で、セルフマネージド(管理、ハイブリッド、スタンドアロン)クラスタを作成する際には、Docker の Kubernetes(kind)クラスタがデプロイされ、Kubernetes コントローラが一時的にホストされます。この一時的なクラスタは、ブートストラップ クラスタと呼ばれます。ユーザー クラスタは、ブートストラップ クラスタを使用せずに、管理クラスタまたはハイブリッド クラスタを管理することによって作成およびアップグレードされます。
インストールする際、デプロイに kind クラスタがすでに存在していると、Google Distributed Cloud により既存の kind クラスタが削除されます。削除は、インストールまたはアップグレードが成功した場合にのみ行われます。成功後も既存の kind クラスタを保持するには、bmctl の --keep-bootstrap-cluster フラグを使用します。
Google Distributed Cloud では、ブートストラップ クラスタの構成ファイルが WORKSPACE_DIR/.kindkubeconfig の下に作成されます。ブートストラップ クラスタへの接続は、クラスタの作成とアップグレード中のみ可能です。
ブートストラップ クラスタは、イメージを pull するために Docker リポジトリにアクセスする必要があります。非公開レジストリを使用しない場合は、レジストリがデフォルトで Artifact Registry に設定されます。クラスタの作成中、bmctl が次のファイルを作成します。
bmctl-workspace/config.json: レジストリ アクセス用の Google Cloud サービス アカウントの認証情報が含まれます。この認証情報は、クラスタ構成ファイルのgcrKeyPathフィールドから取得されます。bmctl-workspace/config.toml: kind クラスタ内の containerd 構成が含まれます。
ブートストラップ クラスタのログを調べる
ブートストラップ クラスタをデバッグするには、次の操作を行います。
- クラスタの作成またはアップグレード中に、ブートストラップ クラスタに接続します。
- ブートストラップ クラスタのログを取得します。
bmctl の実行に使用するマシンのログは、次のフォルダにあります。
bmctl-workspace/CLUSTER_NAME/log/create-cluster-TIMESTAMP/bootstrap-cluster/bmctl-workspace/CLUSTER_NAME/log/upgrade-cluster-TIMESTAMP/bootstrap-cluster/
CLUSTER_NAME と TIMESTAMP は、クラスタの名前と対応するシステムの時刻に置き換えます。
ブートストラップ クラスタから直接ログを取得するには、クラスタの作成またはアップグレード中に次のコマンドを実行します。
docker exec -it bmctl-control-plane bash
このコマンドにより、ブートストラップ クラスタで実行される bmctl コントロール プレーン コンテナ内でターミナルが起動します。
kubelet ログと containerd ログを検査するには、次のコマンドを使用して、出力でエラーや警告を探します。
journalctl -u kubelet
journalctl -u containerd
containerd のデバッグ ロギングを有効にする
標準の containerd ログでトラブルシューティングに十分な情報が得られない場合は、ロギングレベルを上げることができます。レジストリ ミラーの問題や ImagePullBackOff エラーなど、複雑な問題を診断するときは、多くの場合、ロギングレベルを上げる必要があります。
ロギングレベルを上げるには、次の操作を行います。
デバッグ ロギングを有効にします。
任意のテキスト エディタを使用して、containerd 構成ファイル(
/etc/containerd/config.toml)を開きます。ファイルで
[debug]セクションを見つけ、levelの値を""から"debug"に変更します。ファイルを保存して、テキスト エディタを終了します。
構成ファイルが正常に更新されたことを確認します。
cat /etc/containerd/config.toml | grep debug出力は次のようになります。
[debug] level = "debug" shim_debug = falseロギングレベルの変更を適用するには、containerd を再起動します。
sudo systemctl restart containerd
新しいログエントリを生成するには、存在しないイメージ、またはノードやクラスタで使用されていないイメージを pull してみてください。次に例を示します。
# This command fails because the image doesn't exist crictl pull us-west1-docker.pkg.dev/gdc-project/samples/non-existent-image:latestこれにより、containerd でアクションが実行され、詳細なログが生成されます。
イメージが pull されるか失敗するまで待ってから、containerd ログを
containerd_log.txtという名前のファイルに収集します。journalctl -u containerd --no-pager --since TIME_PERIOD > containerd_log.txtTIME_PERIODは、ログの開始時間を指定する値に置き換えます。スペースを含む値は二重引用符で囲みます。たとえば"2 hours ago"です。トラブルシューティングが完了したら、ログレベルをデフォルトに戻します。デバッグ ロギングを有効にしたままにすると、システムログが大量に生成され、パフォーマンスに影響する場合があるほか、機密情報が漏洩する可能性もあります。
/etc/containerd/config.tomlファイルを開き、levelの値をデフォルトのロギング レベルである""に戻します。構成が正常に更新されたことを確認します。
cat /etc/containerd/config.toml | grep level出力は次のようになります。
level = ""変更を適用するには、containerd を再起動します。
sudo systemctl restart containerdシステムが標準のロギング構成に戻ります。
クラスタ アップグレードの問題
Google Distributed Cloud クラスタをアップグレードすると、進行状況をモニタリングし、クラスタとノードのステータスを確認できます。
- アップグレード中に問題が発生した場合は、障害が発生したステージを特定してください。アップグレード プロセス中のクラスタへの影響について詳しくは、クラスタ アップグレードのライフサイクルとステージをご覧ください。
- クラスタ アップグレード中の問題による影響の詳細については、Google Distributed Cloud の障害の影響を理解するをご覧ください。
次のガイダンスは、アップグレードが正常に行われているか、問題が発生しているかを判断する際に役立ちます。
アップグレードの進行状況をモニタリングする
アップグレード プロセス中のクラスタのステータスを確認するには、kubectl describe cluster コマンドを使用します。
kubectl describe cluster CLUSTER_NAME \
--namespace CLUSTER_NAMESPACE \
--kubeconfig ADMIN_KUBECONFIG
次の値を置き換えます。
CLUSTER_NAME: クラスタの名前。CLUSTER_NAMESPACE: クラスタの Namespace。ADMIN_KUBECONFIG: 管理 kubeconfig ファイル。- デフォルトでは、管理クラスタ、ハイブリッド クラスタ、スタンドアロン クラスタはインプレース アップグレードを使用します。
bmctl upgradeコマンドに--use-bootstrap=trueフラグを使用すると、アップグレード オペレーションでブートストラップ クラスタが使用されます。ブートストラップ クラスタの使用時にアップグレードの進行状況をモニタリングするには、ブートストラップ クラスタの kubeconfig ファイルのパス(.kindkubeconfig)を指定します。このファイルはワークスペース ディレクトリにあります。
- デフォルトでは、管理クラスタ、ハイブリッド クラスタ、スタンドアロン クラスタはインプレース アップグレードを使用します。
出力の Status セクションを確認します。ここには、クラスタのアップグレード ステータスの集計が表示されます。クラスタがエラーを報告した場合は、次の各セクションを使用してトラブルシューティングを行います。
ノードの準備が完了しているかどうかを確認する
アップグレード プロセス中にクラスタ内のノードのステータスを表示するには、kubectl get nodes コマンドを使用します。
kubectl get nodes --kubeconfig KUBECONFIG
ノードでアップグレード プロセスが正常に完了したかどうかを確認するには、コマンド レスポンスの VERSION 列と AGE 列を確認します。VERSION は、クラスタの Kubernetes バージョンです。特定の Google Distributed Cloud バージョンの Kubernetes バージョンを確認するには、バージョニングをご覧ください。
ノードに NOT READY が表示されている場合は、ノードを接続して kubelet のステータスを確認してください。
systemctl status kubelet
kubelet ログを確認することもできます。
journalctl -u kubelet
kubelet のステータスとログの出力を確認し、ノードに問題がある理由を示すメッセージを探します。
アップグレード中のノードを確認する
クラスタ内のどのノードがアップグレード中かを確認するには、kubectl get baremetalmachines コマンドを使用します。
kubectl get baremetalmachines --namespace CLUSTER_NAMESPACE \
--kubeconfig ADMIN_KUBECONFIG
次の値を置き換えます。
CLUSTER_NAMESPACE: クラスタの Namespace。ADMIN_KUBECONFIG: 管理 kubeconfig ファイル。- ブートストラップ クラスタが管理、ハイブリッド、スタンドアロンのアップグレードに使用される場合は、ブートストラップ クラスタの kubeconfig ファイル(
bmctl-workspace/.kindkubeconfig)を指定します。
- ブートストラップ クラスタが管理、ハイブリッド、スタンドアロンのアップグレードに使用される場合は、ブートストラップ クラスタの kubeconfig ファイル(
次の出力例は、アップグレードされるノードに DESIRED ABM VERSION とは異なる ABM VERSION があることを示しています。
NAME CLUSTER READY INSTANCEID MACHINE ABM VERSION DESIRED ABM VERSION
10.200.0.2 cluster1 true baremetal://10.200.0.2 10.200.0.2 1.13.0 1.14.0
10.200.0.3 cluster1 true baremetal://10.200.0.3 10.200.0.3 1.13.0 1.13.0
ドレイン中のノードを確認する
アップグレード プロセスでは、ノードが Pod からドレインされ、ノードが正常にアップグレードされるまでスケジューリングが無効になります。ドレインされているノードを確認するには、kubectl get nodes コマンドを使用します。
kubectl get nodes --kubeconfig USER_CLUSTER_KUBECONFIG | grep "SchedulingDisabled"
USER_CLUSTER_KUBECONFIG は、ユーザー クラスタ kubeconfig ファイルのパスに置き換えます。
STATUS 列は grep でフィルタされ、SchedulingDisabled を報告するノードのみが表示されます。このステータスは、ノードがドレイン中であることを示します。
管理クラスタからノードのステータスを確認することもできます。
kubectl get baremetalmachines -n CLUSTER_NAMESPACE \
--kubeconfig ADMIN_KUBECONFIG
次の値を置き換えます。
CLUSTER_NAMESPACE: クラスタの Namespace。ADMIN_KUBECONFIG: 管理 kubeconfig ファイル。- ブートストラップ クラスタが管理、ハイブリッド、スタンドアロンのアップグレードに使用される場合は、ブートストラップ クラスタの kubeconfig ファイル(
bmctl-workspace/.kindkubeconfig)を指定します。
- ブートストラップ クラスタが管理、ハイブリッド、スタンドアロンのアップグレードに使用される場合は、ブートストラップ クラスタの kubeconfig ファイル(
ドレインされるノードのステータスは、MAINTENANCE 列に表示されます。
ノードが長期間ドレインされている理由を確認する
前のセクションで説明した方法のいずれかで、kubectl get nodes コマンドを使用して、ドレインされているノードを特定します。kubectl get
pods コマンドを使用して、このノード名でフィルタし、詳細を表示します。
kubectl get pods --all-namespaces -o wide --field-selector spec.nodeName=NODE_NAME
NODE_NAME は、ドレインされているノードの名前に置き換えます。停止している、またはドレインの速度の遅い Pod のリストが返されます。ノードのドレインに 20 分以上かかる場合は、停止した Pod が存在していてもアップグレードが続行されます。
リリース 1.29 以降では、ノードドレイン プロセスで PodDisruptionBudgets(PDB)を優先する Eviction API が使用されています。
次の PDB 設定により、ノードのドレインで問題が発生する可能性があります。
複数の PDB によって管理される Pod
次のような PDB 静的構成:
maxUnavailable==0minUnavailable>= 合計レプリカ
合計レプリカ数は、
Deployment、ReplicaSet、StatefulSetなどの上位レベルのリソースで定義されるため、PDB リソースから判断することは困難です。PDB は、構成内のセレクタに基づいて Pod と照合されます。静的 PDB 構成が問題の原因かどうかを診断するには、まずpdb.Status.ExpectPodsがpdb.Status.DesiredHealthy以下であるかどうかを調べ、前述の静的構成のいずれが原因となっているかどうか確認することをおすすめします。
ランタイム違反(計算済みファイルなど)DisruptionsAllowed PDB リソースの 0 ノードのドレインをブロックすることもあります。追加の中断を許可できない PodDisruptionBudget オブジェクトが構成されている場合、ノードのアップグレードを繰り返し試行しても、コントロール プレーン バージョンへのアップグレードが失敗する可能性があります。このエラーを回避するには、Deployment または HorizontalPodAutoscaler をスケールアップして、PodDisruptionBudget 構成を維持しながらノードをドレインすることをおすすめします。
中断を許可しないすべての PodDisruptionBudget オブジェクトを表示するには、次のコマンドを使用します。
kubectl get poddisruptionbudget --all-namespaces \
-o jsonpath='{range .items[?(@.status.disruptionsAllowed==0)]}{.metadata.name}/{.metadata.namespace}{"\n"}{end}'
Pod が異常な状態である理由を確認する
Pod に upgrade-first-node または upgrade-node のコントロール プレーンの IP アドレスが含まれている場合は、アップグレードが失敗する可能性があります。この動作は、通常、静的 Pod が正常でないために発生します。
crictl ps -aコマンドを使用して静的 Pod を確認し、クラッシュしている Kubernetes Pod またはetcdPod を探します。失敗した Pod がある場合は、Pod のログを調べて、クラッシュした理由を確認します。クラッシュループが発生する理由としては、次のようなことが考えられます。
- 静的 Pod にマウントされたファイルの権限または所有権が正しくない。
- 仮想 IP アドレスへの接続が機能しない。
etcdに問題がある。
crictl psコマンドが機能しないか、何も返されない場合は、kubeletと containerd のステータスを確認します。systemctl status SERVICEコマンドとjournalctl -u SERVICEコマンドを使用して、ログを確認します。
次のステップ
さらにサポートが必要な場合は、Cloud カスタマーケアにお問い合わせください。以下を含むサポート リソースの詳細については、サポートを受けるもご覧ください。