以下のセクションでは、GKE On-Prem の使用中に発生する可能性のある問題とその解決方法について説明します。
始める前に
問題のトラブルシューティングを開始する前に、以下のセクションをご確認ください。
gkectl
を使用してクラスタの問題を診断する
クラスタの問題を特定し、クラスタの情報を Google と共有するために、gkectl diagnose
コマンドを使用します。クラスタの問題を診断するをご覧ください。
デフォルトのロギング動作
gkectl
と gkeadm
では、デフォルトのロギング設定を使用するだけで十分です。
-
デフォルトでは、ログエントリは次のように保存されます。
gkectl
の場合、デフォルトのログファイルは/home/ubuntu/.config/gke-on-prem/logs/gkectl-$(date).log
で、このファイルはgkectl
を実行するローカル ディレクトリのlogs/gkectl-$(date).log
ファイルにシンボリック リンクされます。gkeadm
の場合、デフォルトのログファイルは、gkeadm
を実行するローカル ディレクトリのlogs/gkeadm-$(date).log
です。
- すべてのログエントリは、ターミナルに出力されていない場合(
--alsologtostderr
がfalse
の場合)でもログファイルに保存されます。 -v5
詳細レベル(デフォルト)は、サポートチームが必要とするログエントリすべてを対象としています。- ログファイルには、実行されたコマンドと失敗メッセージも含まれます。
サポートが必要な場合は、サポートチームにログファイルを送信することをおすすめします。
ログファイルにデフォルト以外の場所を指定する
gkectl
ログファイルにデフォルト以外の場所を指定するには、--log_file
フラグを使用します。指定したログファイルは、ローカル ディレクトリにシンボリック リンクされません。
gkeadm
ログファイルにデフォルト以外の場所を指定するには、--log_file
フラグを使用します。
管理クラスタで Cluster API ログを見つける
管理コントロール プレーンの起動後に VM が起動しない場合は、管理クラスタの Cluster API コントローラのログを調べてデバッグを試すことができます。
kube-system
Namespace で Cluster API コントローラ Pod の名前を確認します。ここで、[ADMIN_CLUSTER_KUBECONFIG] は管理クラスタの kubeconfig ファイルのパスです。kubectl --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] -n kube-system get pods | grep clusterapi-controllers
Pod のログを開きます。ここで、[POD_NAME] は Pod の名前です。必要に応じて、
grep
または同様のツールを使用してエラーを検索します。kubectl --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] -n kube-system logs [POD_NAME] vsphere-controller-manager
インストール
管理クラスタのコントロール プレーン ノードの kubeconfig を使用した F5 BIG-IP の問題のデバッグ
GKE On-Prem をインストールすると、管理ワークステーションのホーム ディレクトリに kubeconfig ファイルが生成されます(internal-cluster-kubeconfig-debug
という名前)。この kubeconfig ファイルは、管理コントロール プレーンが実行される管理クラスタのコントロール プレーン ノードを直接参照することを除いて、管理クラスタの kubeconfig と同じです。この internal-cluster-kubeconfig-debug
ファイルを使用して、F5 BIG-IP の問題をデバッグできます。
gkectl check-config
検証が失敗: F5 BIG-IP パーティションが見つからない
- 現象
F5 BIG-IP パーティションが存在している場合でも見つからず、検証で不合格になります。
- 考えられる原因
F5 BIG-IP API に問題があると、検証が失敗することがあります。
- 解決策
もう一度
gkectl check-config
を実行してみてください。
gkectl prepare --validate-attestations
が失敗: ビルド証明書を検証できない
- 現象
オプションの
--validate-attestations
フラグを指定してgkectl prepare
を実行すると、次のエラーが返されます。could not validate build attestation for gcr.io/gke-on-prem-release/.../...: VIOLATES_POLICY
- 考えられる原因
影響を受けるイメージの証明書が存在しない可能性があります。
- 解決策
管理ワークステーションの作成の説明に従って、管理ワークステーションの OVA をもう一度ダウンロードしてデプロイしてみてください。問題が解決しない場合は、Google にお問い合わせください。
ブートストラップ クラスタのログを使用したデバッグ
インストール時、GKE On-Prem により一時的なブートストラップ クラスタが作成されます。インストールが正常に完了した後、GKE On-Prem によってブートストラップ クラスタが削除され、管理クラスタとユーザー クラスタが残されます。通常、このクラスタを操作する理由はありません。
インストール中に問題が発生し、gkectl create cluster
に --cleanup-external-cluster=false
が渡された場合は、ブートストラップ クラスタのログを使用してデバッグすると便利です。Pod を見つけてログを取得できます。
kubectl --kubeconfig /home/ubuntu/.kube/kind-config-gkectl get pods -n kube-system
kubectl --kubeconfig /home/ubuntu/.kube/kind-config-gkectl -n kube-system get logs [POD_NAME]
管理ワークステーション
openssl
で管理ワークステーション OVA を検証できない
- 現象
管理ワークステーションの OVA ファイルに対して
openssl dgst
を実行してもVerified OK
が返されない- 考えられる原因
OVA ファイルに問題があるため、正常な検証ができません。
- 解決策
管理ワークステーション OVA をダウンロードするの説明に従って、管理ワークステーションの OVA をもう一度ダウンロードしてデプロイしてみてください。問題が解決しない場合は、Google にお問い合わせください。
Connect
ユーザー クラスタを登録できない
ユーザー クラスタの登録で問題が発生した場合は、Google にお問い合わせください。
アルファ版の登録解除中に作成されたクラスタ
Connect のドキュメントでユーザー クラスタの登録をご覧ください。
ストレージ
Volume を接続できない
現象
gkectl diagnose cluster
の出力が次のようになります。
Checking cluster object...PASS Checking machine objects...PASS Checking control plane pods...PASS Checking gke-connect pods...PASS Checking kube-system pods...PASS Checking gke-system pods...PASS Checking storage...FAIL PersistentVolume pvc-776459c3-d350-11e9-9db8-e297f465bc84: virtual disk "[datastore_nfs] kubevols/kubernetes-dynamic-pvc-776459c3-d350-11e9-9db8-e297f465bc84.vmdk" IS attached to machine "gsl-test-user-9b46dbf9b-9wdj7" but IS NOT listed in the Node.Status 1 storage errors
1 つ以上の Pod が ContainerCreating
状態で停止し、次のような警告が表示されます。
Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning FailedAttachVolume 6s (x6 over 31s) attachdetach-controller AttachVolume.Attach failed for volume "pvc-776459c3-d350-11e9-9db8-e297f465bc84" : Failed to add disk 'scsi0:6'.
考えられる原因
仮想ディスクが誤った仮想マシンにアタッチされている場合は、Kubernetes 1.12 の問題 #32727 が原因であることが考えられます。
解決策
仮想ディスクが誤った仮想マシンにアタッチされている場合は、手動での切断が必要になる場合があります。
- ノードをドレインします。ノードを安全にドレインするをご覧ください。たとえば、
kubectl drain
コマンドに--ignore-daemonsets
と--delete-local-data
フラグを指定できます。 - VM の電源を切ります。
- vCenter で VM のハードウェア構成を編集し、Volume を削除します。
- VM の電源を入れます。
- ノードの閉鎖を解除します。
Volume が失われる
現象
gkectl diagnose cluster
の出力が次のようになります。
Checking cluster object...PASS Checking machine objects...PASS Checking control plane pods...PASS Checking gke-connect pods...PASS Checking kube-system pods...PASS Checking gke-system pods...PASS Checking storage...FAIL PersistentVolume pvc-52161704-d350-11e9-9db8-e297f465bc84: virtual disk "[datastore_nfs] kubevols/kubernetes-dynamic-pvc-52161704-d350-11e9-9db8-e297f465bc84.vmdk" IS NOT found 1 storage errors
1 つ以上の Pod が ContainerCreating
状態で停止し、次のような警告が表示されます。
Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning FailedAttachVolume 71s (x28 over 42m) attachdetach-controller AttachVolume.Attach failed for volume "pvc-52161704-d350-11e9-9db8-e297f465bc84" : File []/vmfs/volumes/43416d29-03095e58/kubevols/ kubernetes-dynamic-pvc-52161704-d350-11e9-9db8-e297f465bc84.vmdk was not found
考えられる原因
VMDK ファイルに関して「見つかりません」というエラーが表示される場合は、仮想ディスクが完全に削除されている可能性があります。これは、仮想ディスクまたはアタッチしている仮想マシンを手動で削除した場合に発生します。この問題を回避するには、ユーザー クラスタのサイズ変更とクラスタのアップグレードの説明に従って仮想マシンを管理します。
解決策
仮想ディスクが完全に削除されている場合は、関連する Kubernetes リソースを手動でクリーンアップする必要があります。
kubectl delete pvc [PVC_NAME].
を実行して、PV を参照している PVC を削除します。kubectl delete pod [POD_NAME].
を実行して、PVC を参照している Pod を削除します。- 手順 2 を繰り返します(Kubernetes の問題 74374 をご覧ください)。
vSphere CSI Volume の接続解除に失敗する
現象
ContainerCreating
フェーズで Pod が停止し、FailedAttachVolume
の警告が表示された場合は、別のノードにおける接続解除時の障害の発生が原因であることが考えられます。
次のコマンドを実行して、CSI の切断エラーを見つけます。
kubectl get volumeattachments -o=custom-columns=NAME:metadata.name,DETACH_ERROR:status.detachError.message
出力は次のようになります。
NAME DETACH_ERROR csi-0e80d9be14dc09a49e1997cc17fc69dd8ce58254bd48d0d8e26a554d930a91e5 rpc error: code = Internal desc = QueryVolume failed for volumeID: "57549b5d-0ad3-48a9-aeca-42e64a773469". ServerFaultCode: NoPermission csi-164d56e3286e954befdf0f5a82d59031dbfd50709c927a0e6ccf21d1fa60192dcsi-8d9c3d0439f413fa9e176c63f5cc92bd67a33a1b76919d42c20347d52c57435c csi-e40d65005bc64c45735e91d7f7e54b2481a2bd41f5df7cc219a2c03608e8e7a8
考えられる原因
CNS > Searchable
権限が vSphere ユーザーに付与されていません。
解決策
CNS > Searchable
権限を vCenter ユーザー アカウントに追加します。接続解除オペレーションは、成功するまで自動的に再試行されます。
アップグレード
アップグレード中のダウンタイムについて
リソース | 説明 |
---|---|
管理クラスタ | 管理クラスタが停止しても、ユーザー クラスタのコントロール プレーンとワークロードは、ダウンタイムの原因となった障害の影響を受けない限り引き続き実行されます。 |
ユーザー クラスタのコントロール プレーン | 通常、ユーザー クラスタ コントロール プレーンには目立ったダウンタイムはありません。ただし、Kubernetes API サーバーへの長時間実行の接続が切断され、再確立する必要がある場合があります。この場合、API 呼び出し元は、接続が確立するまで再試行する必要があります。最悪のケースでは、アップグレード中に最大 1 分間のダウンタイムが発生することがあります。 |
ユーザー クラスタノード | アップグレードでユーザー クラスタ ノードの変更が必要な場合、GKE On-Prem はノードをローリング方式で再作成し、これらのノードで実行されている Pod を再スケジュールします。ワークロードへの影響を防ぐには、適切な PodDisruptionBudgets とアンチ アフィニティ ルールを構成します。 |
ユーザー クラスタのサイズ変更
ユーザー クラスタのサイズ変更に失敗する
- 現象
ユーザー クラスタのサイズ変更操作が失敗します。
- 考えられる原因
サイズ変更操作が失敗する原因はいくつかあります。
- 解決策
サイズ変更が失敗する場合は、次の手順に従います。
クラスタの MachineDeployment ステータスをチェックして、イベントやエラー メッセージがあるかどうかを確認します。
kubectl describe machinedeployments [MACHINE_DEPLOYMENT_NAME]
新しく作成したマシンにエラーがあるかどうかを確認します。
kubectl describe machine [MACHINE_NAME]
エラー: 「アドレスを割り振ることができません」
- 現象
ユーザー クラスタのサイズを変更すると、
kubectl describe machine [MACHINE_NAME]
が次のエラーを表示します。Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning Failed 9s (x13 over 56s) machineipam-controller ipam: no addresses can be allocated
- 考えられる原因
ユーザー クラスタで使用可能な IP アドレスが不足しています。
- 解決策
クラスタに追加の IP アドレスを割り振ります。次に、影響を受けたマシンを削除します。
kubectl delete machine [MACHINE_NAME]
クラスタが正しく構成されている場合は、IP アドレスを使用して代替マシンが作成されます。
十分な数の IP アドレスが割り振られているが、クラスタにマシンを登録できない
- 現象
ネットワークには十分なアドレスが割り振られていますが、ユーザー クラスタへのマシンの登録が失敗します。
- 考えられる原因
IP が競合している可能性があります。対象の IP が別のマシンまたはロードバランサによって使用されている場合があります。
- 解決策
登録に失敗するマシンの IP アドレスが使用されていないことを確認します。競合がある場合は、環境内の競合を解消する必要があります。
vSphere
govc
を使用したデバッグ
vSphere に固有の問題が発生した場合、govc
を使用してトラブルシューティングを行うことができます。たとえば、vCenter ユーザー アカウントの権限とアクセスを簡単に確認し、vSphere ログを収集できます。
vCenter 証明書の変更
vCenter サーバーを評価モードまたはデフォルト設定モードで実行し、TLS 証明書が生成されている場合、その証明書は後で変更されることがあります。証明書が変更された場合は、実行中のクラスタに新しい証明書を通知する必要があります。
新しい vCenter 証明書を取得し、ファイルに保存します。
true | openssl s_client -connect [VCENTER_IP_ADDRESS]:443 -showcerts 2>/dev/null | sed -ne '/-BEGIN/,/-END/p' > vcenter.pem
クラスタごとに、各クラスタの vSphere と vCenter の証明書を含む ConfigMap を削除し、新しい証明書を含む新しい ConfigMap を作成します。例:
kubectl --kubeconfig kubeconfig delete configmap vsphere-ca-certificate -n kube-system
kubectl --kubeconfig kubeconfig delete configmap vsphere-ca-certificate -n user-cluster1
kubectl --kubeconfig kubeconfig create configmap -n user-cluster1 --dry-run vsphere-ca-certificate --from-file=ca.crt=vcenter.pem -o yaml | kubectl --kubeconfig kubeconfig apply -f -
kubectl --kubeconfig kubeconfig create configmap -n kube-system --dry-run vsphere-ca-certificate --from-file=ca.crt=vcenter.pem -o yaml | kubectl --kubeconfig kubeconfig apply -f -
各クラスタの Clusterapi-Controllers Pod を削除します。Pod が再起動すると、新しい証明書の使用が開始されます。例:
kubectl --kubeconfig kubeconfig -n kube-system get pods
kubectl --kubeconfig kubeconfig -n kube-system delete pod clusterapi-controllers-...
その他
Terraform の vSphere プロバイダのセッション数の上限
GKE On-Prem は Terraform の vSphere プロバイダを使用して、vSphere 環境で VM を起動します。プロバイダのセッション数は最大 1,000 です。現在の実装では、使用後にアクティブなセッションが終了しません。実行中のセッションが多すぎると、503 エラーが発生する可能性があります。
セッションは 300 秒後に自動的に終了します。
- 現象
実行中のセッションが多すぎると、次のエラーが発生します。
Error connecting to CIS REST endpoint: Login failed: body: {"type":"com.vmware.vapi.std.errors.service_unavailable","value": {"messages":[{"args":["1000","1000"],"default_message":"Sessions count is limited to 1000. Existing sessions are 1000.", "id":"com.vmware.vapi.endpoint.failedToLoginMaxSessionCountReached"}]}}, status: 503 Service Unavailable
- 考えられる原因
環境内で実行されている Terraform プロバイダのセッションが多すぎます。
- 解決策
現時点で、これは意図したとおりに機能しています。セッションは 300 秒後に自動的に終了します。詳細については、GitHub の問題 #618 をご覧ください。
Docker 用のプロキシの使用: oauth2: cannot fetch token
- 現象
プロキシの使用中に次のエラーが発生します。
oauth2: cannot fetch token: Post https://oauth2.googleapis.com/token: proxyconnect tcp: tls: oversized record received with length 20527
- 考えられる原因
HTTP ではなく HTTPS プロキシを指定した可能性があります。
- 解決策
Docker の構成で、プロキシ アドレスを
https://
ではなくhttp://
に変更します。
ライセンスが有効であることを確認する
特に試用版ライセンスを使用している場合は、ライセンスが有効であることを確認してください。F5、ESXi ホスト、または vCenter ライセンスの有効期限が切れた場合、予期しないエラーが発生することがあります。