第 6 章 使用构建 worker 自动构建 Dockerfile

Red Hat Quay 支持使用 OpenShift Container Platform 或 Kubernetes 上的一组 worker 节点来构建 Dockerfile。构建触发器(如 GitHub Webhook)可以配置为在提交新代码时自动构建新版本的存储库。

本文档演示了如何使用 Red Hat Quay 安装启用构建,并设置多个 OpenShift Container Platform 或 Kubernetes 集群以接受 Red Hat Quay 的构建。

6.1. 使用 OpenShift Container Platform 设置 Red Hat Quay Builder

在 OpenShift Container Platform 中使用前,您必须预先配置 Red Hat Quay Builders。

6.1.1. 配置 OpenShift Container Platform TLS 组件

tls 组件允许您控制 TLS 配置。

注意

当 TLS 组件由 Red Hat Quay Operator 管理时,Red Hat Quay 不支持 Builder。

如果将 tls 设置为非受管状态,您可以提供自己的 ssl.certssl.key 文件。在本实例中,如果希望集群支持 Builder,您必须将 Quay 路由和 Builder 路由名称添加到证书中的 SAN 列表中;也可以使用通配符。

要添加构建器路由,请使用以下格式:

[quayregistry-cr-name]-quay-builder-[ocp-namespace].[ocp-domain-name]

6.1.2. 为 Red Hat Quay Builder 准备 OpenShift Container Platform

使用以下步骤为 OpenShift Container Platform 准备 Red Hat Quay Builders。

先决条件

  • 您已配置了 OpenShift Container Platform TLS 组件。

流程

  1. 输入以下命令来创建运行 Builds 的项目,如 builder

    $ oc new-project builder
  2. 输入以下命令在 构建器 命名空间中创建一个新的 ServiceAccount

    $ oc create sa -n builder quay-builder
  3. 输入以下命令在 builder 命名空间中授予用户 edit 角色:

    $ oc policy add-role-to-user -n builder edit system:serviceaccount:builder:quay-builder
  4. 输入以下命令来检索与 builder 命名空间中 quay-builder 服务帐户关联的令牌。此令牌用于身份验证并与 OpenShift Container Platform 集群的 API 服务器交互。

    $ oc sa get-token -n builder quay-builder
  5. 识别 OpenShift Container Platform 集群的 API 服务器的 URL。这可以在 OpenShift Container Platform Web 控制台中找到。
  6. 识别调度构建作业时要使用的 worker 节点标签。因为构建 pod 需要在裸机 worker 节点上运行,所以通常它们使用特定的标签标识。

    检查您的集群管理员,以确定应使用哪个节点标签。

  7. 可选。如果集群使用自签名证书,则必须获取 Kube API 服务器的证书颁发机构(CA)以添加到 Red Hat Quay 的额外证书。

    1. 输入以下命令获取包含 CA 的 secret 的名称:

      $ oc get sa openshift-apiserver-sa --namespace=openshift-apiserver -o json | jq '.secrets[] | select(.name | contains("openshift-apiserver-sa-token"))'.name
    2. 从 OpenShift Container Platform Web 控制台中的 secret 获取 ca.crt 键值。该值以 "-----BEGIN CERTIFICATE-----"' 开头。
    3. 使用 Config Tool 在 Red Hat Quay 中导入 CA。确保此文件的名称与 K8S_API_TLS_CA 匹配。
  8. 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: 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: builder
    subjects:
    - kind: ServiceAccount
      name: quay-builder
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: Role
      name: quay-builder-scc

6.1.3. 配置 Red Hat Quay Builders

使用以下步骤启用 Red Hat Quay Builders。

流程

  1. 确保您的 Red Hat Quay config.yaml 文件启用了 Builds,例如:

    FEATURE_BUILD_SUPPORT: True
  2. 在 Red Hat Quay config.yaml 文件中添加以下信息,将每个值替换为与您的特定安装相关的信息:

    注意

    目前,Red Hat Quay Config Tool 只能启用构建功能。Build Manager 和 Executors 的配置必须在 config.yaml 文件中手动完成。

    BUILD_MANAGER:
    - ephemeral
    - ALLOWED_WORKER_COUNT: 1
      ORCHESTRATOR_PREFIX: buildman/production/
      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
        K8S_API_SERVER: api.openshift.somehost.org:6443
        K8S_API_TLS_CA: /conf/stack/extra_ca_certs/build_cluster.crt
        VOLUME_SIZE: 8G
        KUBERNETES_DISTRIBUTION: openshift
        CONTAINER_MEMORY_LIMITS: 5120Mi
        CONTAINER_CPU_LIMITS: 1000m
        CONTAINER_MEMORY_REQUEST: 3968Mi
        CONTAINER_CPU_REQUEST: 500m
        NODE_SELECTOR_LABEL_KEY: beta.kubernetes.io/instance-type
        NODE_SELECTOR_LABEL_VALUE: n1-standard-4
        CONTAINER_RUNTIME: podman
        SERVICE_ACCOUNT_NAME: *****
        SERVICE_ACCOUNT_TOKEN: *****
        QUAY_USERNAME: quay-username
        QUAY_PASSWORD: quay-password
        WORKER_IMAGE: <registry>/quay-quay-builder
        WORKER_TAG: some_tag
        BUILDER_VM_CONTAINER_IMAGE: <registry>/quay-quay-builder-qemu-rhcos:v3.4.0
        SETUP_TIME: 180
        MINIMUM_RETRY_THRESHOLD: 0
        SSH_AUTHORIZED_KEYS:
        - ssh-rsa 12345 someuser@email.com
        - ssh-rsa 67890 someuser2@email.com

    有关每个配置字段的更多信息,请参阅