6.4. 限制代理容器镜像的自动升级
默认情况下,Operator 会自动升级部署中的每个代理,以使用最新可用的容器镜像。在部署的自定义资源(CR)中,您可以通过指定版本号或特定容器镜像的 URL 来限制 Operator 升级镜像的能力。
如果要限制代理容器镜像的自动升级,请确保您的 CR 具有版本号或代理和 init 容器镜像的组合 URL。
6.4.1. 使用版本号限制镜像的自动升级
您可以在新版本可用时,限制代理自动升级的容器镜像版本。
当您根据版本号限制升级时,Operator 继续自动升级代理以使用包含部署的安全修复的任何新镜像。
流程
编辑代理部署的主代理 CR 实例。
使用 OpenShift 命令行界面:
以具有特权的用户身份登录到 OpenShift,以便在项目中为代理部署编辑和部署 CR。
$ oc login -u <user> -p <password> --server=<host:port>
编辑 CR。
oc edit ActiveMQArtemis <CR instance name> -n <namespace>
使用 OpenShift Container Platform Web 控制台:
- 以具有特权在项目中为代理部署 CR 的用户登录到控制台。
-
在左侧窗格中,点
。 - 点 Red Hat Integration - AMQ Broker for RHEL 8 (Multiarch) operator。
- 点 AMQ Broker 选项卡。
- 单击 ActiveMQArtemis 实例名称的名称。
点 YAML 标签。
在控制台中,会打开 YAML 编辑器,供您编辑 CR 实例。
注意在 CR 的
status
部分中,.status.version.brokerVersion
字段显示当前部署的 AMQ Broker 版本。
在
spec.version
属性中,指定 Operator 可将代理和 init 容器镜像升级到的版本。以下是您可以指定的值示例。- 例子
在以下示例中,Operator 会将部署中的当前容器镜像升级到 7.11.0。
spec: version: '7.11.0' ...
在以下示例中,Operator 会将部署中的当前容器镜像升级到最新可用的 7.10.x 镜像。例如,如果您的部署使用 7.10.1 容器镜像,Operator 会自动将镜像升级到 7.10.2,但不升级到 7.11.7。
spec: version: '7.10' ...
在以下示例中,Operator 会将部署中的当前容器镜像升级到最新的 7.x.x 镜像。例如,如果您的部署使用 7.10.2 镜像,Operator 会自动将镜像升级到 7.11.7。
spec: version: '7' ...
注意要在容器镜像的次版本(例如,从 7.10.x 升级到 7.11.x)之间升级,您需要有一个与新容器镜像相同的次版本的 Operator。例如,若要从 7.10.2 升级到 7.11.7,必须安装 7.11.x Operator。
- 保存 CR。
除了 spec.version
属性外,请确保 CR 不包含 spec.deploymentPlan.image
或 spec.deploymentPlan.initImage
属性。这两个属性都覆盖 spec.version
属性。如果 CR 具有这些属性之一以及 spec.version
属性,则部署的代理和 init 镜像版本可能会被分离,这可能会阻止代理运行。
保存 CR 时,Operator 会首先验证对为 spec.version
指定的 AMQ Broker 版本的升级是否可用于现有部署。如果您指定了要升级到的 AMQ Broker 的无效版本,例如,一个还不可用的版本,Operator 会记录警告信息,且不执行进一步的操作。
但是,如果对指定版本的升级可用,Operator 会 升级部署中的每个代理,以使用与新的 AMQ Broker 版本对应的代理容器镜像。
Operator 使用的代理容器镜像在 Operator 部署的 operator.yaml
配置文件中的环境变量中定义。环境变量名称包含 AMQ Broker 版本的标识符。例如,环境变量 RELATED_IMAGE_ActiveMQ_Artemis_Broker_Kubernetes_7117
对应于 AMQ Broker 7.11.7。
当 Operator 应用 CR 更改时,它会重启部署中的每个代理 Pod,以便每个 Pod 使用指定的镜像版本。如果您的部署中有多个代理,则一次只有一个代理 Pod 关闭并重启。
其他资源
- 要了解 Operator 如何使用环境变量来选择代理容器镜像,请参阅 第 2.6 节 “Operator 如何选择容器镜像”。
- 要查看部署的状态,请参阅 第 6.4.3 节 “验证对自动升级的限制”
6.4.2. 使用镜像 URL 限制镜像自动升级
如果要升级部署中的代理以使用特定的容器镜像,您可以在 CR 中指定镜像的 registry URL。在 Operator 将代理升级到指定的容器镜像后,在替换 CR 中的镜像 URL 前,不会进一步升级。例如,Operator 不会自动升级代理以使用包含部署的镜像的安全修复的较新的镜像。
如果要使用镜像 URL 限制自动升级,请为 CR 中的 spec.deploymentPlan.image
和 spec.deploymentPlan.initImage
属性指定 URL,以确保代理和 init 容器镜像匹配。如果您只指定了一个容器镜像的 URL,则代理和 init 容器镜像可以分离,这可能会阻止代理运行。
如果 CR 在 spec.deploymentPlan.image
和 spec.deploymentPlan.initImage
属性之外有一个 spec.version
属性,Operator 会忽略 spec.version
属性。
流程
获取 Operator 可以升级当前镜像的代理和 init 容器镜像的 URL。
- 在 Red Hat Catalog 中,打开 broker 容器组件页面: AMQ Broker for RHEL 8 (Multiarch)。
- 在 Architecture 下拉菜单中,选择您的架构。
- 在 Tag 下拉菜单中,选择与您要安装的镜像对应的标签。标签会根据发行日期按按时间顺序显示。标签由发行版本和分配的标签组成。
- 打开 Get this image 选项卡。
- 在 Manifest 字段中,点 Copy 图标。
- 将 URL 粘贴到文本文件中。
- 在 Red Hat Catalog 中,打开 init 容器组件页面: AMQ Broker Init for RHEL 8 (Multiarch)
- 要获取 init 容器镜像的 URL,请重复您遵循的步骤以获取代理容器镜像的 URL。
编辑代理部署的主代理 CR 实例。
使用 OpenShift 命令行界面:
以具有特权的用户身份登录到 OpenShift,以便在项目中为代理部署编辑和部署 CR。
$ oc login -u <user> -p <password> --server=<host:port>
编辑 CR。
oc edit ActiveMQArtemis <CR instance name> -n <namespace>
使用 OpenShift Container Platform Web 控制台:
- 以具有特权在项目中为代理部署 CR 的用户登录到控制台。
-
在左侧窗格中,点
。 - 点 Red Hat Integration - AMQ Broker for RHEL 8 (Multiarch) operator。
- 点 AMQ Broker 选项卡。
- 单击 ActiveMQArtemis 实例名称的名称。
点 YAML 标签。
在控制台中,会打开 YAML 编辑器,供您配置 CR 实例
复制您在文本文件中记录的代理和 init 容器镜像的 URL,并将它们插入到 CR 中的
spec.deploymentPlan.image
和spec.deploymentPlan.initImage
字段中。例如:spec: ... deploymentPlan: image: registry.redhat.io/amq7/amq-broker-rhel8@137b893ad15e0cd5353bae134c8fae833257a12641b12d0f774f1565ce66f63c initImage: registry.redhat.io/amq7/amq-broker-init-rhel8@b0b3684ef1ebf8b44d3a4c46391984173792dde1bd7363ea06d43a8f95a717d0 ...
保存 CR。
保存 CR 时,Operator 会升级代理以使用新镜像,并使用这些镜像,直到您再次更新
spec.deploymentPlan.image
和spec.deploymentPlan.initImage
属性的值。
如果您在没有设置镜像 URL 的情况下部署了 AMQ Broker,您可以原样设置镜像 URL,以防止 Operator 升级部署的当前镜像。您可以找到 .status.version.image
和 .status.version.initImage
属性中部署的镜像的 registry URL,它们位于 CR 的 status
部分。
如果您从 .status. version.image 和
属性复制镜像 URL,并将它们分别插入到 .status
.version.initImagespec.deploymentPlan.image
和 spec.deploymentPlan.initImage
属性中,Operator 不会升级当前部署的镜像。
其它资源
- 要查看部署的状态,请参阅 第 6.4.3 节 “验证对自动升级的限制”。
6.4.3. 验证对自动升级的限制
保存 CR 后,Operator 会验证 CR 是否没有包含以下内容之一:
-
没有
spec.deploymentPlan.initImage
属性的spec.deploymentPlan.image
属性,反之亦然。 -
带有 spec.deploymentPlan.
image 和
属性的spec.deploymentPlan
.initImagespec.version
属性,或两者。
这些配置都可能导致升级后代理和 init 容器镜像的不同版本,这可能会阻止代理启动。如果 CR 中的任何一个配置,Operator 会将 Valid
条件的状态设置为 Unknown
作为警告。例如,如果 CR 有一个 spec.deploymentPlan.image
属性,但没有 spec.deploymentPlan.initImage
属性,反之亦然,Operator 会在 CR 中显示 Valid
条件的以下状态信息。
status: conditions: - lastTransitionTime: "2023-05-18T15:17:22Z" message: Init image and broker image must both be configured as an interdependent pair observedGeneration: 1 reason: InitImageMustBePairedWithBrokerImage status: "Unknown" type: Valid
具有 Unknown
的 status 值的 Valid
条件不会阻止 Operator 更新 StatefulSet。但是,红帽建议您通过在 CR 中指定组合的 spec.deploymentPlan.image ' 和 'spec.deploymentPlan.initImage
属性或 spec.version 属性
来修复 Valid
条件的状态。
如果 CR 具有 spec.version
属性,Operator 也会验证版本格式是否正确,且版本位于 Operator 支持的有效范围内。