16.3. 使用 OpenShift 创建 Red Hat Quay 构建器环境
16.3.1. OpenShift TLS 组件
tls
组件允许您控制 TLS 配置。
当 Operator 管理 TLS 组件时,Red Hat Quay 3.7 不支持构建程序。
如果将 tls
设置为非受管状态
,您可以提供自己的 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 上设置虚拟命名空间。
16.3.2.1. 为虚拟构建器准备 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 证书:
$ oc extract cm/kube-root-ca.crt -n openshift-apiserver ca.crt
$ mv ca.crt extra_ca_cert_build_cluster.crt
在控制台中找到 config bundle 的 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: 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
- 构建路由通过运行
oc get route -n
并使用 OpenShift Operator 命名空间的名称来获取。例如,必须在路由末尾提供一个端口:[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: Invalid build token: Signature has been expired
.建议将此参数设置为 240。 - 3
- 如果您的 Redis 主机有密码或 SSL 证书,您必须相应地更新。
- 4
- 设置 以匹配虚拟构建器命名空间的名称,如
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 registry 的 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 registry 的 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. 创建临时 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 数据复制到 config.yaml
-
在 Workloads
Secrets 的 console UI 中找到新 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 中查找 Quay Registry 配置捆绑包的 secret,或通过运行以下命令来通过运行以下命令,例如:
$ oc get quayregistries.quay.redhat.com -o jsonpath="{.items[0].spec.configBundleSecret}{'\n'}" -n quay-enterprise
在 OpenShift 控制台中,选择 config bundle 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
重新配置 Quay registry 后,检查您的 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 创建构建触发器
- 登录您的 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。 - 如果保证,请创建一个 Robot 帐户。否则,点 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
。 - 单击权限选项卡。
在 Cross-origin 资源共享(CORS) 下,包含以下参数:
[ { "AllowedHeaders": [ "Authorization" ], "AllowedMethods": [ "GET" ], "AllowedOrigins": [ "*" ], "ExposeHeaders": [], "MaxAgeSeconds": 3000 }, { "AllowedHeaders": [ "Content-Type", "x-amz-acl", "origin" ], "AllowedMethods": [ "PUT" ], "AllowedOrigins": [ "*" ], "ExposeHeaders": [], "MaxAgeSeconds": 3000 } ]