搜索

13.3. 使用 OpenShift Container Platform 创建 Red Hat Quay 构建器环境

download PDF

本节中的步骤解释了如何使用 OpenShift Container Platform 创建 Red Hat Quay 虚拟构建器环境。

13.3.1. OpenShift Container Platform TLS 组件

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

注意

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

如果将 tls 设置为 unmanaged,则提供自己的 ssl.certssl.key 文件。在本实例中,如果希望集群支持构建器,您必须将 Quay 路由和构建器路由名称添加到证书中的 SAN 列表中,或使用通配符。

要添加 builder 路由,请使用以下格式:

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

13.3.2. 使用 OpenShift Container Platform for Red Hat Quay builders

构建器需要 SSL/TLS 证书。有关 SSL/TLS 证书的更多信息,请参阅 向 Red Hat Quay 容器添加 TLS 证书

如果使用 Amazon Web Service (AWS) S3 存储,您必须在运行构建器前修改 AWS 控制台中的存储桶。如需所需参数,请参阅以下部分"修改 AWS S3 存储桶"。

13.3.2.1. 为虚拟构建器准备 OpenShift Container Platform

使用以下步骤为 Red Hat Quay 虚拟构建器准备 OpenShift Container Platform。

注意
  • 此流程假设您已置备集群并运行 Quay Operator。
  • 此流程是在 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
      注意

      当令牌过期时,您需要请求新令牌。另外,您还可以添加自定义过期。例如,指定 --duration 20160m 以保留令牌两周。

      输出示例

      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/TlS 证书:

    $ oc extract cm/kube-root-ca.crt -n openshift-apiserver

    输出示例

    ca.crt

  9. 输入以下命令将 ca.crt 文件重命名为 extra_ca_cert_build_cluster.crt

    $ mv ca.crt extra_ca_cert_build_cluster.crt
  10. 控制台中找到配置捆绑包的 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: <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: Signature has expired.建议将此参数设置为至少 240。
    3
    如果您的 Redis 主机有密码或 SSL/TLS 证书,您必须相应地更新。
    4
    设置,以匹配虚拟构建器命名空间的名称,如 virtual-builders
    5
    对于早期访问,BUILDER_CONTAINER_IMAGE 目前是 quay.io/projectquay/quay-builder:3.7.0-rc.2。请注意,这可能会在早期访问窗口中更改。如果出现这种情况,则会警告客户。
    6
    K8S_API_SERVER 通过运行 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: 0
            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"

13.3.2.2. 手动添加 SSL/TLS 证书

由于配置工具的已知问题,您必须手动将自定义 SSL/TLS 证书添加到正确运行。使用以下步骤手动添加自定义 SSL/TLS 证书。

有关创建 SSL/TLS 证书的更多信息,请参阅在 Red Hat Quay 容器中添加 TLS 证书

13.3.2.2.1. 创建和签名证书

使用以下步骤创建并签署 SSL/TLS 证书。

流程

  • 创建证书颁发机构并签署证书。如需更多信息,请参阅创建证书颁发机构并签署证书

    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 1
    DNS.2 = example-registry-quay-builder-quay-enterprise.apps.docs.quayteam.org 2

    1
    必须包含 Red Hat Quay registry URL 的 alt_name
    2
    BUILDMAN_HOSTNAMEalt_name

    示例命令

    $ 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

13.3.2.2.2. 将 TLS 设置为非受管

使用以下步骤将 king:tls 设置为 unmanaged。

流程

  1. 在 Red Hat Quay Registry YAML 中,将 kind: tls 设置为 managed: false

      - kind: tls
        managed: false
  2. Events 页面中,更改会被阻断,直到您设置了适当的 config.yaml 文件。例如:

        - 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'
13.3.2.2.3. 创建临时 secret

使用以下步骤为 CA 证书创建临时 secret。

流程

  1. 在默认命名空间中创建 CA 证书的 secret:

    $ oc create secret generic -n quay-enterprise temp-crt --from-file extra_ca_cert_build_cluster.crt
  2. 在 default 命名空间中为 ssl.keyssl.cert 文件创建一个 secret:

    $ oc create secret generic -n quay-enterprise quay-config-ssl --from-file ssl.cert --from-file ssl.key
13.3.2.2.4. 将 secret 数据复制到配置 YAML 中

使用以下步骤将 secret 数据复制到 config.yaml 文件中。

流程

  1. 在控制台 UI 中找到 Workloads Secrets 的新 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 中查找 Red Hat Quay registry 配置捆绑包的 secret,或通过运行以下命令来使用命令行:

    $ oc get quayregistries.quay.redhat.com -o jsonpath="{.items[0].spec.configBundleSecret}{'\n'}"  -n quay-enterprise
  4. 在 OpenShift Container Platform 控制台中,选择配置捆绑包 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
  6. 输入以下命令查看您的 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

  7. 重新配置 Red Hat Quay registry 后,输入以下命令检查 Red Hat Quay 应用程序 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

  8. 在您的浏览器中,访问 registry 端点并验证证书是否已适当更新。例如:

    Common Name (CN)	example-registry-quay-quay-enterprise.apps.docs.quayteam.org
    Organisation (O)	DOCS
    Organisational Unit (OU)	QUAY

13.3.2.3. 使用 UI 创建构建触发器

使用以下步骤使用 UI 创建构建触发器。

流程

  1. 登录到您的 Red Hat 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 下的标签状态。

    注意

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

13.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
          }
      ]

13.3.2.5. 修改 Google Cloud Platform 对象存储桶

注意

目前,IBM Power 和 IBM Z 不支持修改 Google Cloud Platform 对象存储桶。

使用以下步骤为虚拟构建器配置跨原始资源共享(CORS)。

注意

如果没有 CORS 配置,上传构建 Dockerfile 会失败。

流程

  1. 使用以下引用来创建 JSON 文件,以满足您的特定 CORS 需求。例如:

    $ cat gcp_cors.json

    输出示例

    [
        {
          "origin": ["*"],
          "method": ["GET"],
          "responseHeader": ["Authorization"],
          "maxAgeSeconds": 3600
        },
        {
          "origin": ["*"],
          "method": ["PUT"],
          "responseHeader": [
                  "Content-Type",
                  "x-goog-acl",
                  "origin"],
          "maxAgeSeconds": 3600
        }
    ]

  2. 输入以下命令更新 GCP 存储桶:

    $ gcloud storage buckets update gs://<bucket_name> --cors-file=./gcp_cors.json

    输出示例

    Updating
      Completed 1

  3. 您可以运行以下命令来显示 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

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.