Docker MachineでのオートスケールのためにGitLab Runnerをインストールして登録する
- プラン: Free、Premium、Ultimate
- 提供形態: GitLab.com、GitLab Self-Managed、GitLab Dedicated
Docker Machine ExecutorはGitLab 17.5で非推奨となりました。GitLab 20.0(2027年5月)で削除される予定です。GitLab 20.0まではDocker Machine Executorのサポートが継続されますが、新機能を追加する予定はありません。CI/CDジョブの実行を妨げる可能性のある重大なバグ、または実行コストに影響を与えるバグのみに対処します。Amazon Web Services(AWS)EC2、Microsoft Azure Compute、またはGoogle Compute Engine(GCE)でDocker Machine Executorを使用している場合は、GitLab Runner Autoscalerに移行してください。
オートスケールアーキテクチャの概要については、オートスケールに関する包括的なドキュメントをご覧ください。
Docker Machineのフォークバージョン
DockerではDocker Machineが非推奨になりました。ただしGitLabでは、Docker Machine executorを利用しているGitLab RunnerユーザーのためにDocker Machineフォークを維持しています。このフォークは、docker-machineの最新のmainブランチをベースにしており、次のバグに対する追加パッチがいくつか含まれています:
- DigitalOceanドライバーをRateLimit対応にする
- Googleドライバーオペレーションチェックにバックオフを追加する
- マシン作成のための
--google-min-cpu-platformオプションを追加する - キャッシュされているIPをGoogleドライバーに使用する
- キャッシュされているIPをAWSドライバーに使用する
- Google Compute EngineでGPUを使用するためのサポートを追加する
- IMDSv2でAWSインスタンスを実行するためのサポートを追加する
Docker Machineフォークの目的は、実行コストに影響を与える重大な問題とバグのみを修正することです。新しい機能を追加する予定はありません。
環境を準備する
オートスケール機能を使用するには、DockerとGitLab Runnerが同じマシンにインストールされている必要があります:
- 踏み台サーバーとして機能できる新しいLinuxベースのマシンにサインインします。この踏み台サーバーでDockerが新しいマシンを作成します。
- GitLab Runnerをインストールします。
- Docker MachineフォークからDocker Machineをインストールします。
- オプションですが、オートスケールされたRunnerで使用するプロキシコンテナレジストリとキャッシュサーバーを準備することを推奨します。
GitLab Runnerを設定する
docker-machineとgitlab-runnerを使用するという基本的な概念を理解します:Docker Machineを初めて使用する場合は、Docker Machineドライバーを指定した
docker-machine create ...コマンドを手動で実行する方法が最良の方法です。[runners.machine]セクションのMachineOptionsで設定するオプションを使用して、このコマンドを実行します。この手法ではDocker Machine環境が適切に設定され、指定されたオプションが検証されます。その後にdocker-machine rm [machine_name]でマシンを破棄し、Runnerを起動できます。最初の使用時に実行される
docker-machine createに対する複数の同時リクエストは、適切ではありません。docker+machineexecutorが使用されている場合、Runnerはいくつかの同時docker-machine createコマンドを起動することがあります。Docker Machineがこの環境に初めて導入される場合、各プロセスはDocker API認証のためのSSHキーとSSL証明書の作成を試行します。この動作が原因で、同時実行プロセスが互いに干渉します。これにより、動作しない環境になる可能性があります。そのため、Docker MachineでGitLab Runnerを初めてセットアップするときには、テストマシンを手動で作成することが重要です。- Runnerを登録し、要求されたら
docker+machineexecutorを選択します。 config.tomlを編集し、Docker Machineを使用するようにRunnerを設定します。GitLab Runnerオートスケールに関する詳細情報を記載した専用ページを参照してください。- これで、プロジェクトでパイプラインを新規作成して開始できます。数秒後に
docker-machine lsを実行すると、新しいマシンが作成されていることがわかります。
- Runnerを登録し、要求されたら
GitLab Runnerをアップグレードする
ご使用のオペレーティングシステムがGitLab Runnerを自動的に再起動するように設定されているかどうかを確認します(たとえば、そのサービスファイルを確認します):
設定されている場合は、サービスマネージャーが
SIGQUITを使用するように設定されていることを確認し、サービスツールを使用してプロセスを停止します:# For systemd sudo systemctl stop gitlab-runner # For upstart sudo service gitlab-runner stop設定されていない場合は、プロセスを手動で停止できます:
sudo killall -SIGQUIT gitlab-runner
SIGQUITシグナルを送信すると、プロセスが正常に停止します。プロセスは新しいジョブの受け入れを停止し、現在のジョブが完了すると直ちに終了します。GitLab Runnerが終了するまで待ちます。
gitlab-runner statusでその状態を確認するか、正常なシャットダウンが行われるまで最大30分間待つことができます:for i in `seq 1 180`; do # 1800 seconds = 30 minutes gitlab-runner status || break sleep 10 doneこれで、ジョブを中断することなく、新しいバージョンのGitLab Runnerを安全にインストールできます。
Docker Machineのフォークバージョンを使用する
インストール
適切な
docker-machineバイナリをダウンロードします。PATHがアクセスできる場所にバイナリをコピーし、実行可能にします。たとえば、v0.16.2-gitlab.40をダウンロードしてインストールするには、次のようにします:curl -O "https://gitlab-docker-machine-downloads.s3.amazonaws.com/v0.16.2-gitlab.40/docker-machine-Linux-x86_64" cp docker-machine-Linux-x86_64 /usr/local/bin/docker-machine chmod +x /usr/local/bin/docker-machine
Google Compute EngineでGPUを使用する
GPUはすべてのexecutorでサポートされています。GPUサポートのためだけにDocker Machineを使用する必要はありません。Docker Machine ExecutorはGPUノードをスケールアップおよびスケールダウンします。この目的でKubernetes executorを使用することもできます。
Docker Machineフォークを使用して、GPU(グラフィックスプロセッシングユニット)を使用するGoogle Compute Engineインスタンスを作成できます。
Docker Machine GPUオプション
GPUを使用するインスタンスを作成するには、次のDocker Machineオプションを使用します:
| オプション | 例 | 説明 |
|---|---|---|
--google-accelerator | type=nvidia-tesla-p4,count=1 | インスタンスにアタッチするGPUアクセラレータのタイプと数を指定します(type=TYPE,count=N形式)。 |
--google-maintenance-policy | TERMINATE | Google CloudではGPUインスタンスのライブ移行が許可されていないため、常にTERMINATEを使用してください。 |
--google-machine-image | https://www.googleapis.com/compute/v1/projects/deeplearning-platform-release/global/images/family/tf2-ent-2-3-cu110 | GPU対応オペレーティングシステムのURL。使用可能なイメージのリストを参照してください。 |
--google-metadata | install-nvidia-driver=True | このフラグは、NVIDIA GPUドライバーをインストールするようにイメージに指示します。 |
これらの引数は、gcloud computeのコマンドライン引数にマップされます。詳細については、GPUがアタッチされたVMの作成に関するGoogleドキュメントを参照してください。
Docker Machineオプションを検証する
システムを準備し、Google Compute EngineでGPUを作成できることをテストするには、次の手順に従います:
Docker MachineのGoogle Compute Engineドライバー認証情報をセットアップします。場合によっては、VMにデフォルトのサービスアカウントがないときに環境変数をRunnerにエクスポートする必要があります。その方法は、Runnerの起動方法によって異なります。たとえば、次のいずれかを使用します:
systemdまたはupstart: カスタム環境変数の設定に関するドキュメントを参照してください。- Helmチャートを使用したKubernetes:
values.yamlエントリを更新します。 - Docker:
-eオプションを使用します(docker run -e GOOGLE_APPLICATION_CREDENTIALS=/path/to/credentials.json gitlab/gitlab-runnerなど)。
必要なオプションを指定した
docker-machineが仮想マシンを作成できることを確認します。たとえば、1つのNVIDIA Tesla P4アクセラレータを備えたn1-standard-1マシンを作成するには、test-gpuを名前で置き換えて、次のように実行します:docker-machine create --driver google --google-project your-google-project \ --google-disk-size 50 \ --google-machine-type n1-standard-1 \ --google-accelerator type=nvidia-tesla-p4,count=1 \ --google-maintenance-policy TERMINATE \ --google-machine-image https://www.googleapis.com/compute/v1/projects/deeplearning-platform-release/global/images/family/tf2-ent-2-3-cu110 \ --google-metadata "install-nvidia-driver=True" test-gpuGPUがアクティブであることを確認するには、マシンにSSHで接続し、
nvidia-smiを実行します:$ docker-machine ssh test-gpu sudo nvidia-smi +-----------------------------------------------------------------------------+ | NVIDIA-SMI 450.51.06 Driver Version: 450.51.06 CUDA Version: 11.0 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |===============================+======================+======================| | 0 Tesla P4 Off | 00000000:00:04.0 Off | 0 | | N/A 43C P0 22W / 75W | 0MiB / 7611MiB | 3% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=============================================================================| | No running processes found | +-----------------------------------------------------------------------------+費用を節約するために、このテストインスタンスを削除します:
docker-machine rm test-gpu
GitLab Runnerを設定する
これらのオプションを検証したら、
runners.docker設定で使用可能なすべてのGPUを使用するようにDocker executorを設定します。次に、GitLab Runnerrunners.machine設定のMachineOptions設定にDocker Machineオプションを追加します。次に例を示します:[runners.docker] gpus = "all" [runners.machine] MachineOptions = [ "google-project=your-google-project", "google-disk-size=50", "google-disk-type=pd-ssd", "google-machine-type=n1-standard-1", "google-accelerator=count=1,type=nvidia-tesla-p4", "google-maintenance-policy=TERMINATE", "google-machine-image=https://www.googleapis.com/compute/v1/projects/deeplearning-platform-release/global/images/family/tf2-ent-2-3-cu110", "google-metadata=install-nvidia-driver=True" ]
トラブルシューティング
Docker Machine executorを使用するときに次の問題が発生する可能性があります。
エラー: マシンの作成エラー
Docker Machineをインストールするときに、ERROR: Error creating machine: Error running provisioning: error installing dockerというエラーが発生することがあります。
Docker Machineは次のスクリプトを使用して、新しくプロビジョニングされた仮想マシンへのDockerのインストールを試行します:
if ! type docker; then curl -sSL "https://get.docker.com" | sh -; fidockerコマンドが成功した場合、Docker MachineはDockerがインストールされたとみなして続行します。
成功しなかった場合、Docker Machineはhttps://get.docker.comでスクリプトをダウンロードして実行しようとします。インストールが失敗する場合は、オペレーティングシステムがDockerでサポートされなくなった可能性があります。
この問題を解決するには、GitLab Runnerがインストールされている環境でMACHINE_DEBUG=trueを設定して、Docker Machineでデバッグを有効にできます。
エラー: Dockerデーモンに接続できない
ジョブは、準備段階で次のエラーメッセージで失敗することがあります:
Preparing environment
ERROR: Job failed (system failure): prepare environment: Cannot connect to the Docker daemon at tcp://10.200.142.223:2376. Is the docker daemon running? (docker.go:650:120s). Check https://docs.gitlab.com/runner/shells/#shell-profile-loading for more informationこのエラーは、Docker Machine executorによって作成されたVMで、Dockerデーモンが予期されている時間内に起動できなかった場合に発生します。この問題を修正するには、[runners.docker]セクションのwait_for_services_timeoutの値を大きくします。