5.2. OpenShift Container Platform を使用した Red Hat Quay ビルダー環境の作成
このセクションの手順では、OpenShift Container Platform で Red Hat Quay 仮想ビルダー環境を作成する方法を説明します。
5.2.1. OpenShift Container Platform TLS コンポーネント
tls
コンポーネントを使用すると、TLS 設定を制御できます。
TLS コンポーネントが Operator によって管理されている場合、Red Hat Quay 3 はビルダーをサポートしません。
tls
を unmanaged
に設定する場合は、独自の ssl.cert
ファイルと ssl.key
ファイルを提供します。このとき、クラスターでビルダーをサポートする場合は、Quay ルートとビルダールート名の両方を証明書の SAN リストに追加するか、ワイルドカードを使用する必要があります。
ビルダールートを追加するには、次の形式を使用します。
[quayregistry-cr-name]-quay-builder-[ocp-namespace].[ocp-domain-name]:443
5.2.2. OpenShift Container Platform ビルダー向けの Red Hat Quay の使用
ビルダーには SSL/TLS 証明書が必要です。SSL/TLS 証明書の詳細は Red Hat Quay コンテナーへの TLS 証明書の追加 を参照してください。
Amazon Webservice (AWS) S3 ストレージを使用している場合は、ビルダーを実行する前に、AWS コンソールでストレージバケットを変更する必要があります。必要なパラメーターは、次のセクションの AWS S3 ストレージバケットの変更を参照してください。
5.2.2.1. 仮想ビルダー向けの OpenShift Container Platform の準備
以下の手順を使用して、Red Hat Quay 仮想ビルダー用に OpenShift Container Platform を準備します。
- この手順は、クラスターがすでにプロビジョニングされており、Quay Operator が実行されていることを前提とします。
- この手順は、OpenShift Container Platform で仮想 namespace を設定するためのものです。
手順
- クラスター管理者アカウントを使用して Red Hat Quay クラスターにログインします。
次のコマンドを実行して、仮想ビルダーが実行される新しいプロジェクト (
virtual-builders
など) を作成します。$ oc new-project virtual-builders
次のコマンドを入力して、ビルドの実行に使用されるプロジェクトに
ServiceAccount
を作成します。$ 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
注記トークンの有効期限が切れたら、新しいトークンを要求する必要があります。必要に応じて、カスタムの有効期限を追加することもできます。たとえば、トークンを 2 週間保持するには、
--duration 20160m
と指定します。出力例
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/TlS 証明書を生成します。
$ oc extract cm/kube-root-ca.crt -n openshift-apiserver
出力例
ca.crt
次のコマンドを入力して、
ca.crt
ファイルの名前をextra_ca_cert_build_cluster.crt
に変更します。$ mv ca.crt extra_ca_cert_build_cluster.crt
Console で設定バンドルのシークレットを見つけ、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: 0 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/TLS 証明書がある場合は、それに応じて更新する必要があります。
- 4
- 仮想ビルダーの namespace の名前と一致するように設定します (例:
virtual-builders
)。 - 5
- 早期アクセスの場合、
BUILDER_CONTAINER_IMAGE
は現在quay.io/projectquay/quay-builder:3.7.0-rc.2
です。ただし、早期アクセス期間中に変更される可能性があります。これが発生した場合は、顧客に警告が表示されます。 - 6
K8S_API_SERVER
は、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: 0 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"
5.2.2.2. SSL/TLS 証明書の手動追加
設定ツールの既知の問題のため、ビルダーを適切に実行するには、カスタム SSL/TLS 証明書を手動で追加する必要があります。次の手順を使用して、カスタム SSL/TLS 証明書を手動で追加します。
SSL/TLS 証明書の作成の詳細は、Red Hat Quay コンテナーへの TLS 証明書の追加 を参照してください。
5.2.2.2.1. 証明書の作成と署名
SSL/TLS 証明書を作成して署名するには、次の手順を実行します。
手順
認証局を作成し、証明書に署名します。詳細は、認証局の作成と証明書への署名 を参照してください。
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 1 DNS.2 = example-registry-quay-builder-quay-enterprise.apps.docs.quayteam.org 2
サンプルコマンド
$ 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
5.2.2.2.2. TLS の管理対象外への設定
次の手順を使用して、king:tls
を管理対象外に設定します。
手順
Red Hat Quay Registry YAML で、
kind: tls
をmanaged: false
に設定します。- kind: tls managed: false
Events ページでは、適切な
config.yaml
ファイルを設定するまで変更がブロックされます。以下に例を示します。- 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'
5.2.2.2.3. 一時的なシークレットの作成
次の手順を使用して、CA 証明書の一時的なシークレットを作成します。
手順
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
5.2.2.2.4. シークレットデータの設定 YAML へのコピー
次の手順を使用して、シークレットデータを 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 で Red Hat Quay レジストリー設定バンドルのシークレットを見つけるか、以下のようなコマンドを実行してコマンドラインから見つけます。
$ oc get quayregistries.quay.redhat.com -o jsonpath="{.items[0].spec.configBundleSecret}{'\n'}" -n quay-enterprise
OpenShift Container Platform コンソールで、設定バンドルのシークレットの 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
Red Hat Quay レジストリーが再設定されたら、次のコマンドを入力して、Red Hat 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
5.2.2.3. UI を使用してビルドトリガーを作成
UI を使用してビルドトリガーを作成するには、次の手順に従います。
手順
- Red Hat 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 のステータスを確認できます。
注記早期アクセスにより、完全なビルドログとビルドのタイムスタンプは現在利用できません。
5.2.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 } ]
5.2.2.5. Google Cloud Platform オブジェクトバケットの変更
現在、Google Cloud Platform オブジェクトバケットの変更は、IBM Power および IBM Z ではサポートされていません。
仮想ビルダーの Cross Origin Resource Sharing (CORS) を設定するには、次の手順を実行します。
CORS 設定がないと、ビルド Dockerfile のアップロードは失敗します。
手順
次のリファレンスを使用して、特定の CORS ニーズに合わせた JSON ファイルを作成します。以下に例を示します。
$ cat gcp_cors.json
出力例
[ { "origin": ["*"], "method": ["GET"], "responseHeader": ["Authorization"], "maxAgeSeconds": 3600 }, { "origin": ["*"], "method": ["PUT"], "responseHeader": [ "Content-Type", "x-goog-acl", "origin"], "maxAgeSeconds": 3600 } ]
次のコマンドを入力して、GCP ストレージバケットを更新します。
$ gcloud storage buckets update gs://<bucket_name> --cors-file=./gcp_cors.json
出力例
Updating Completed 1
次のコマンドを実行すると、GCP バケットの更新された CORS 設定を表示できます。
$ gcloud storage buckets describe gs://<bucket_name> --format="default(cors)"
出力例
cors: - maxAgeSeconds: 3600 method: - GET origin: - '*' responseHeader: - Authorization - maxAgeSeconds: 3600 method: - PUT origin: - '*' responseHeader: - Content-Type - x-goog-acl - origin