第 7 章 高级概念

7.1. 自定义 Quay 部署

Quay Operator 对部署 Quay 及其依赖项采取建议的策略,但有一些位置可以自定义 Quay 部署。

7.1.1. Quay 应用程序配置

部署后,可以使用配置编辑器 UI 或修改包含 Quay 配置捆绑包的 Secret 来正常配置 Quay 应用本身。Operator 使用 spec.configBundle Secret 字段中命名的 Secret,但不会监视此资源的变化。建议对新的 Secret 资源进行配置更改,并更新 spec.configBundleSecret 字段来反映更改。如果新配置出现问题,可以将 spec.configBundleSecret 的值恢复到旧的 Secret

7.1.2. 自定义对 Registry 的外部访问权限

在 OpenShift 中运行时,Route API 可用,并将自动用作受管组件。创建 QuayRegistry 后,可以在 QuayRegistry 的 status 块中找到外部访问点:

status:
  registryEndpoint: some-quay.my-namespace.apps.mycluster.com

在原生 Kubernetes 上运行时,Operator 会为 registry 创建一个 类型为 ClusterIP 的服务。然后您负责外部访问(如 Ingress)。

$ kubectl get services -n <namespace>
NAME                    TYPE        CLUSTER-IP       EXTERNAL-IP          PORT(S)             AGE
some-quay               ClusterIP   172.30.143.199   <none>               443/TCP,9091/TCP    23h

7.1.2.1. 使用自定义主机名和 TLS

默认情况下,将使用默认 生成的主机名创建路由,并将为 TLS 生成证书/密钥对。如果要使用自定义主机名访问 Red Hat Quay 并提供自己的 TLS 证书/密钥对,请按照以下步骤操作。

如果 FEATURE_BUILD_SUPPORT: true,请确保证书/密钥对也对 BUILDMAN_HOSTNAME 有效。

如果给定证书/密钥对对于上述主机名无效,则 Quay Operator 将拒绝您提供的证书/密钥对,并生成供 Red Hat Quay 使用的证书/密钥对。

接下来,使用以下内容创建 Secret:

apiVersion: v1
kind: Secret
metadata:
  name: my-config-bundle
data:
  config.yaml: <must include SERVER_HOSTNAME field with your custom hostname>
  ssl.cert: <your TLS certificate>
  ssl.key: <your TLS key>

然后,创建一个引用创建的 Secret 的 QuayRegistry:

apiVersion: quay.redhat.com/v1
kind: QuayRegistry
metadata:
  name: some-quay
spec:
  configBundleSecret: my-config-bundle

7.1.2.2. 使用 OpenShift 提供的 TLS 证书

最好在 Quay 应用容器中终止 TLS。因此,要使用 OpenShift 提供的 TLS,您必须创建一个类型为 "reencrypt" 的路由,它将使用 OpenShift 在边缘提供的 TLS,以及集群中的 Quay Operator 生成的 TLS。这可以通过将 路由 组件标记为非受管,并使用 Operator 生成的 CA 证书创建自己的路由来重新加密 TLS

使用包含值 < route-name>-<namespace>.apps.<cluster-domain&gt; 的 SERVER_HOSTNAME 字段的 config.yaml 键创建 Secret (在以后的步骤中将创建使用此主机名的路由)。

apiVersion: v1
kind: Secret
metadata:
  name: my-config-bundle
data:
  config.yaml: <must include SERVER_HOSTNAME field with your custom hostname>

创建引用上述 Secret路由 组件非受管路由的 QuayRegistry

apiVersion: quay.redhat.com/v1
kind: QuayRegistry
metadata:
  name: some-quay
spec:
  configBundleSecret: my-config-bundle
  components:
  - kind: route
    managed: false

等待 Quay Operator 完全协调 QuayRegistry。然后,通过查找挂载到 Quay 应用程序 pod 中的 Secret 并复制 tls.cert 值来获取生成的 TLS 证书。

使用 TLS 重新加密和您复制的目标 CA 证书创建路由:

apiVersion: v1
kind: Route
metadata:
  name: registry
  namespace: <namespace>
spec:
  to:
    kind: Service
    name: <quay-service-name>
  tls:
    termination: reencrypt
    destinationCACertificate:
      -----BEGIN CERTIFICATE-----
      [...]
      -----END CERTIFICATE-----

现在,您可以使用创建的 Route 访问 Quay registry。

7.1.3. 禁用路由组件

要防止 Operator 创建 Route,请在 QuayRegistry 中将组件标记为 unmanaged :

apiVersion: quay.redhat.com/v1
kind: QuayRegistry
metadata:
  name: some-quay
spec:
  components:
    - kind: route
      managed: false
注意

禁用默认路由意味着您现在负责 创建路由ServiceIngress 来访问 Quay 实例,您使用的 DNS 必须与 Quay 配置中的 SERVER_HOSTNAME 匹配。

