16.3. 使用 OpenShift 创建 Red Hat Quay 构建器环境


16.3.1. OpenShift TLS 组件

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

注意

当 Operator 管理 TLS 组件时,Red Hat Quay 3.7 不支持构建程序。

如果将 tls 设置为非受管状态,您可以提供自己的 ssl.certssl.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

  1. 使用集群管理员帐户登录您的 Red Hat Quay 集群。
  2. 创建一个新项目运行您的虚拟构建器(如 virtual-builders)。

    $ oc new-project virtual-builders
  3. 在此项目中创建一个 ServiceAccount,它将用于运行构建。

    $ oc create sa -n virtual-builders quay-builder
  4. 使用编辑权限提供所创建的服务帐户,以便它能够运行构建:

    $ oc adm policy -n virtual-builders add-role-to-user edit system:serviceaccount:virtual-builders:quay-builder
  5. 授予 Quay builder anyuid scc 权限:

    $ oc adm policy -n virtual-builders add-scc-to-user anyuid -z quay-builder
    注意

    此操作需要集群管理员特权。这是必要的,因为构建器必须以 Podman 用户运行,以获取非特权或无根构建才能工作。

  6. 获取 Quay builder 服务帐户的令牌。

    1. 如果使用 OpenShift Container Platform 4.10 或更早的版本,请输入以下命令:

      oc sa get-token -n virtual-builders quay-builder
    2. 如果使用 OpenShift Container Platform 4.11 或更高版本,请输入以下命令:

      $ oc create token quay-builder -n virtual-builders

      输出示例

      eyJhbGciOiJSUzI1NiIsImtpZCI6IldfQUJkaDVmb3ltTHZ0dGZMYjhIWnYxZTQzN2dJVEJxcDJscldSdEUtYWsifQ...

  7. 确定构建器路由:

    $ 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
    ...

  8. 使用 .crt 扩展生成自签名 SSL 证书:

    $ oc extract cm/kube-root-ca.crt -n openshift-apiserver ca.crt
    $ mv ca.crt extra_ca_cert_build_cluster.crt
  9. 在控制台中找到 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. 创建并签名证书
  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

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
  1. 在默认命名空间中为 CA 证书创建 secret:

    $ oc create secret generic -n quay-enterprise temp-crt --from-file extra_ca_cert_build_cluster.crt
  2. 在 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
  1. Workloads Secrets 的 console UI 中找到新 secret。
  2. 对于每个 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
  3. 在 UI 中查找 Quay Registry 配置捆绑包的 secret,或通过运行以下命令来通过运行以下命令,例如:

    $ oc get quayregistries.quay.redhat.com -o jsonpath="{.items[0].spec.configBundleSecret}{'\n'}"  -n quay-enterprise
  4. 在 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
  5. 点击 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

  6. 重新配置 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

  7. 在浏览器中,访问 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 创建构建触发器

  1. 登录您的 Quay 存储库。
  2. 单击 Create New Repository 并创建一个新 registry,例如 testrepo
  3. Repositories 页面上,单击左侧窗格中的 Builds 选项卡。或者,直接使用对应的 URL,例如:

    https://example-registry-quay-quay-enterprise.apps.docs.quayteam.org/repository/quayadmin/testrepo?tab=builds
    重要

    在某些情况下,构建器可能会存在解析主机名的问题。此问题可能与作业对象上的 dnsPolicy 被设置为 default。目前,这个问题还没有临时解决方案。它将在以后的 Red Hat Quay 版本中解决。

  4. Create Build Trigger Custom Git Repository Push
  5. 输入用于克隆 Git 存储库的 HTTPS 或 SSH 风格 URL,然后点 Continue。例如:

    https://github.com/gabriel-rh/actions_test.git
  6. 使用分支或标签名称检查 Tag 清单,然后单击 Continue
  7. 在调用触发器时输入要构建的 Dockerfile 位置,如 /Dockerfile,再单击 Continue
  8. 输入 Docker 构建上下文的位置,如 /,然后单击 Continue
  9. 如果保证,请创建一个 Robot 帐户。否则,点 Continue
  10. Continue 验证参数。
  11. Builds 页面上,点击 Trigger Name 的 Options 图标,然后点 Run Trigger Now
  12. 输入来自 Git 存储库的提交 SHA,然后单击 Start Build
  13. 您可以点击 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.
  14. 构建完成后,您可以在左侧窗格的 Tags 下检查标签的状态。

    注意

    对于早期访问,构建的完整构建日志和时间戳目前不可用。

16.3.2.4. 修改 AWS S3 存储桶

如果使用 AWS S3 存储,您必须在 AWS 控制台中修改存储桶,然后再运行构建器。

  1. s3.console.aws.com 上登录到您的 AWS 控制台。
  2. 在搜索栏中,搜索 S3,然后单击 S3
  3. 单击存储桶的名称,如 myawsbucket
  4. 单击权限选项卡。
  5. Cross-origin 资源共享(CORS) 下,包含以下参数:

      [
          {
              "AllowedHeaders": [
                  "Authorization"
              ],
              "AllowedMethods": [
                  "GET"
              ],
              "AllowedOrigins": [
                  "*"
              ],
              "ExposeHeaders": [],
              "MaxAgeSeconds": 3000
          },
          {
              "AllowedHeaders": [
                  "Content-Type",
                  "x-amz-acl",
                  "origin"
              ],
              "AllowedMethods": [
                  "PUT"
              ],
              "AllowedOrigins": [
                  "*"
              ],
              "ExposeHeaders": [],
              "MaxAgeSeconds": 3000
          }
      ]
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.