第 7 章 高级概念
7.1. 自定义 Quay 部署
Quay Operator 对部署 Quay 及其依赖项采取建议的策略,但有一些位置可以自定义 Quay 部署。
7.1.1. Quay 应用程序配置
部署后,可以使用配置编辑器 UI 或修改包含 Quay 配置捆绑包的 Secret
来正常配置 Quay 应用本身。Operator 使用 spec.configBundle
,但不会监视此资源的变化。建议对新的 Secret
字段中命名的 SecretSecret
资源进行配置更改,并更新 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>
; 的 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
禁用默认路由意味着您现在负责 创建路由
、Service
或 Ingress
来访问 Quay 实例,您使用的 DNS 必须与 Quay 配置中的 SERVER_HOSTNAME
匹配。
7.1.4. 调整受管存储大小
在创建 NooBaa
对象时,Quay Operator 使用 RHOCS 提供的默认值创建默认对象存储(50 Gib)。可以通过两种方式扩展此存储:您可以调整现有 PVC 的大小,或向新存储池添加更多 PVC。
7.1.4.1. 重新定义 Noobaa PVC 的大小
-
登录到 OpenShift 控制台,再选择
Storage
→Persistent Volume Claims
。 -
选择名为
noobaa-default-backing-store-noobaa-pvc-*
的PersistentVolumeClaim
。 -
在 Action 菜单中,选择
Expand PVC
。 -
输入持久性卷声明的新大小并选择
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. 添加另一个存储池
-
登录到 OpenShift 控制台并选择
Networking
→Routes
。确保已选中openshift-storage
项目。 -
单击
noobaa-mgmt
Route 的Location
字段。 - 登录 Noobaa 管理控制台。
-
在主仪表板中,在
Storage Resources
下,选择Add Storage Resources
。 -
选择
Deploy Kubernetes Pool
-
输入新池名称。点击
Next
。 -
选择管理池的 Pod 数量并设置每个节点的大小。点击
Next
。 -
单击
Deploy
。
几分钟后,额外的存储池将添加到 Noobaa 资源,供 Red Hat Quay 使用。
7.1.5. 自定义默认 Operator 镜像
在生产环境 Quay 环境中不支持使用此机制,强烈建议只用于开发/测试目的。在将非默认镜像用于 Quay Operator 时,无法保证您的部署正常工作。
在某些情况下,覆盖 Operator 使用的默认镜像可能会很有用。这可以通过在 Quay Operator ClusterServiceVersion
中设置一个或多个环境变量来实现。
7.1.5.1. 环境变量
Operator 中使用以下环境变量来覆盖组件镜像:
环境变量 | 组件 |
|
|
|
|
|
|
|
|
覆盖镜像 必须被 清单(@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