7.1.4. 调整受管存储大小

在创建 NooBaa 对象时,Quay Operator 使用 RHOCS 提供的默认值创建默认对象存储(50 Gib)。可以通过两种方式扩展此存储:您可以调整现有 PVC 的大小,或向新存储池添加更多 PVC。

7.1.4.1. 重新定义 Noobaa PVC 的大小

  1. 登录到 OpenShift 控制台,再选择 StoragePersistent Volume Claims
  2. 选择名为 noobaa-default-backing-store-noobaa-pvc-*PersistentVolumeClaim
  3. 在 Action 菜单中,选择 Expand PVC
  4. 输入持久性卷声明的新大小并选择 Expand

几分钟后(取决于 PVC 的大小),扩展的大小应当反映在 PVC 的 Capacity 字段中。

注意

扩展 CSI 卷只是一个技术预览功能。如需更多信息,请参阅 https://access.redhat.com/documentation/en-us/openshift_container_platform/4.6/html/storage/expanding-persistent-volumes

7.1.4.2. 添加另一个存储池

  1. 登录到 OpenShift 控制台并选择 NetworkingRoutes。确保已选中 openshift-storage 项目。
  2. 单击 noobaa-mgmt Route 的 Location 字段。
  3. 登录 Noobaa 管理控制台。
  4. 在主仪表板中,在 Storage Resources 下,选择 Add Storage Resources
  5. 选择 Deploy Kubernetes Pool
  6. 输入新池名称。点击 Next
  7. 选择管理池的 Pod 数量并设置每个节点的大小。点击 Next
  8. 单击 Deploy

几分钟后,额外的存储池将添加到 Noobaa 资源,供 Red Hat Quay 使用。

7.1.5. 自定义默认 Operator 镜像

注意

在生产环境 Quay 环境中不支持使用此机制,强烈建议只用于开发/测试目的。在将非默认镜像用于 Quay Operator 时,无法保证您的部署正常工作。

在某些情况下,覆盖 Operator 使用的默认镜像可能会很有用。这可以通过在 Quay Operator ClusterServiceVersion 中设置一个或多个环境变量来实现。

7.1.5.1. 环境变量

Operator 中使用以下环境变量来覆盖组件镜像:

环境变量

组件

RELATED_IMAGE_COMPONENT_QUAY

base

RELATED_IMAGE_COMPONENT_CLAIR

clair

RELATED_IMAGE_COMPONENT_POSTGRES

postgresclair 数据库

RELATED_IMAGE_COMPONENT_REDIS

redis

注意

覆盖镜像 必须被 清单(@sha256:)来引用,而不是标签(:latest)。

7.1.5.2. 将覆盖应用到正在运行的 Operator

当通过 Operator Lifecycle Manager (OLM)在集群中安装 Quay Operator 时,可以通过修改 ClusterServiceVersion 对象(即 OLM 在集群中运行的 Operator 的表示)来轻松覆盖受管组件容器镜像。使用 Kubernetes UI 或 kubectl/oc 来查找 Quay Operator 的 ClusterServiceVersion

$ oc get clusterserviceversions -n <your-namespace>

使用 UI、oc edit 或任何其他方法,修改 Quay ClusterServiceVersion,使其包含上面概述的环境变量以指向覆盖镜像:

JSONPath:spec.install.spec.deployments[0].spec.template.spec.containers[0].env

- name: RELATED_IMAGE_COMPONENT_QUAY
  value: quay.io/projectquay/quay@sha256:c35f5af964431673f4ff5c9e90bdf45f19e38b8742b5903d41c10cc7f6339a6d
- name: RELATED_IMAGE_COMPONENT_CLAIR
  value: quay.io/projectquay/clair@sha256:70c99feceb4c0973540d22e740659cd8d616775d3ad1c1698ddf71d0221f3ce6
- name: RELATED_IMAGE_COMPONENT_POSTGRES
  value: centos/postgresql-10-centos7@sha256:de1560cb35e5ec643e7b3a772ebaac8e3a7a2a8e8271d9e91ff023539b4dfb33
- name: RELATED_IMAGE_COMPONENT_REDIS
  value: centos/redis-32-centos7@sha256:06dbb609484330ec6be6090109f1fa16e936afcf975d1cbc5fff3e6c7cae7542

请注意,这在 Operator 级别上完成,因此每个 QuayRegistry 都使用相同的覆盖来部署。

7.1.6. AWS S3 CloudFront

如果将 AWS S3 CloudFront 用于后端 registry 存储,请指定私钥,如下例所示:

$ oc create secret generic --from-file config.yaml=./config_awss3cloudfront.yaml --from-file default-cloudfront-signing-key.pem=./default-cloudfront-signing-key.pem test-config-bundle