16.3. OpenShift を使用した Red Hat Quay ビルダー環境の作成
16.3.1. OpenShift TLS コンポーネント
tls
コンポーネントを使用すると、TLS 設定を制御できます。
TLS コンポーネントが Operator によって管理されていると、Red Hat Quay 3.7 はビルダーをサポートしません。
tls
を unmanaged
に設定する場合は、独自の ssl.cert
ファイルと ssl.key
ファイルを提供します。このとき、クラスターでビルダーをサポートする場合は、Quay ルートとビルダールート名の両方を証明書の SAN リストに追加するか、ワイルドカードを使用する必要があります。ビルダールートを追加するには、次の形式を使用します。
[quayregistry-cr-name]-quay-builder-[ocp-namespace].[ocp-domain-name]:443
16.3.2. OpenShift Container Platform ビルダー向けの Red Hat Quay の使用
次の手順では、Red Hat Quay にビルダー機能を実装する方法について説明します。
前提条件
- ビルダーには SSL 証明書が必要です。詳細については、Red Hat Quay コンテナーへの TLS 証明書の追加 を参照してください。
- AWS S3 ストレージを使用している場合は、ビルダーを実行する前に、AWS コンソールでストレージバケットを変更する必要があります。必要なパラメーターについては、次のセクションの AWS S3 ストレージバケットの変更を参照してください。
- この手順は、クラスターが既にプロビジョニングされており、Quay Operator が実行されていることを前提としています。
- この手順は、OpenShift Container Platform で仮想 namespace を設定するためのものです。
16.3.2.1. 仮想ビルダー向けの OpenShift Container Platform の準備
- クラスター管理者アカウントを使用して、Red Hat Quay クラスターにログインします。
仮想ビルダーが実行される新しいプロジェクトを作成します (例:
virtual-builders
)。$ oc new-project virtual-builders
ビルドの実行に使用する
ServiceAccount
をこのProject
に作成します。$ oc create sa -n virtual-builders quay-builder
作成したサービスアカウントに編集権限を付与して、ビルドを実行できるようにします。
$ oc adm policy -n virtual-builders add-role-to-user edit system:serviceaccount:virtual-builders:quay-builder
Quay ビルダーに
anyuid scc
権限を付与します。$ oc adm policy -n virtual-builders add-scc-to-user anyuid -z quay-builder
注記このアクションには、クラスター管理者特権が必要です。非特権ビルドまたはルートレスビルドを機能させるには、ビルダーを Podman ユーザーとして実行する必要があるため、これが必要です。
Quay ビルダーサービスアカウントのトークンを取得します。
OpenShift Container Platform 4.10 以前のバージョンを使用している場合は、以下のコマンドを入力します。
oc sa get-token -n virtual-builders quay-builder
OpenShift Container Platform 4.11 以降を使用している場合は、以下のコマンドを入力します。
$ oc create token quay-builder -n virtual-builders
出力例
eyJhbGciOiJSUzI1NiIsImtpZCI6IldfQUJkaDVmb3ltTHZ0dGZMYjhIWnYxZTQzN2dJVEJxcDJscldSdEUtYWsifQ...
ビルダールートを決定します。
$ oc get route -n quay-enterprise
出力例
NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD ... example-registry-quay-builder example-registry-quay-builder-quay-enterprise.apps.docs.quayteam.org example-registry-quay-app grpc edge/Redirect None ...
拡張子が .crt の自己署名 SSL 証明書を生成します。
$ oc extract cm/kube-root-ca.crt -n openshift-apiserver ca.crt
$ mv ca.crt extra_ca_cert_build_cluster.crt
コンソールで設定バンドルのシークレットを見つけ、Actions
Edit Secret を選択して、適切なビルダー設定を追加します。 FEATURE_USER_INITIALIZE: true BROWSER_API_CALLS_XHR_ONLY: false SUPER_USERS: - <superusername> FEATURE_USER_CREATION: false FEATURE_QUOTA_MANAGEMENT: true FEATURE_BUILD_SUPPORT: True BUILDMAN_HOSTNAME: <sample_build_route> 1 BUILD_MANAGER: - ephemeral - ALLOWED_WORKER_COUNT: 1 ORCHESTRATOR_PREFIX: buildman/production/ JOB_REGISTRATION_TIMEOUT: 3600 2 ORCHESTRATOR: REDIS_HOST: <sample_redis_hostname> 3 REDIS_PASSWORD: "" REDIS_SSL: false REDIS_SKIP_KEYSPACE_EVENT_SETUP: false EXECUTORS: - EXECUTOR: kubernetesPodman NAME: openshift BUILDER_NAMESPACE: <sample_builder_namespace> 4 SETUP_TIME: 180 MINIMUM_RETRY_THRESHOLD: BUILDER_CONTAINER_IMAGE: <sample_builder_container_image> 5 # Kubernetes resource options K8S_API_SERVER: <sample_k8s_api_server> 6 K8S_API_TLS_CA: <sample_crt_file> 7 VOLUME_SIZE: 8G KUBERNETES_DISTRIBUTION: openshift CONTAINER_MEMORY_LIMITS: 300m 8 CONTAINER_CPU_LIMITS: 1G 9 CONTAINER_MEMORY_REQUEST: 300m 10 CONTAINER_CPU_REQUEST: 1G 11 NODE_SELECTOR_LABEL_KEY: "" NODE_SELECTOR_LABEL_VALUE: "" SERVICE_ACCOUNT_NAME: <sample_service_account_name> SERVICE_ACCOUNT_TOKEN: <sample_account_token> 12
- 1
- ビルドルートは、Open Shift Operators namespace の名前で
oc get route -n
を実行することにより取得されます。たとえば、ポートはルートの最後に指定する必要があり、[quayregistry-cr-name]-quay-builder-[ocp-namespace].[ocp-domain-name]:443
の形式に従う必要があります。 - 2
JOB_REGISTRATION_TIMEOUT
パラメーターの設定が低すぎると、failed to register job to build manager: rpc error: code = Unauthenticated desc = Invalid build token: Signature has expired
エラーが発生する可能性があります。このパラメーターは少なくとも 240 に設定することをお勧めします。- 3
- Redis ホストにパスワードまたは SSL 証明書がある場合は、それに応じて更新する必要があります。
- 4
- 仮想ビルダーの namespace の名前と一致するように設定します (例:
virtual-builders
)。 - 5
- 早期アクセスの場合、
BUILDER_CONTAINER_IMAGE
は現在quay.io/projectquay/quay-builder:3.7.0-rc.2
です。ただし、早期アクセス期間中に変更される可能性があります。このような事態が発生した場合は、お客様に注意を促します。 - 6
oc cluster-info
を実行して取得します。- 7
- カスタム CA 証明書を手動で作成して追加する必要があります (例
K8S_API_TLS_CA: /conf/stack/extra_ca_certs/build_cluster.crt
)。 - 8
- 指定しない場合、デフォルトは 5120Mi です。
- 9
- 仮想ビルドの場合は、クラスターに十分なリソースがあることを確認する必要があります。指定しない場合、デフォルトは 1000m です。
- 10
- 指定しない場合、デフォルトは 3968Mi です。
- 11
- 指定しない場合、デフォルトは 500m です。
- 12
oc create sa
の実行時に取得されます。
サンプル設定
FEATURE_USER_INITIALIZE: true BROWSER_API_CALLS_XHR_ONLY: false SUPER_USERS: - quayadmin FEATURE_USER_CREATION: false FEATURE_QUOTA_MANAGEMENT: true FEATURE_BUILD_SUPPORT: True BUILDMAN_HOSTNAME: example-registry-quay-builder-quay-enterprise.apps.docs.quayteam.org:443 BUILD_MANAGER: - ephemeral - ALLOWED_WORKER_COUNT: 1 ORCHESTRATOR_PREFIX: buildman/production/ JOB_REGISTRATION_TIMEOUT: 3600 ORCHESTRATOR: REDIS_HOST: example-registry-quay-redis REDIS_PASSWORD: "" REDIS_SSL: false REDIS_SKIP_KEYSPACE_EVENT_SETUP: false EXECUTORS: - EXECUTOR: kubernetesPodman NAME: openshift BUILDER_NAMESPACE: virtual-builders SETUP_TIME: 180 MINIMUM_RETRY_THRESHOLD: BUILDER_CONTAINER_IMAGE: quay.io/projectquay/quay-builder:3.7.0-rc.2 # Kubernetes resource options K8S_API_SERVER: api.docs.quayteam.org:6443 K8S_API_TLS_CA: /conf/stack/extra_ca_certs/build_cluster.crt VOLUME_SIZE: 8G KUBERNETES_DISTRIBUTION: openshift CONTAINER_MEMORY_LIMITS: 1G CONTAINER_CPU_LIMITS: 1080m CONTAINER_MEMORY_REQUEST: 1G CONTAINER_CPU_REQUEST: 580m NODE_SELECTOR_LABEL_KEY: "" NODE_SELECTOR_LABEL_VALUE: "" SERVICE_ACCOUNT_NAME: quay-builder SERVICE_ACCOUNT_TOKEN: "eyJhbGciOiJSUzI1NiIsImtpZCI6IldfQUJkaDVmb3ltTHZ0dGZMYjhIWnYxZTQzN2dJVEJxcDJscldSdEUtYWsifQ"
16.3.2.2. SSL 証明書を手動で追加
- 設定ツールの既知の問題のため、ビルダーを適切に実行するには、カスタム SSL 証明書を手動で追加する必要があります。次の手順を使用して、カスタム SSL 証明書を手動で追加します。SSL 証明書の作成の詳細については、Red Hat Quay コンテナーへの TLS 証明書の追加 を参照してください。
16.3.2.2.1. 証明書を作成して署名
認証局を作成し、証明書に署名します。詳細については、認証局の作成と証明書への署名 を参照してください。
注記-
Quay レジストリーの URL に
alt_name
を追加します。 -
config.yaml で指定されている
BUILDMAN_HOSTNAME
にalt_name
を追加します。
openssl.cnf
[req] req_extensions = v3_req distinguished_name = req_distinguished_name [req_distinguished_name] [ v3_req ] basicConstraints = CA:FALSE keyUsage = nonRepudiation, digitalSignature, keyEncipherment subjectAltName = @alt_names [alt_names] DNS.1 = example-registry-quay-quay-enterprise.apps.docs.quayteam.org DNS.2 = example-registry-quay-builder-quay-enterprise.apps.docs.quayteam.org
サンプルコマンド
$ openssl genrsa -out rootCA.key 2048 $ openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.pem $ openssl genrsa -out ssl.key 2048 $ openssl req -new -key ssl.key -out ssl.csr $ openssl x509 -req -in ssl.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out ssl.cert -days 356 -extensions v3_req -extfile openssl.cnf
-
Quay レジストリーの URL に
16.3.2.2.2. TLS をアンマネージドに設定
Quay Registry yaml で、kind: tls
を managed: false
に設定します。
- kind: tls managed: false
イベントでは、適切な設定をするまで、変更がブロックされていることがわかります。
- lastTransitionTime: '2022-03-28T12:56:49Z' lastUpdateTime: '2022-03-28T12:56:49Z' message: >- required component `tls` marked as unmanaged, but `configBundleSecret` is missing necessary fields reason: ConfigInvalid status: 'True'
16.3.2.2.3. 一時的なシークレットの作成
CA 証明書のデフォルトの namespace にシークレットを作成します。
$ oc create secret generic -n quay-enterprise temp-crt --from-file extra_ca_cert_build_cluster.crt
ssl.key ファイルおよび ssl.cert ファイルのデフォルトの namespace にシークレットを作成します。
$ oc create secret generic -n quay-enterprise quay-config-ssl --from-file ssl.cert --from-file ssl.key
16.3.2.2.4. シークレットデータを config.yaml にコピー
-
コンソール UI の Workloads
Secrets で新しいシークレットを見つけます。 シークレットごとに、YAML ビューを見つけます。
kind: Secret apiVersion: v1 metadata: name: temp-crt namespace: quay-enterprise uid: a4818adb-8e21-443a-a8db-f334ace9f6d0 resourceVersion: '9087855' creationTimestamp: '2022-03-28T13:05:30Z' ... data: extra_ca_cert_build_cluster.crt: >- LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURNakNDQWhxZ0F3SUJBZ0l.... type: Opaque
kind: Secret apiVersion: v1 metadata: name: quay-config-ssl namespace: quay-enterprise uid: 4f5ae352-17d8-4e2d-89a2-143a3280783c resourceVersion: '9090567' creationTimestamp: '2022-03-28T13:10:34Z' ... data: ssl.cert: >- LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVaakNDQTA2Z0F3SUJBZ0lVT... ssl.key: >- LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcFFJQkFBS0NBUUVBc... type: Opaque
UI で、またはコマンドラインから次のようなコマンドを実行して、Quay Registry 設定バンドルのシークレットを見つけます。
$ oc get quayregistries.quay.redhat.com -o jsonpath="{.items[0].spec.configBundleSecret}{'\n'}" -n quay-enterprise
OpenShift コンソールで、設定バンドルシークレットの YAML タブを選択し、作成した 2 つのシークレットからデータを追加します。
kind: Secret apiVersion: v1 metadata: name: init-config-bundle-secret namespace: quay-enterprise uid: 4724aca5-bff0-406a-9162-ccb1972a27c1 resourceVersion: '4383160' creationTimestamp: '2022-03-22T12:35:59Z' ... data: config.yaml: >- RkVBVFVSRV9VU0VSX0lOSVRJQUxJWkU6IHRydWUKQlJ... extra_ca_cert_build_cluster.crt: >- LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURNakNDQWhxZ0F3SUJBZ0ldw.... ssl.cert: >- LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVaakNDQTA2Z0F3SUJBZ0lVT... ssl.key: >- LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcFFJQkFBS0NBUUVBc... type: Opaque
Save をクリックします。Pod が再起動していることを確認する必要があります。
$ oc get pods -n quay-enterprise
出力例
NAME READY STATUS RESTARTS AGE ... example-registry-quay-app-6786987b99-vgg2v 0/1 ContainerCreating 0 2s example-registry-quay-app-7975d4889f-q7tvl 1/1 Running 0 5d21h example-registry-quay-app-7975d4889f-zn8bb 1/1 Running 0 5d21h example-registry-quay-app-upgrade-lswsn 0/1 Completed 0 6d1h example-registry-quay-config-editor-77847fc4f5-nsbbv 0/1 ContainerCreating 0 2s example-registry-quay-config-editor-c6c4d9ccd-2mwg2 1/1 Running 0 5d21h example-registry-quay-database-66969cd859-n2ssm 1/1 Running 0 6d1h example-registry-quay-mirror-764d7b68d9-jmlkk 1/1 Terminating 0 5d21h example-registry-quay-mirror-764d7b68d9-jqzwg 1/1 Terminating 0 5d21h example-registry-quay-redis-7cc5f6c977-956g8 1/1 Running 0 5d21h
Quay レジストリーが再設定されたら、Quay アプリ Pod が実行されていることを確認します。
$ oc get pods -n quay-enterprise
出力例
example-registry-quay-app-6786987b99-sz6kb 1/1 Running 0 7m45s example-registry-quay-app-6786987b99-vgg2v 1/1 Running 0 9m1s example-registry-quay-app-upgrade-lswsn 0/1 Completed 0 6d1h example-registry-quay-config-editor-77847fc4f5-nsbbv 1/1 Running 0 9m1s example-registry-quay-database-66969cd859-n2ssm 1/1 Running 0 6d1h example-registry-quay-mirror-758fc68ff7-5wxlp 1/1 Running 0 8m29s example-registry-quay-mirror-758fc68ff7-lbl82 1/1 Running 0 8m29s example-registry-quay-redis-7cc5f6c977-956g8 1/1 Running 0 5d21h
ブラウザーで、レジストリーエンドポイントにアクセスし、証明書が適切に更新されていることを確認します。
Common Name (CN) example-registry-quay-quay-enterprise.apps.docs.quayteam.org Organisation (O) DOCS Organisational Unit (OU) QUAY
16.3.2.3. UI を使用してビルドトリガーを作成
- Quay リポジトリーにログインします。
-
Create New Repository をクリックして、
testrepo
などの新しいレジストリーを作成します。 Repositories ページで、左側のペインの Builds タブをクリックします。または、対応する URL を直接使用します。次に例を示します。
https://example-registry-quay-quay-enterprise.apps.docs.quayteam.org/repository/quayadmin/testrepo?tab=builds
重要場合によっては、ビルダーでホスト名の解決に問題が発生することがあります。この問題は、ジョブオブジェクトで
default
に設定されているdnsPolicy
に関連している可能性があります。現在、この問題に対する回避策はありません。これは、Red Hat Quay の将来のバージョンで解決される予定です。-
Create Build Trigger
Custom Git Repository Push をクリックします。 Git リポジトリーのクローン作成に使用する HTTPS または SSH スタイルの URL を入力し、Continue をクリックします。以下に例を示します。
https://github.com/gabriel-rh/actions_test.git
- Tag manifest with the branch or tag name を確認し、Continue をクリックします。
-
トリガーが呼び出されたときにビルドする Dockerfile の場所 (たとえば
/Dockerfile
) を入力し、Continue をクリックします。 -
Docker ビルドのコンテキストの場所 (たとえば
/
) を入力し、Continue をクリックします。 - 必要に応じて、ロボットアカウントを作成します。それ以外の場合は、Continue をクリックします。
- Continue をクリックして、パラメーターを確認します。
- Builds ページで、トリガー名の Options アイコンをクリックし、Run Trigger Now をクリックします。
- Git リポジトリーからコミット SHA を入力し、Start Build をクリックします。
ビルドのステータスを確認するには、Build History ページで commit をクリックするか、
oc get pods -n virtual-builders
を実行します。$ oc get pods -n virtual-builders NAME READY STATUS RESTARTS AGE f192fe4a-c802-4275-bcce-d2031e635126-9l2b5-25lg2 1/1 Running 0 7s
$ oc get pods -n virtual-builders NAME READY STATUS RESTARTS AGE f192fe4a-c802-4275-bcce-d2031e635126-9l2b5-25lg2 1/1 Terminating 0 9s
$ oc get pods -n virtual-builders No resources found in virtual-builders namespace.
ビルドが完了したら、左側のペインのタグで Tags のステータスを確認できます。
注記早期アクセスにより、完全なビルドログとビルドのタイムスタンプは現在利用できません。
16.3.2.4. AWS S3 ストレージバケットの変更
AWS S3 ストレージを使用している場合は、ビルダーを実行する前に、AWS コンソールでストレージバケットを変更する必要があります。
- s3.console.aws.com で AWS コンソールにログインします。
-
検索バーで
S3
を検索し、S3 をクリックします。 -
バケットの名前 (
myawsbucket
など) をクリックします。 - Permissions タブをクリックします。
Cross-origin resource sharing (CORS) の下に、次のパラメーターを含めます。
[ { "AllowedHeaders": [ "Authorization" ], "AllowedMethods": [ "GET" ], "AllowedOrigins": [ "*" ], "ExposeHeaders": [], "MaxAgeSeconds": 3000 }, { "AllowedHeaders": [ "Content-Type", "x-amz-acl", "origin" ], "AllowedMethods": [ "PUT" ], "AllowedOrigins": [ "*" ], "ExposeHeaders": [], "MaxAgeSeconds": 3000 } ]