第6章 ビルドワーカーを使用した Dockerfile の自動ビルド
Red Hat Quayは、OpenShiftまたはKubernetes上のワーカーノードのセットを使用したDockerfileのビルドをサポートしています。GitHub webhookなどのビルドトリガーを設定することで、新しいコードがコミットされたときに自動的に新しいバージョンのリポジトリをビルドすることができます。このドキュメントでは、Red Hat Quay インストールでビルドを有効にし、Red Hat Quay からのビルドを受け入れるように 1 つまたは複数の OpenShift/K8s クラスタをセットアップする方法を、順を追って説明します。Red Hat Quay 3.4では、Red Hat QuayのPython 2からPython 3への移行の一環として、基盤となるBuild Managerが完全に書き直されました。その結果、Red Hat Quay 3.3以前では継続的に動作していたビルダーノードが、Kubernetesのジョブとして動的に作成されるようになりました。これにより、Red Hat Quayがビルドを管理する方法が大幅に簡素化され、毎日何千ものコンテナイメージビルドを処理するのにquay.ioが利用しているのと同じメカニズムが提供されます。現在、静的なメカニズム(Red Hat Quay 3.3での「Enterprise」ビルダー)を運用しているお客様は、Kubernetesベースのビルドメカニズムに移行する必要があります。
6.1. アーキテクチャーの概要
Red Hat Quay Buildシステムはスケーラビリティを考慮して設計されています(quay.ioにすべてのビルドをホストするために使用されているため)。Red Hat QuayのBuild Managerコンポーネントは、ビルド要求を追跡し、ビルドエクゼキュータ(OpenShift/K8sクラスタ)が各要求を実行することを保証するオーケストレーション層を提供します。各ビルドはKubernetes ジョブによって処理されます。ジョブは、小さな仮想マシンを起動してイメージのビルドプロセスを完全に分離して格納します。これにより、コンテナのビルドが相互に影響したり、基盤となるビルドシステムに影響を与えたりすることはありません。複数のエクゼキュータを設定することで、インフラストラクチャーに障害が発生した場合でも確実にビルドを実行することができます。Red Hat Quay は、あるエクゼキュータが問題を抱えていることを検知すると、自動的に別のエクゼキュータにビルドを送ります。
Red Hat Quayのアップストリームバージョンでは、AWS/EC2ベースのエグゼキュータを設定する方法についての説明があります。この構成は、Red Hat Quay のお客様にはサポートされていません。
6.1.1. ビルドマネージャー
ビルドマネージャーは、スケジュールされたビルドのライフサイクルに責任を持ちます。ビルドキュー、ビルドフェーズ、実行中のジョブの状態を更新する必要がある操作は、ビルドマネージャーが行います。
6.1.2. ビルドワーカーのコントロールプレーン
ビルドのジョブは別々のワーカーノードで実行され、別々のコントロールプレーン(エグゼキュータ)でスケジューリングされます。現在、Red Hat QuayはAWSとKubernetes上でのジョブの実行をサポートしています。ビルドは quay.io/quay/quay-builder を使って実行されます。AWSでは、EC2インスタンス上でビルドがスケジューリングされます。k8sでは、ビルドはジョブリソースとしてスケジューリングされます。
6.1.3. オーケストレーター
オーケストレーターは、現在実行中のビルドジョブの状態を保存し、ビルドマネージャーが消費するイベントを発行するために使用されます(例:期限切れイベント)。現在、サポートされているオーケストレーターのバックエンドはRedisです。