第 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。

流程

  1. 输入以下命令创建一个运行构建的项目,如 bare-metal-builder

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

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

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

    1. 如果您的 OpenShift Container Platform 集群是 4.11+ 版本,请输入以下命令:

      oc create token quay-builder  -n bare-metal-builder --duration 24h
    2. 如果您的 OpenShift Container Platform 集群早于 4.11 版本,例如版本 4.10,请输入以下命令:

      $ oc sa get-token -n bare-metal-builder quay-builder
  5. 识别 OpenShift Container Platform 集群的 API 服务器的 URL。这可在 OpenShift Container Platform Web 控制台中找到。
  6. 识别调度 构建作业时使用的 worker 节点标签。由于 构建 pod 必须在裸机 worker 节点上运行,因此通常使用特定标签来标识这些 pod。

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

  7. 获取 Kube API 服务器的证书颁发机构(CA)以添加到 Red Hat Quay 的额外证书。

    1. 在 OpenShift Container Platform 版本 4.15+ 中,输入以下命令获取包含 CA 的 secret 名称:

      $ oc extract cm/kube-root-ca.crt -n openshift-apiserver
      $ mv ca.crt build_cluster.crt
    2. 在早于 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
    3. 从 OpenShift Container Platform Web 控制台中的 secret 获取 ca.crt 键值。该值以 "-----BEGIN CERTIFICATE-----"' 开头。
    4. 将 CA 导入到 Red Hat Quay。确保此文件的名称与第 9 步中使用的 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: 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
  9. 使用 OpenShift Container Platform Web 控制台更新 OpenShift Container Platform 部署上的 Red Hat Quay 的 config.yaml 文件,使其包含适当的 裸机 构建配置。

    1. Operators Installed Operators Red Hat Quay Quay Registry
    2. 点 registry 的名称,如 example-registry
    3. Config Bundle Secret 下,单击配置捆绑包的名称,如 extra-ca-certificate-config-bundle-secret
    4. Actions Edit Secret
    5. 在您的 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.
  10. 重启 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 构建需要额外的步骤。
  • 确保 kubectloc CLI 工具已配置为与安装 Red Hat Quay Operator 的集群以及您的 QuayRegistry 存在;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 证书更新 QuayRegistryspec.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 客户端不会推断任何端口(如果省略)。
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.