4.2. 在 OpenShift Container Platform 上为 Red Hat Quay 配置虚拟构建
本节中的步骤解释了如何在 OpenShift Container Platform 上为 Red Hat Quay 创建虚拟 构建环境。
- 如果使用 Amazon Web Service (AWS) S3 存储,则必须在运行构建器前在 AWS 控制台中修改存储桶。有关所需参数,请参阅以下部分"修改 AWS S3 存储桶"。
- 如果使用 Google Cloud Platform (GCP)对象存储桶,您必须配置跨原始资源共享(CORS)以启用 虚拟构建。
先决条件
- 您已在运行 Red Hat Quay Operator 时置备了 OpenShift Container Platform 集群。
-
您已将
tls
组件设置为非受管
组件,并将自定义 SSL/TLS 证书上传到 Red Hat Quay Operator。如需更多信息,请参阅 Red Hat Quay 的 SSL 和 TLS。 - 您已为构建配置了 OpenShift Container Platform TLS 组件。
- 以集群管理员身份登录 OpenShift Container Platform。
流程
运行以下命令,创建一个运行虚拟构建器的新项目,如
virtual-builders
:$ oc new-project virtual-builders
输入以下命令在项目中创建一个
ServiceAccount
,用于运行 构建 :$ oc create sa -n virtual-builders quay-builder
输出示例
serviceaccount/quay-builder created
为创建的服务帐户提供编辑权限,使其可以 运行构建 :
$ oc adm policy -n virtual-builders add-role-to-user edit system:serviceaccount:virtual-builders:quay-builder
输出示例
clusterrole.rbac.authorization.k8s.io/edit added: "system:serviceaccount:virtual-builders:quay-builder"
输入以下命令,授予 构建器 worker
anyuid scc
权限。这要求集群管理员特权,因为 构建器 必须以 Podman 用户身份运行,才能使非特权或无根构建正常工作。$ oc adm policy -n virtual-builders add-scc-to-user anyuid -z quay-builder
输出示例
clusterrole.rbac.authorization.k8s.io/system:openshift:scc:anyuid added: "quay-builder"
输入以下命令来获取 builder 服务帐户的令牌:
$ oc create token quay-builder -n virtual-builders
注意当令牌过期时,您需要请求新令牌。另外,您还可以添加自定义过期。例如,使用
specify-duration 20160m
来保留令牌两周。输出示例
eyJhbGciOiJSUzI1NiIsImtpZCI6IldfQUJkaDVmb3ltTHZ0dGZMYjhIWnYxZTQzN2dJVEJxcDJscldSdEUtYWsifQ...
输入以下命令确定 构建器 路由:
$ oc get route -n quay-enterprise
输出示例
NAME: example-registry-quay-builder HOST/PORT: example-registry-quay-builder-quay-enterprise.apps.stevsmit-cluster-new.gcp.quaydev.org PATH: SERVICES: example-registry-quay-app PORT: grpc TERMINATION: passthrough/Redirect WILDCARD: None
输入以下命令,使用
.crt
扩展生成自签名 SSL/TlS 证书:$ oc extract cm/kube-root-ca.crt -n openshift-apiserver
输出示例
ca.crt
输入以下命令将
ca.crt
文件重命名为build-cluster.crt
:$ mv ca.crt build-cluster.crt
使用 OpenShift Container Platform Web 控制台更新 OpenShift Container Platform 部署上的 Red Hat Quay 的
config.yaml
文件,使其包含适当的 虚拟 构建配置。-
点 Operators
Installed Operators Red Hat Quay Quay Registry。 - 点 registry 的名称,如 example-registry。
- 在 Config Bundle Secret 下,单击配置捆绑包的名称,如 extra-ca-certificate-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: 0 BUILDER_CONTAINER_IMAGE: quay.io/projectquay/quay-builder:{producty} # Kubernetes resource options K8S_API_SERVER: <sample_k8s_api_server> 5 K8S_API_TLS_CA: <sample_crt_file> 6 VOLUME_SIZE: 8G KUBERNETES_DISTRIBUTION: openshift CONTAINER_MEMORY_LIMITS: 1G 7 CONTAINER_CPU_LIMITS: 300m 8 CONTAINER_MEMORY_REQUEST: 1G 9 CONTAINER_CPU_REQUEST: 300m 10 NODE_SELECTOR_LABEL_KEY: "" NODE_SELECTOR_LABEL_VALUE: "" SERVICE_ACCOUNT_NAME: <sample_service_account_name> SERVICE_ACCOUNT_TOKEN: <sample_account_token> 11 HTTP_PROXY: <http://10.0.0.1:80> HTTPS_PROXY: <http://10.0.0.1:80> NO_PROXY: <hostname.example.com>
- 1
- 构建路由可通过在 OpenShift Container Platform 部署中使用 Red Hat Quay 的命名空间运行
$ 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
K8S_API_SERVER
通过运行$ oc cluster-info
获取。- 6
- 您必须手动创建并添加自定义 CA 证书,如
K8S_API_TLS_CA: /conf/stack/extra_ca_certs/build-cluster.crt
。 - 7
- 如果未指定,则默认为
5120Mi
。 - 8
- 对于 虚拟构建,您必须确保集群中有足够的资源。如果未指定,则默认为
1000m
。 - 9
- 如果未指定,则默认为
3968Mi
。 - 10
- 如果未指定,则默认为
500m
。 - 11
- 运行
$ 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:{producty} # 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: 300m CONTAINER_MEMORY_REQUEST: 1G CONTAINER_CPU_REQUEST: 300m NODE_SELECTOR_LABEL_KEY: "" NODE_SELECTOR_LABEL_VALUE: "" SERVICE_ACCOUNT_NAME: quay-builder SERVICE_ACCOUNT_TOKEN: "eyJhbGciOiJSUzI1NiIsImtpZCI6IldfQUJkaDVmb3ltTHZ0dGZMYjhIWnYxZTQzN2dJVEJxcDJscldSdEUtYWsifQ" HTTP_PROXY: <http://10.0.0.1:80> HTTPS_PROXY: <http://10.0.0.1:80> NO_PROXY: <hostname.example.com>
- 在 Edit Secret 页面上点 Save。
-
点 Operators
- 使用新配置重启 OpenShift Container Platform registry 上的 Red Hat Quay。
4.2.1. 修改 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 } ]
4.2.2. 修改 Google Cloud Platform 对象存储桶
目前,IBM Power 和 IBM Z 不支持修改 Google Cloud Platform 对象存储桶。
使用以下步骤为虚拟构建器配置跨原始资源共享(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