16.3. 使用 OpenShift Container Platform 创建 Red Hat Quay 构建器环境
本节中的步骤解释了如何使用 OpenShift Container Platform 创建 Red Hat Quay 虚拟构建器环境。
16.3.1. OpenShift Container Platform TLS 组件
tls
组件允许您控制 TLS 配置。
当 TLS 组件由 Operator 管理时,Red Hat Quay 3.9 不支持构建器。
如果将 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 构建器
构建器需要 SSL/TLS 证书。有关 SSL/TLS 证书的更多信息,请参阅 向 Red Hat Quay 容器添加 TLS 证书。
如果使用 Amazon Web Service (AWS) S3 存储,您必须在运行构建器前修改 AWS 控制台中的存储桶。如需所需参数,请参阅以下部分的"修改 AWS S3 存储桶"。
16.3.2.1. 为虚拟构建器准备 OpenShift Container Platform
使用以下步骤为 Red Hat Quay 虚拟构建器准备 OpenShift Container Platform。
- 此流程假设您已置备集群并运行 Quay Operator。
- 此流程是在 OpenShift Container Platform 上设置虚拟命名空间。
流程
- 使用集群管理员帐户登录到您的 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 builder
anyuid scc
权限:$ oc adm policy -n virtual-builders add-scc-to-user anyuid -z quay-builder
注意此操作需要集群管理员特权。这是必要的,因为构建器必须以 Podman 用户身份运行,才能使非特权或无根构建正常工作。
获取 Quay builder 服务帐户的令牌。
如果使用 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/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
在控制台中找到配置捆绑包的 secret,然后选择 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
- 构建路由是通过使用 OpenShift Operator 命名空间的名称运行
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
- 设置为与虚拟构建器命名空间的名称匹配,如
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"
16.3.2.2. 手动添加 SSL/TLS 证书
由于配置工具的已知问题,您必须手动添加自定义 SSL/TLS 证书来正确运行构建器。使用以下步骤手动添加自定义 SSL/TLS 证书。
有关创建 SSL/TLS 证书的更多信息,请参阅在 Red Hat Quay 容器中添加 TLS 证书。
16.3.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
16.3.2.2.2. 将 TLS 设置为非受管
使用以下步骤将 king:tls
设置为 unmanaged。
流程
在 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'
16.3.2.2.3. 创建临时 secret
使用以下步骤为 CA 证书创建临时 secret。
流程
在默认命名空间中为 CA 证书创建一个 secret:
$ oc create secret generic -n quay-enterprise temp-crt --from-file extra_ca_cert_build_cluster.crt
在 default 命名空间中为
ssl.key
和ssl.cert
文件创建一个 secret:$ oc create secret generic -n quay-enterprise quay-config-ssl --from-file ssl.cert --from-file ssl.key
16.3.2.2.4. 将 secret 数据复制到配置 YAML 中
使用以下步骤将 secret 数据复制到 config.yaml
文件中。
流程
-
在控制台 UI 中找到位于 Workloads
Secrets 的新 secret。 对于每个 secret,找到 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 registry 配置捆绑包的 secret,或运行以下命令从命令行:
$ oc get quayregistries.quay.redhat.com -o jsonpath="{.items[0].spec.configBundleSecret}{'\n'}" -n quay-enterprise
在 OpenShift Container Platform 控制台中,选择配置捆绑包 secret 的 YAML 选项卡,并从您创建的两个 secret 中添加数据:
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 registry 后,输入以下命令检查 Red Hat Quay app 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
在浏览器中,访问 registry 端点并验证证书是否已正确更新。例如:
Common Name (CN) example-registry-quay-quay-enterprise.apps.docs.quayteam.org Organisation (O) DOCS Organisational Unit (OU) QUAY
16.3.2.3. 使用 UI 创建构建触发器
使用以下步骤使用 UI 创建构建触发器。
流程
- 登录您的 Red Hat Quay 存储库。
-
单击 Create New Repository 并创建新 registry,如
testrepo
。 在 Repositories 页面中,点导航窗格中的 Builds 选项卡。或者,直接使用对应的 URL:
https://example-registry-quay-quay-enterprise.apps.docs.quayteam.org/repository/quayadmin/testrepo?tab=builds
重要在某些情况下,构建器可能会遇到解析主机名的问题。此问题可能与作业对象上的
dnsPolicy
设置为default
相关。目前,这个问题还没有临时解决方案。它将在以后的 Red Hat Quay 版本中解决。-
点 Create Build Trigger
Custom Git Repository Push。 输入用于克隆 Git 存储库的 HTTPS 或 SSH 风格 URL,然后单击 Continue。例如:
https://github.com/gabriel-rh/actions_test.git
- 使用分支或标签名称检查 Tag 清单,然后单击 Continue。
-
在调用触发器时输入要构建的 Dockerfile 位置,例如
/Dockerfile
并点 Continue。 -
输入 Docker 构建的上下文位置,如
/
,然后单击 Continue。 - 如果保证,请创建一个受限帐户。否则,点 Continue。
- 点 Continue 验证参数。
- 在 Builds 页面中,点 Trigger Name 的 Options 图标,然后点 Run Trigger Now。
- 从 Git 存储库输入提交 SHA,然后单击 Start Build。
您可以通过单击 Build History 页面中的提交或运行
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
。 - 单击权限选项卡。
在跨原始资源共享(CORS) 下,包括以下参数:
[ { "AllowedHeaders": [ "Authorization" ], "AllowedMethods": [ "GET" ], "AllowedOrigins": [ "*" ], "ExposeHeaders": [], "MaxAgeSeconds": 3000 }, { "AllowedHeaders": [ "Content-Type", "x-amz-acl", "origin" ], "AllowedMethods": [ "PUT" ], "AllowedOrigins": [ "*" ], "ExposeHeaders": [], "MaxAgeSeconds": 3000 } ]
16.3.2.5. 修改 Google Cloud Platform 对象存储桶
使用以下步骤为虚拟构建器配置跨原始资源共享(CORS)。
如果没有 CORS 配置,上传构建 Dockerfile 会失败。
流程
使用以下引用来创建 JSON 文件,以满足您的特定 CORS 需求。例如:
$ 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