第3章 Red Hat Quay on OpenShift Container Platform を使用したベアメタルビルド
このセクションの手順では、OpenShift Container Platform 上で Red Hat Quay の ベアメタルビルド 環境を作成する方法を説明します。
3.1. Red Hat Quay on OpenShift Container Platform のベアメタルビルドの設定
Red Hat Quay on OpenShift Container Platform の ベアメタルビルド を設定するには、次の手順に従います。
QuayRegistry
CRD でマネージド route
コンポーネントを使用して Red Hat Quay Operator on OpenShift Container Platform を使用している場合は、「自己管理 ルート を使用した Red Hat Quay on OpenShift Container Platform ビルド 制限」を参照してください。
前提条件
- Red Hat Quay Operator が実行されている状態でプロビジョニングされた OpenShift Container Platform クラスターがある。
-
tls
コンポーネントをunmanaged
に設定し、カスタム SSL/TLS 証明書を Red Hat Quay Operator にアップロードしている。詳細は、Red Hat Quay の SSL および TLS を参照してください。 - クラスター管理者として OpenShift Container Platform にログインしている。
手順
ビルドが実行されるプロジェクト (例:
bare-metal-builder
) を作成するには、次のコマンドを入力します。$ oc new-project bare-metal-builder
次のコマンドを入力して、
bare-metal-builder
namespace に新しいServiceAccount
を作成します。$ oc create sa -n bare-metal-builder quay-builder
次のコマンドを入力して、ユーザーに
bare-metal-builder
namespace 内でのedit
ロールを付与します。$ oc policy add-role-to-user -n bare-metal-builder edit system:serviceaccount:bare-metal-builder:quay-builder
次のコマンドを入力して、
bare-metal-builder
namespace のquay-builder
サービスアカウントに関連付けられたトークンを取得します。このトークンは、OpenShift Container Platform クラスターの API サーバーの認証と対話に使用されます。OpenShift Container Platform クラスターのバージョンが 4.11 以上の場合は、次のコマンドを入力します。
oc create token quay-builder -n bare-metal-builder --duration 24h
OpenShift Container Platform クラスターがバージョン 4.11 より前 (たとえばバージョン 4.10) の場合は、次のコマンドを入力します。
$ oc sa get-token -n bare-metal-builder quay-builder
- OpenShift Container Platform クラスターの API サーバーの URL を特定します。これは、OpenShift Container Platform Web コンソールで確認できます。
ビルドジョブ をスケジュールするときに使用するワーカーノードラベルを識別します。ビルド Pod はベアメタルワーカーノード上で実行する必要があるため、これらは通常、特定のラベルで識別されます。
どのノードラベルを使用すべきかは、クラスター管理者に確認してください。
Red Hat Quay の追加証明書に追加するには、Kube API Server の認証局 (CA) を取得します。
OpenShift Container Platform バージョン 4.15 以降では、次のコマンドを入力して、CA を含むシークレットの名前を取得します。
$ oc extract cm/kube-root-ca.crt -n openshift-apiserver
$ mv ca.crt build_cluster.crt
OpenShift Container Platform バージョン 4.15 より前 (例: 4.14) の場合は、次のコマンドを入力します。
$ oc get sa openshift-apiserver-sa --namespace=openshift-apiserver -o json | jq '.secrets[] | select(.name | contains("openshift-apiserver-sa-token"))'.name
-
OpenShift Container Platform Web コンソールで、シークレットから
ca.crt
キーの値を取得します。値は "-----BEGIN CERTIFICATE-----"` で始まります。 -
CA を Red Hat Quay にインポートします。このファイルの名前が、手順 9 で使用した
K8S_API_TLS_CA
フィールドと一致していることを確認します。
ServiceAccount
に対して次のSecurityContextConstraints
リソースを作成します。apiVersion: security.openshift.io/v1 kind: SecurityContextConstraints metadata: name: quay-builder priority: null readOnlyRootFilesystem: false requiredDropCapabilities: null runAsUser: type: RunAsAny seLinuxContext: type: RunAsAny seccompProfiles: - '*' supplementalGroups: type: RunAsAny volumes: - '*' allowHostDirVolumePlugin: true allowHostIPC: true allowHostNetwork: true allowHostPID: true allowHostPorts: true allowPrivilegeEscalation: true allowPrivilegedContainer: true allowedCapabilities: - '*' allowedUnsafeSysctls: - '*' defaultAddCapabilities: null fsGroup: type: RunAsAny --- apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: quay-builder-scc namespace: bare-metal-builder rules: - apiGroups: - security.openshift.io resourceNames: - quay-builder resources: - securitycontextconstraints verbs: - use --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: quay-builder-scc namespace: bare-metal-builder subjects: - kind: ServiceAccount name: quay-builder roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: quay-builder-scc
OpenShift Container Platform Web コンソールを使用して、Red Hat Quay on OpenShift Container Platform デプロイメントの
config.yaml
ファイルを更新し、適切な ベアメタルビルド 設定を含めます。-
Operators
Installed Operators Red Hat Quay Quay Registry をクリックします。 - レジストリーの名前 (例: example-registry) をクリックします。
- Config Bundle Secret の下で、設定バンドルの名前 (例: extra-ca-certificate-config-bundle-secret) をクリックします。
-
Actions
Edit Secret をクリックします。 以下の情報を Red Hat Quay の
config.yaml
ファイルに追加し、各値をお客様のインストールに関連する情報に置き換えます。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: ${BUILDMAN_HOSTNAME}:443 1 BUILD_MANAGER: - ephemeral - ALLOWED_WORKER_COUNT: 10 ORCHESTRATOR_PREFIX: buildman/production/ ORCHESTRATOR: REDIS_HOST: <sample_redis_hostname> 2 REDIS_PASSWORD: "" REDIS_SSL: false REDIS_SKIP_KEYSPACE_EVENT_SETUP: false EXECUTORS: - EXECUTOR: kubernetes BUILDER_NAMESPACE: <sample_builder_namespace> 3 K8S_API_SERVER: <sample_k8s_api_server> 4 K8S_API_TLS_CA: <sample_crt_file> 5 VOLUME_SIZE: 8G KUBERNETES_DISTRIBUTION: openshift CONTAINER_MEMORY_LIMITS: 1G 6 CONTAINER_CPU_LIMITS: 300m 7 CONTAINER_MEMORY_REQUEST: 1G 8 CONTAINER_CPU_REQUEST: 300m 9 NODE_SELECTOR_LABEL_KEY: beta.kubernetes.io/instance-type NODE_SELECTOR_LABEL_VALUE: n1-standard-4 CONTAINER_RUNTIME: podman SERVICE_ACCOUNT_NAME: <sample_service_account_name> SERVICE_ACCOUNT_TOKEN: <sample_account_token> 10 QUAY_USERNAME: <quay_username> QUAY_PASSWORD: <quay_password> WORKER_IMAGE: <registry>/quay-quay-builder WORKER_TAG: <some_tag> BUILDER_VM_CONTAINER_IMAGE: quay.io/quay/quay-builder-qemu-fedoracoreos:latest SETUP_TIME: 180 MINIMUM_RETRY_THRESHOLD: 0 SSH_AUTHORIZED_KEYS: 11 - <ssh-rsa 12345 someuser@email.com> - <ssh-rsa 67890 someuser2@email.com> HTTP_PROXY: <http://10.0.0.1:80> HTTPS_PROXY: <http://10.0.0.1:80> NO_PROXY: <hostname.example.com>
- 1
- 次のコマンドを実行して取得します:
$ oc get route quayregistry-quay-builder -n ${QUAY_PROJECT} -o jsonpath='{.spec.host}'
- 2
- Redis サービスのホスト名。
- 3
- ベアメタルビルド namespace の名前と一致するように設定します。この例では
bare-metal-builder
を使用しました。 - 4
K8S_API_SERVER
は、$ oc cluster-info
を実行して取得します。- 5
- カスタム CA 証明書を手動で作成して追加する必要があります (例
K8S_API_TLS_CA: /conf/stack/extra_ca_certs/build-cluster.crt
)。 - 6
- 指定しないと、デフォルトは
5120Mi
です。 - 7
- 指定しないと、デフォルトは
1000m
です。 - 8
- 指定しないと、デフォルトは
3968Mi
です。 - 9
- 指定しないと、デフォルトは
500m
です。 - 10
$ oc create sa
の実行時に取得します。- 11
- リモートトラブルシューティングアクセス用に、ビルド環境に公開 SSH キーを追加できるようにします。このキーは、管理者または開発者がデバッグの目的でビルドワーカーに SSH 接続するために使用する秘密鍵に対応している必要があります。このキーは、特定の SSH キーとポートを使用してリモートホストへの SSH 接続を確立することによって取得できます。例:
$ ssh -i /path/to/ssh/key/set/in/ssh_authorized_keys -p 9999 core@localhost
-
Operators
- ビルド 機能を有効にするには、Red Hat Quay レジストリーを再起動します。
3.1.1. 自己管理 ルート を使用した Red Hat Quay on OpenShift Container Platform ビルド 制限
OpenShift Container Platform 上で Red Hat Quay Operator をマネージド route
コンポーネントとともに使用する場合、次の制限が適用されます。
- 現在、OpenShift Container Platform の ルート は、単一ポートへのトラフィックのみを処理できます。Red Hat Quay ビルドをセットアップするには追加の手順が必要です。
-
Red Hat Quay Operator がインストールされているクラスターで
kubectl
またはoc
CLI ツールが動作するように設定されていること、およびQuayRegistry
が存在することを確認します。QuayRegistry
は、ビルダー が実行されるのと同じベアメタルクラスター上にある必要はありません。 - こちらの手順 に従って、OpenShift クラスター上で HTTP/2 ingress が有効になっていることを確認します。
Red Hat Quay Operator は、既存の
Quay
Pod 内で実行されているビルドマネージャーサーバーに gRPC トラフィックを送信するRoute
リソースを作成します。カスタムホスト名、または<builder-registry.example.com>
などのサブドメインを使用する場合は、作成したRoute
リソースのstatus.ingress[0].host
を参照する DNS プロバイダーで CNAME レコードを作成してください。以下に例を示します。$ kubectl get -n <namespace> route <quayregistry-name>-quay-builder -o jsonpath={.status.ingress[0].host}
OpenShift Container Platform UI または CLI を使用して、
QuayRegistry
のspec.configBundleSecret
によって参照されるSecret
を ビルド クラスター CA 証明書で更新します。キーにextra_ca_cert_build_cluster.cert
という名前を付けます。Red Hat Quay ビルド の設定時に作成した ビルド 設定で参照されている正しい値でconfig.yaml
ファイルのエントリーを更新し、BUILDMAN_HOSTNAME
CONFIGURATION FIELD を追加します。BUILDMAN_HOSTNAME: <build-manager-hostname> 1 BUILD_MANAGER: - ephemeral - ALLOWED_WORKER_COUNT: 1 ORCHESTRATOR_PREFIX: buildman/production/ JOB_REGISTRATION_TIMEOUT: 600 ORCHESTRATOR: REDIS_HOST: <quay_redis_host REDIS_PASSWORD: <quay_redis_password> REDIS_SSL: true REDIS_SKIP_KEYSPACE_EVENT_SETUP: false EXECUTORS: - EXECUTOR: kubernetes BUILDER_NAMESPACE: builder ...
- 1
- ビルドジョブ が ビルドマネージャー と通信するために使用する、外部からアクセス可能なサーバーホスト名です。デフォルトは
SERVER_HOSTNAME
と同じです。OpenShiftroute
リソースの場合、これはstatus.ingress[0].host
か、カスタムホスト名を使用している場合は CNAME エントリーのいずれかになります。BUILDMAN_HOSTNAME
には、ポート番号を含める必要があります (例: OpenShift Container Platformroute
の場合はsomehost:443
)。これは、ビルドマネージャー との通信に使用される gRPC クライアントが、ポートを省略すると推測しないためです。