TKGS クラスタをプロビジョニングできない場合は、この一般的なエラーのリストを確認してトラブルシューティングを行います。
クラスタ API ログの確認
TKG クラスタを作成できない場合は、CAPW/V が機能していることを確認します。
CAPW/V コントローラは、クラスタ API のインフラストラクチャ固有の実装です。CAPW/V を有効にするには、スーパーバイザー を使用します。CAPW/V は TKG のコンポーネントであり、TKG クラスタのライフサイクルを管理します。
CAPW/V は、VirtualNetwork の作成と更新を行います。VirtualNetwork の準備ができている場合にのみ、クラスタ ノードの作成を進めることができます。クラスタ作成ワークフローは、このフェーズを通過しましたか。
CAPW/V は、VirtualMachineService の作成と更新を行います。VirtualMachineService は正常に作成されましたか。外部 IP は取得されましたか。クラスタ作成ワークフローは、このフェーズを通過しましたか。
kubectl config use-context tkg-cluster-ns
kubectl get pods -n vmware-system-capw | grep capv-controller
kubectl logs -n vmware-system-capw -c manager capv-controller-manager-...
クラスタ仕様の検証エラー
YAML 仕様に従って、キー名にスペース文字を使用できます。これはスペースを含むスカラー文字列であり、引用符は必要ありません。
ただし、TKGS の検証では、キー名にスペース文字を使用することはできません。TKGS では、有効なキー名は、英数字、ダッシュ(key-name
など)、アンダースコア(KEY_NAME
など)、ドット(key.name
など)のみで構成する必要があります。
クラスタ仕様でキー名にスペース文字を使用すると、TKGS クラスタはデプロイされません。vmware-system-tkg-controller-manager ログには次のエラー メッセージが記録されます。
Invalid value: \"Key Name\": a valid config key must consist of alphanumeric characters, '-', '_' or '.' (e.g. 'key.name', or 'KEY_NAME', or 'key-name', regex used for validation is '[-._a-zA-Z0-9]+')"
このエラーを修正するには、スペース文字を完全に削除するか、サポートされている文字に置き換えます。
TKG クラスタ YAML の適用時のエラー
- クラスタ ネットワークが正しい状態でない
-
TKG クラスタのプロビジョニング ワークフローを理解します。
- CAPV は、各 TKG クラスタ ネットワークに対して VirtualNetwork オブジェクトを作成します。
- スーパーバイザー が NSX ネットワークを使用するように構成されている場合、NCP は VirtualNetwork オブジェクトを監視し、各 VirtualNetwork に対して NSX Tier-1 ルーターと NSX セグメントを作成します。
- CAPV は VirtualNetwork のステータスをチェックし、準備ができたらワークフローの次の手順に進みます。
仮想マシン サービス コントローラは、CAPV によって作成されたカスタム オブジェクトを監視し、これらの仕様を使用して、TKG クラスタを構築する仮想マシンを作成および構成します。
NSX Container Plugin (NCP) は、Kubernetes API を介して etcd に追加されたネットワーク リソースを監視し、NSX で対応するオブジェクトの作成を調整するコントローラです。
これらの各コントローラは、スーパーバイザー 制御プレーン上で Kubernetes ポッドとして実行されます。ネットワークの問題のトラブルシューティングを実行するには、CAPV コントローラ ログ、仮想マシン サービス ログ、および NCP ログを確認します。
- 制御プレーン ノード数が無効
-
スーパーバイザー 上の TKG クラスタでは、1 つまたは 3 つの制御プレーン ノードがサポートされています。別のレプリカ数を入力すると、クラスタのプロビジョニングが失敗します。
- 制御プレーン/ワーカー仮想マシンのストレージ クラスが無効
-
次のコマンドを実行します。
kubectl describe ns <tkg-clsuter-namesapce>
TKG クラスタを作成する名前空間にストレージ クラスが割り当てられていることを確認します。そのストレージ クラスを参照する vSphere 名前空間 には ResourceQuota が必要で、そのストレージ クラスが スーパーバイザー 内にある必要があります。
スーパーバイザー にあるストレージ クラスと名前が一致することを確認します。vSphere 管理者として
kubectl get storageclasses
スーパーバイザー を実行します。WCP によって スーパーバイザー にストレージ プロファイルが適用されるときに、名前が変換されることがあります(ハイフンがアンダースコアになるなど)。 - 仮想マシン クラスが無効
-
クラスタ YAML で指定された値が、
kubectl get virtualmachineclass
によって返された仮想マシン クラスのいずれかと一致することを確認します。TKG クラスタではバインドされたクラスのみを使用できます。仮想マシン クラスは、vSphere 名前空間 に追加されるとバインドされます。コマンド
kubectl get virtualmachineclasses
は スーパーバイザー 上のすべての仮想マシン クラスを返しますが、バインドされているクラスのみを使用できます。 - TKR 分散が見つからない
-
次のようなエラーが表示される場合があります。
“Error from server (unable to find Kubernetes distributions): admission webhook “version.mutating.tanzukubernetescluster.run.tanzu.vmware.com” denied the request: unable to find Kubernetes distributions”
これは、コンテンツ ライブラリの問題である場合があります。使用可能になっているものを一覧表示するには、
kubectl get virtualmachineimages -A
コマンドを使用します。結果として、コンテンツ ライブラリで使用可能になっているもの、同期されたもの、またはアップロードされたものが表示されます。スーパーバイザー 上の TKG には、新しい TKR API と互換性がある新しい TKR 名があります。コンテンツ ライブラリ内の各 TKR に正しい名前を付ける必要があります。
コンテンツ ライブラリでの名前:
photon-3-amd64-vmi-k8s-v1.23.8---vmware.2-tkg.1-zshippable
TKG クラスタ仕様での対応する名前:
version: v1.23.8+vmware.2-tkg.1-zshippable
TKG YAML は適用されるが、仮想マシンが作成されない
- CAPI/CAPV リソースの確認
-
TKG によって CAPI/CAPV レベルのリソースが作成されたかどうかを確認します。
- CAPV によって VirtualMachine リソースが作成されたかどうかを確認します。
- 仮想マシン オペレータ ログを確認して、仮想マシンが作成されなかった理由を調べます。たとえば、ESX ホストでのリソース不足のために OVF のデプロイが失敗した可能性があります。
- CAPV と仮想マシン オペレータのログを確認します。
- NCP ログを確認します。NCP は制御プレーンの VirtualNetwork、VirtualNetworkInterface、および LoadBalancer を認識します。これらのリソースに関連するエラーがあると、問題になる可能性があります。
- 仮想マシン サービスのエラー
-
仮想マシン サービスのエラー
- 名前空間で
kubectl get virtualmachineservices
を実行します - 仮想マシン サービスは作成されましたか。
- 名前空間で
kubectl describe virtualmachineservices
を実行します - 仮想マシン サービスでエラーが報告されていますか。
- 名前空間で
- 仮想ネットワークのエラー
-
名前空間で
kubectl get virtualnetwork
を実行します。このクラスタのために仮想ネットワークが作成されますか。
名前空間で
kubectl describe virtual network
を実行します。仮想マシンのために仮想ネットワーク インターフェイスが作成されますか。
TKG クラスタ制御プレーンが実行されていない
- エラーが発生したときにリソースの準備ができていたかどうかを確認する
-
ログを調べる他に、関連オブジェクトのステータス (ControlPlaneLoadBalancer) を確認すると、エラーが発生したときにリソースの準備ができていたかどうかを理解するのに役立ちます。ネットワークのトラブルシューティングを参照してください。
- 起動していないのは Join Node 制御プレーンですか。それとも Init Node ですか。
-
ノード参加が正しく動作しない場合があります。特定の仮想マシンのノード ログを調べてください。初期ノードが正常に起動しない場合、クラスタにワーカー ノードと制御プレーン ノードがない可能性があります。
- プロバイダ ID がノード オブジェクトに設定されていない
-
仮想マシンが作成された場合は、IP を持っているかどうかを確認し、cloud-init ログを調べます(kubeadm コマンドが適切に実行されているか)。
CAPI コントローラのログを確認して、問題が発生しているかどうかを確認します。それは、TKG クラスタで
kubectl get nodes
を使用して確認できます。その後、ノード オブジェクトにプロバイダ ID があるかどうかを確認します。
TKG ワーカー ノードが作成されない
kubectl describe cluster CLUSTER-NAME
名前空間内の仮想マシン リソースを確認します。他に作成されたリソースはありますか。
ない場合は、CAPV ログを調べて、他の仮想マシン オブジェクトが作成されない理由を確認します。ブートストラップ データは使用できません。
CAPI がロード バランサを介して TKG クラスタ制御プレーン(ノード仮想マシンの IP アドレスを使用する NSX または外部ロード バランサを使用する Distributed Switch)と通信できない場合は、名前空間のシークレットを使用して TKG クラスタ kubeconfig を取得します。
kubectl get secret -n <namespace> <tkg-cluster-name>-kubeconfig -o jsonpath='{.data.value}' | base64 -d > tkg-cluster-kubeconfig; kubectl --kubeconfig tkg-cluster-kubeconfig get pods -A
これが「接続が拒否されました」で失敗する場合は、制御プレーンが適切に初期化されなかった可能性があります。I/O タイムアウトが発生する場合は、kubeconfig で IP アドレスへの接続を確認します。
組み込みのロード バランサを使用する NSX:
- 制御プレーン LB が起動し、アクセス可能であることを確認します。
- LB に IP がない場合は、NCP ログと NSX-T ユーザー インターフェイスを調べて、関連するコンポーネントが正しい状態であるかどうかを確認します。(NSX-T LB、VirtualServer、ServerPool は、すべて健全な状態である必要があります)。
- LB に IP アドレスがあっても、アクセスできない場合(
curl -k https://<LB- VIP>:6443/healthz
は不正なエラーを返します)。サービス外部 IP の LoadBalancer タイプが「保留中」状態の場合は、TKG クラスタがスーパーバイザー LB VIP を介してスーパーバイザー Kubernetes API と通信できることを確認します。IP アドレスの重複がないことを確認します。
- TKG クラスタ制御プレーンがエラー(プロバイダ ID でノードを作成できないなど)を報告しているかどうかを確認します。
- TKG クラスタ クラウド プロバイダがノードを正しいプロバイダ ID でマークしなかったため、CAPI はゲスト クラスタ ノードのプロバイダ ID とスーパーバイザー クラスタのマシン リソースを比較して検証することができません。
kubectl get po -n vmware-system-cloud-provider
kubectl logs -n vmware-system-cloud-provider <pod name>
VMOP によって VirtualMachineService が正常に調整されなかった場合は、仮想マシン オペレータ ログを確認します。
NCP で NSX-T リソースを作成するときに問題が発生した場合は、NCP ログを確認します。
kubectl get virtualmachine -n <namespace> <TKC-name>-control-plane-0 -o yaml
ssh vmware-system-user@<vm-ip> -i tkc-cluster-ssh
cat /var/log/cloud-init-output.log | less
プロビジョニングされた TKG クラスタが「作成中」フェーズで停止する
次のコマンドを実行して、クラスタのステータスを確認します。
kubectl get tkc -n <namespace>
kubectl get cluster -n <namespace>
kubectl get machines -n <namespace>KubeadmConfig がありましたが、CAPI がそれを見つけることができませんでした。vmware-system-capv のトークンに kubeadmconfig をクエリする適切な権限があるかどうかを確認しました。
$kubectl --token=__TOKEN__ auth can-i get kubeadmconfig yesコントローラ ランタイム キャッシュが更新されていない可能性があります。CAPI ウォッチ キャッシュが古く、新しいオブジェクトを取得していない可能性があります。必要に応じて、問題を解決するために capi-controller-manager を再起動します。
kubectl rollout restart deployment capi-controller-manager -n vmware-system-capv
vSphere 名前空間 が「終了中」フェーズで停止する
バージョンの互換性の観点から、TKR、スーパーバイザー、および vCenter Server が同期していることを確認します。
kubectl describe namespace NAME
次のエラーが見つかりました:「サーバからのエラー(Kubernetes ディストリビューションが見つかりません):アドミッション Webhook「version.mutating.tanzukubernetescluster.run.tanzu.vmware.com」が要求を拒否しました:Kubernetes ディストリビューションが見つかりません」
kubectl get virtualmachineimages -A