第 3 章 在 OpenShift Container Platform 上使用 Red Hat Quay 构建裸机
本节中的步骤解释了如何在 OpenShift Container Platform 上为 Red Hat Quay 为 裸机构建 创建环境。
3.1. 在 OpenShift Container Platform 上为 Red Hat Quay 配置裸机构建
使用以下步骤为 OpenShift Container Platform 上的 Red Hat Quay 配置 裸机构建。
如果您在 OpenShift Container Platform 上使用带有 QuayRegistry
CRD 中的受管 路由
组件的 Red Hat Quay Operator,请参阅 "Red Hat Quay on OpenShift Container Platform build limitations with self-managed routes"。
先决条件
- 您已在运行 Red Hat Quay Operator 时置备了 OpenShift Container Platform 集群。
-
您已将
tls
组件设置为非受管
组件,并将自定义 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
命名空间中创建一个新ServiceAccount
:$ oc create sa -n bare-metal-builder quay-builder
输入以下命令在
bare-metal-builder
命名空间中授予用户edit
角色:$ oc policy add-role-to-user -n bare-metal-builder edit system:serviceaccount:bare-metal-builder:quay-builder
输入以下命令检索与
bare-metal-builder
命名空间中的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 控制台中找到。
识别调度 构建作业时使用的 worker 节点标签。由于 构建 pod 必须在裸机 worker 节点上运行,因此通常使用特定标签来标识这些 pod。
使用集群管理员检查,确定应该使用哪个节点标签。
获取 Kube API 服务器的证书颁发机构(CA)以添加到 Red Hat Quay 的额外证书。
在 OpenShift Container Platform 版本 4.15+ 中,输入以下命令获取包含 CA 的 secret 名称:
$ oc extract cm/kube-root-ca.crt -n openshift-apiserver
$ mv ca.crt build_cluster.crt
在早于 4.15 的 OpenShift Container Platform 版本中,如 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 控制台中的 secret 获取
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 控制台更新 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。 在您的 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
- 设置为 与裸机构建 命名空间的名称匹配。本例使用
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 registry 以启用 构建功能。
3.1.1. OpenShift Container Platform 上的 Red Hat Quay 增加了自我管理的 路由的限制
当您在带有受管 路由
组件的 OpenShift Container Platform 中使用 Red Hat Quay Operator 时,会有以下限制:
- 目前,OpenShift Container Platform 路由 只能为单个端口提供流量。设置 Red Hat Quay 构建需要额外的步骤。
-
确保
kubectl
或oc
CLI 工具已配置为与安装 Red Hat Quay Operator 的集群以及您的QuayRegistry
- 按照以下步骤,确保 OpenShift 集群上启用了 HTTP/2 入口。
Red Hat Quay Operator 创建一个
Route
资源,将 gRPC 流量定向到现有Quay
pod 或 pod 中运行的 Build manager 服务器。如果要使用自定义主机名或类似 <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,使用 构建 集群 CA 证书更新
QuayRegistry
的spec.configBundle
引用的 Secret。将键命名为Secret
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
相同。对于 OpenShift路由资源
,如果使用自定义主机名,它是status.ingress[0].host
或 CNAME 条目。BUILDMAN_HOSTNAME
必须包括端口号,例如 OpenShift Container Platform路由资源
的somehost:443
,因为用于与 构建管理器 通信的 gRPC 客户端不会推断任何端口(如果省略)。