セルフホストランナーのトラブルシューティング
このページでは、コンテナランナーとマシンランナーのエラーとトラブルシューティングについて説明します。
コンテナランナー
コンテナランナーを使用する際、下記のようなエラーが発生する場合があります。
ディスク容量が原因でコンテナを起動できない
ディスク容量の不足により Pod へのボリュームマウントが失敗する旨の警告が表示され、タスクは Preparing Environment ステップで停滞します。
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 67s default-scheduler Successfully assigned default/ccita-62e94fd3faccc34751f72803-0-7hrpk8xv to node3
Warning FailedMount 68s kubelet MountVolume.SetUp failed for volume "kube-api-access-52lfn" : write /var/snap/microk8s/common/var/lib/kubelet/pods/4cd5057f-df97-41c4-b5ef-b632ce74bf45/volumes/kubernetes.io~projected/kube-api-access-52lfn/..2022_08_02_16_24_55.1533247998/ca.crt: no space left on device
十分なディスク容量があることを確認してください。
Pod ホストノードがメモリ不足になる
Pod がホストされているノードのメモリが不足すると、タスクが失敗し、 Runner Instance Failure
という名前の失敗ステップと以下のメッセージが表示されます。
could not run task: launch circleci-agent on "container-0" failed: command terminated with exit code 137.
kubectl を使って Kubernetes で表示すると、Pod のステータスは OOMKilled
になります。 タスク Pod の設定を使って、ジョブ自体のメモリーの割り当てを管理できます。
Pod ホストノードのディスク容量が不足する
ノードがいっぱいになると、 node.kuberenetes.io/disk-pressure
という Taint が表示され、新しいタスク Pod をスケジュールできなくなります。 この Pod のすべての有効なノードに同じ Taint またはスケジュールを妨げるその他の条件があると、そのタスク Pod は Taint されていない有効なノードが使用できるようになるまで保留状態になります。 これにより、このジョブが UI の Preparing Environment ステップで停滞しているように見えます。
この状態にならないよう、クラスタをより効果的にスケーリングるする必要があります。
タスクを実行しているノードが突然停止する
コンテナランナーが別の Node でホストされている場合、タイムアウトになるまでタスクは CircleCI UI で実行されているように見えます。 kubectl も、クラスタの liveness Probe のタイムアウトになるまで、Pod を実行中として表示します。 Podは terminating 状態になり、そのまま停滞します。 この時点で、Pod を強制的に削除する必要があります。 強制的に削除しないと、kubectl がハングする場合があります。
kubectl delete pod $POD_NAME --force
イメージに無効なエントリポイントがある
イメージに指定されたエントリポイントが無効な場合、タスクが失敗し、エラーになります。
could not run task: launch circleci-agent on "container-0" failed: command terminated with exit code 139.
コンテナランナーとクラウド版 CircleCI では、 プライマリコンテナ のエントリポイントの設定方法が異なります。 クラウドの場合、プライマリコンテナのエントリポイントは com.circleci.preserve-entrypoint=true LABEL
指示を使用して保持されていない限り無視されます ( エントリポイントの追加 を参照)。 一方コンテナランナーの場合、常にシェル (/bin/sh
) がデフォルト設定されるか、ジョブ設定でエントリポイントが指定されている場合はそれが設定されます。
注: エントリポイントは、失敗せずに最後まで実行される必要があります。 失敗した場合、またはビルドの途中で停止した場合は、ビルドも停止します。 ログまたはビルドステータスにアクセスする必要がある場合は、エントリポイントの代わりにバックグラウンドステップを使用します。
このエラーを減らすには、 エントリポイントの追加 に関するドキュメントに沿ってエントリポイントを指定します。 カスタムビルドされた Docker イメージの使用 に記載されているようにエントリポイントを明示的に設定します。
イメージのアーキテクチャが異なる
ジョブのイメージがデプロイされているノードと異なるアーキテクチャを使用している場合、コンテナランナーはエラーになります。
19:30:12 eb1a4 11412.984ms service-work error=1 error occurred:
* could not start task containers: pod failed to start: :
タスク Pod にはエラーステータスも表示されます。 CircleCI UI で失敗したジョブとしてエラーとともにに表示されます。
could not start task containers: pod failed to start: :
ジョブを使ってノードに使用されている基盤アーキテクチャをジョブで使用されているイメージのアーキテクチャに合わせて修正する必要があります。
タスク Pod の設定が誤っている
リソースクラスのタスク Pod の設定が誤っている場合、タスクは要求されると失敗します。 UI では、このエラーは Runner Instance Failure
ステップに入り、以下のようなメッセージが表示されます。
could not start task containers: error creating task pod: Pod "ccita-62ea7dff36e977580a329a9d-0-uzz1y8xi" is invalid: [spec.containers[0].resources.limits[eppemeral-storage]: Invalid value: "eppemeral-storage": must be a standard resource type or fully qualified, spec.containers[0].resources.limits[eppemeral-storage]: Invalid value: "eppemeral-storage": must be a standard resource for containers, spec.containers[0].resources.requests[eppemeral-storage]: Invalid value: "eppemeral-storage": must be a standard resource type or fully qualified, spec.containers[0].resources.requests[eppemeral-storage]: Invalid value: "eppemeral-storage": must be a standard resource for containers]
Kuberenetes クラスタで Pod が一つも作成されていない タスク Pod の設定を、 コンテナランナー に記載されているように修正する必要があります。
Bash がない
"could not start task containers: exec into build container "container-0" failed: Internal error occurred: error executing command in container: failed to exec in container: failed to start exec "bb04485b9ef2386dee5e44a92bfe512ed786675611b6a518c3d94c1176f9a8aa": OCI runtime exec failed: exec failed: container_linux.go:380: starting container process caused: exec: "/bin/bash": stat /bin/bash: no such file or directory: unknown"
コンテナランナーで実行されるジョブで使用するカスタムイメージには Bash が必要です。
インフラに問題があった場合
もし、「Oops, there was an issue with your infrastructure」というメッセージが表示された場合。 セルフホストランナーのインフラストラクチャが動作していることを確認し、ジョブを再実行してみてください。 それでも問題が解決しない場合は、ジョブのページにある「トラブルシューティングガイド」を参照するか、タスクのライフサイクルステップにコンテンツがない場合(図のような場合)、以下に説明する潜在的な原因を検討する必要があります:
-
Pod の再起動: ワークフローが実行される前後のタイミングでコンテナエージェントの Pod が再起動されていないか確認してください。 Pod がその前後のタイミングで再起動されていた場合、ジョブは処理されません。 その場合、そのジョブをもう一度再実行することを推奨します。
`kubectl logs -n circleci <full pod name> --previous` コマンドにより、それまでのすべての実行のログを確認できます。
-
ネットワーク接続の問題: 特にこの問題が断続的に発生する場合は、コンテナエージェントのネットワーク接続を確認してください。 この問題は、タスクを要求した後にコンテナエージェントがネットワーク接続を失うと発生する場合があります。
kubectl exec --stdin --tty -n circleci < full pod name > — /bin/sh
コマンドを使って Pod に接続し、ping テストを長時間実行することを推奨します。 また、 CircleCI のセルフホストランナーに必要な接続 についてのセクションが含まれる「よく寄せられるご質問」のリンクへの接続を確認することを推奨します。
-
リソースの枯渇: Pod がジョブを終了し、リソースが解放されている可能性があるため、ポッドがクラスタ内のリソース制限に達しているかどうかを確認してください。 リソース制限の設定は、 values.yaml 内で、または config.yaml 内で行うことを推奨します。
リソースの使用量を監視できる外部ツールもあります。 Kubernetes のドキュメント をご覧ください。
マシンランナー
マシンランナーをご使用の際に、下記のようなエラーが発生する可能性があります。
macOS に初めてセルフホストランナーをインストールしましたが、ジョブが "Preparing Environment" の状態でスタックしました。エラーは表示されていません。どうすれば良いですか。
場合によっては、root で実行できるように、ローンチエージェントの実行権限を更新する必要があります。 以下の 2 つのコマンドを実行してください。
sudo chmod +x /opt/circleci/circleci-launch-agent
sudo /opt/circleci/circleci-launch-agent --config=/Library/Preferences/com.circleci.runner/launch-agent-config.yaml
ジョブをキャンセルし、再実行します。 それでもジョブが実行されない場合は、 サポートチケット を送信してください。
SSH 接続でのデバッグ
CircleCI マシンランナーでは、デバッグのために SSH 接続でジョブを再実行することが可能です。 この機能の使用に関する詳細は、 SSH を使用したデバッグをご覧ください。
この SSH 接続によるジョブの再実行 機能は、デフォルトでは無効になっています。 この機能を有効にするには、 CircleCI セルフホストランナーのインストール を参照してください。 SSH 接続によるジョブの再実行は、現在コンテナランナーでは利用できません。 |