安装Kubernetes Operator 时,它会从 Quay.io容器注册表中提取映像。Kubernetes Operator 映像基于 Red Hat UBI 8 和 9 操作系统。MongoDB每天都会为最新的操作系统和支持库更新重建Kubernetes Operator 映像。
注意
静态容器拉取的MongoDB 助手映像始终位于 Red Hat UBI 9 上。
官方镜像具有以下优点:
它们每天都会针对最新的上游漏洞修复进行重建。
MongoDB 会对它们进行测试、维护和支持。
要查看每个映像的所有可用版本,请参阅以下链接。
图像名称 | 说明 | 支持的架构 |
|---|---|---|
基于 Red Hat UBI 9 构建的 MongoDB Agent 图像,并用于 静态容器、应用程序数据库和 MongoDB Community Edition 部署。 | 支持 x86-64、ARM64、s390x 和 ppc64 文件。支持所有版本的MongoDB Controllers for Kubernetes Operator 的静态和非静态容器。 | |
旧版MongoDB 助手映像。 | 支持 x86-64 和 ARM64。支持Kubernetes Operator 的所有版本的MongoDB控制器的非静态容器。仅支持Kubernetes Operator 1.2.0 及更早版本的MongoDB控制器的静态容器。 | |
x86-64, ARM64, s390x, ppc64le | ||
| x86-64, ARM64, s390x, ppc64le | |
用于非静态容器的MongoDB数据库环境映像。 | x86-64, ARM64, s390x, ppc64le | |
| x86-64, ARM64, s390x, ppc64le | |
Ops Manager 映像。 | 仅限 x86-64 | |
| 仅限 x86-64 |
静态容器(公共预览版)
静态容器比非静态容器更简单、更安全。 静态容器在运行时是不可变的,这意味着它们不会从用于创建容器的映像中更改。 此外:
运行时,静态容器不会通过网络连接下载二进制文件或运行脚本或其他实用程序。 静态容器仅下载运行时配置文件。
运行时,静态容器不会修改除存储卷挂载之外的任何文件。
您可以对容器映像运行安全扫描,以确定实际运行的容器,并且运行的容器不会运行映像中定义以外的二进制文件。
静态容器不要求您在MongoDB MongoDB Ops Manager或其他 HTTPS 服务器上托管 二进制文件,如果您有气隙环境,这一点尤其有用。
您无法为静态容器运行大量
CMD脚本。您无法使用
initContainer在静态容器之间复制文件。
注意
使用静态容器时, MongoDB数据库 CR 和应用程序数据库部署之间的容器布局和资源限制不同。
当部署为静态容器时, MongoDB数据库 CR 由两个具有不同角色的容器组成:
The
mongodb-agent容器运行 MongoDB Agent,然后 MongoDB Agent 运行mongod进程。该容器处理实际的数据库工作负载。mongodb-enterprise-server容器提供MongoDB二进制文件,但不运行任何活动进程。
要修改MongoDB 数据库资源的资源限制,请在 mongodb-agent容器上指定所需的资源限制。在 mongodb-enterprise-server容器上设立的资源限制对性能没有功能性影响,但仍计入节点资源分配。
对于静态架构中的应用程序数据库,mongod 直接在 mongod容器中运行,而不是在 mongodb-agent 中运行。要修改应用程序数据库的资源限制,请改为在 mongod容器上指定所需的资源限制。
您可以使用静态容器的公共预览版来代替现有的非静态容器,该容器会在运行时从Cloud Manager或MongoDB Ops Manager或互联网下载MongoDB二进制文件。 您可以使用此页面上的程序为所有或单个MongoDB部署启用或禁用静态容器。
静态容器默认使用mongodb-enterprise-server Quay.io存储库中的映像,但如果您为Kubernetes节点配置了自己的注册表,则可以使用自己的注册表。
容器映像变体
MongoDB以 ubi8、ubi9 和 ubi9-slim 变体发布 mongodb-enterprise-server 映像。 MongoDB发布以MongoDB 6.0.27、7.0.30 和 8.0.19 开头的 ubi9-slim 映像。
默认下,使用静态容器的部署使用 ubi9 变体。应用程序数据库支持静态和非静态容器中的映像变体。非静态应用程序数据库默认使用 ubi8 变体,因为 6.0.4 之前的MongoDB版本没有 ubi9 映像。
该映像变体仅更改Kubernetes Operator 部署的MongoDB Server映像。该变体不会更改 spec.version 或自动化配置中的MongoDB版本。
要选择图像变体,请使用以下方法之一:
要为所有部署设立默认映像变体,设立Helm操作符.mdbDefaultImageType 值。此值在Kubernetes Operator 上配置 MDB_DEFAULT_IMAGE_TYPE 环境变量。
要为单个部署设立映像变体,设立在
MongoDB、MongoDBMultiCluster或MongoDBOpsManager资源上设置metadata.annotations.mongodb.com/v1.containerImageType注解。在MongoDBOpsManager资源上,注解适用于应用程序数据库。
以下示例使用 ubi9-slim 映像变体部署副本集:
apiVersion: mongodb.com/v1kind: MongoDBmetadata: name: my-replica-set annotations: mongodb.com/v1.containerImageType: "ubi9-slim"spec: version: "8.0.19"注解优先于操作符范围的默认。在使用非静态容器的 MongoDB 和 MongoDBMultiCluster 资源上,该注解无效。 Kubernetes Operator 在资源状态中报告警告。
如果您设立了不支持的值, Kubernetes Operator 会忽略该值。部署回退到默认映像变体。不支持的注解值会在资源状态中产生警告。不支持的 Helm 值会在Kubernetes Operator日志中产生警告。
架构
静态和非静态容器的架构有很大不同,从一种容器迁移到另一种容器需要几个步骤。 要了解更多信息,请参阅迁移到静态容器和迁移到非静态容器。
非静态容器架构
默认的非静态容器架构假设您引导一个空壳容器,下载并启动MongoDB Agent ,然后从mongod mongoshCloud Manager或 下载 和MongoDB Ops Manager 的二进制文件。
静态容器架构
静态容器架构使用Kubernetes的共享命名空间功能将MongoDB 助手作为单独的进程运行,因此它可以控制完整的mongod生命周期并避免通过网络下载文件。
对比
下表总结了静态和非静态容器架构之间的主要区别:
方面 | 非静态容器 | 静态容器 |
|---|---|---|
二进制交付 | 在运行时从 Internet、Cloud Manager 或 Ops Manager 下载 MongoDB 二进制文件。 | 使用预先构建的容器影像。无运行时下载。 |
自动组件升级 | MongoDB Ops Manager 可能会自动将 MongoDB Agent、BI Connector 和 MongoDB Database Tools 升级到最新兼容版本。 | 组件版本固定到其容器图像,不会自动升级。 |
MongoDB 版本升级 | MongoDB Agent 处理 MongoDB 升级。 | Kubernetes 操作符 通过替换容器图像来处理 MongoDB 升级,这会触发滚动重启。 |
容器布局 | 单个容器运行 MongoDB Agent 和 MongoDB 数据库。 | 两个独立容器:一个用于 MongoDB Agent,一个用于 MongoDB 数据库。 |
Init 容器 | 使用 init 容器进行启动脚本和就绪探针。 | 不使用 init 容器。 |
与本地或远程模式的兼容性
如果使用静态容器,则无需将MongoDB Ops Manager配置为在本地模式或远程模式 下运行,除非使用可查询备份。 在静态容器架构中,代理和 mongod 的二进制文件有自己的容器映像,并且这些容器映像不是从MongoDB Ops Manager下载的。
可查询备份是一个例外,因为在非静态容器架构中,默认,备份守护程序会下载并运行所有备份版本的MongoDB Server二进制文件。 这种默认的MongoDB行为破坏了用于运行备份守护程序的容器的完全静态特性。 如果使用可查询备份,则仍须使用本地或远程模式托管相关MongoDB Server二进制文件。 要学习;了解更多信息,请参阅配置MongoDB Ops Manager资源以使用本地模式或配置MongoDB Ops Manager资源以使用远程模式。
如果您以前使用过“远程”或“本地”模式并且不想使用可查询备份,请执行以下操作以确保可以将 mongodb-enterprise-server 映像 下载到 Pod 使用的 节点 上:
为Kubernetes节点配置内部容器注册表。
除非您使用本地容器注册表,否则节点将从 Quay.io下载映像。
下载并添加
mongodb-enterprise-server映像。
限制
如果启用静态容器:
IBM ZSeries (s390x) 或IBM POWER (ppc64le)硬件架构上的部署仅支持MongoDB 8.0.12 及更高版本的静态容器。
对于MongoDB Ops Manager,仅 6.0.27+、 7.0.12+ 和 8.0.0+ 兼容。Kubernetes Operator 会根据您选择用来管理特定部署的MongoDB Ops Manager版本,自动使用正确版本的MongoDB 助手容器。
使用MongoDB Cloud Manager时,您的MongoDB Agent助手版本可能无法兼容最新版本的MongoDB Cloud Manager ,因为Kubernetes Operator 无法调用MongoDB Cloud Manager中的
agentVersion端点。 要使用 确保您的MongoDB Agent MongoDB Cloud Manager是最新的,您可以执行以下操作之一:通过覆盖MongoDB 助手的 StatefulSet 容器映像,在 MongoDB资源规范 中指定 兼容的 MongoDB 助手版本。示例:
podSpec: podTemplate: spec: containers: - name: mongodb-agent image: quay.io/mongodb/mongodb-agent:13.49.1.10399-1将Kubernetes Operator 升级到最新版本,这会自动更新MongoDB Agent助手。
升级MongoDB版本Atlas Triggers所有 Pod 的滚动重启,并且可能导致更多选举,最多可达 Pod 的数量。 任何trigger滚动重启的更新都是如此。
您无法从MongoDB database MongoDB Agent的状态 确定是否进行了 升级。当Kubernetes在升级后轮换 Pod 时, MongoDB Agent助手会替换健康状态文件,因此您无法从健康状态中看出发生了版本更改,只能从当前健康状态中看出。
常见问题解答
静态容器支持本地模式还是远程模式?
不需要,如果您使用静态容器,则无需将MongoDB Ops Manager配置为在本地模式或远程模式下运行,除非您使用可查询备份。 要学习;了解更多信息,请参阅本地和远程模式。
静态容器有哪些变化?
静态容器不会在运行时下载MongoDB二进制文件。相反,它使用来自 mongodb-enterprise-server Quay.io存储库的映像。要学习;了解有关更改的详情,请参阅步骤 6。
如何验证部署是否以静态模式运行?
有多种方法可以确定您的部署是否正在使用静态容器。 要学习;了解详情,请参阅步骤7 。
迁移到静态容器
要从非静态迁移到静态容器,请按照以下步骤设置MongoDB Agent环境变量并启用静态容器。 您还可以在安装或升级过程中启用静态容器。
查看 限制。
删除 StatefulSet 覆盖项(如果有)。
静态容器架构不使用初始化容器。 如果存在针对初始化容器的覆盖项,则从非静态容器到静态容器的迁移将失败。
从MongoDB资源规范或MongoDB Ops Manager资源规范中删除初始化容器的任何 StatefulSet 覆盖项。示例,确保尚未为 initContainers 配置以下设置:
Ops Manager:
spec.statefulSet.spec应用程序数据库:
spec.applicationDatabase.podSpecDatabase: StatefulSet 设置
为MongoDB Agent映像设置环境变量。
在Kubernetes Operator配置文件中,定义MDB_AGENT_IMAGE_REPOSITORY环境变量,以指定Kubernetes Operator 从中下载静态容器的MongoDB Agent助手映像的存储库。
在Kubernetes Operator Helm 图表 中,定义 KubernetesMongoDB Agent注册表。 指定 代理 代理 从中下载静态容器的 映像的存储库。
保存并应用文件。
保存更改后,重新应用配置。
如果您在没有OpenShift的情况下使用Kubernetes ,请运行:
kubectl apply -f mongodb-kubernetes.yaml如果将Kubernetes与OpenShift结合使用:
oc apply -f mongodb-kubernetes-openshift.yamlhelm upgrade mongodb-kubernetes-operator mongodb/mongodb-kubernetes \ --set registry.pullPolicy='IfNotPresent'这会启动部署中所有 Pod 的滚动重启。
启用静态容器。
选择下方相应的标签页,一次性为所有MongoDB部署(包括现有部署)启用静态容器,或一次启用一个部署。
在Kubernetes Operator配置文件中,设立MDB_DEFAULT_ARCHITECTURE或操作符.mdbDefaultArchitecture 为static 。
在特定部署的 MongoDB 资源规范中,将 metadata.annotations.mongodb.com/v1.architecture 注释设置为 static。
保存并应用文件。
保存更改后,重新应用配置。
如果您在没有OpenShift的情况下使用Kubernetes ,请运行:
kubectl apply -f <my-config-file>.yaml如果将Kubernetes与OpenShift结合使用:
oc apply -f <my-config-file>.yamlhelm upgrade mongodb-kubernetes-operator mongodb/mongodb-kubernetes \ --set <setting_1> --set <setting_2> --set operator.mdbDefaultArchitecture="static"Kubernetes Operator 会更新MongoDB 部署的 StatefulSet 映像,从之前同时托管MongoDB 助手和MongoDB 数据库的单个容器过渡到具有两个独立容器的新配置:一个用于MongoDB 助手,另一个用于MongoDB 数据库。此更新会启动滚动重启。
迁移到静态容器时,会发生以下应用:
Kubernetes节点使用其配置的容器注册表来执行下载。
监控代理和自动化代理版本一致。
Kubernetes Operator 而不是代理来处理MongoDB升级。
Kubernetes Operator 会替换现有映像,从而导致滚动重启。
迁移到非静态容器
要从静态容器迁移到非静态容器,请按照以下步骤禁用静态容器。 您还可以在安装或升级过程中禁用静态容器。
禁用静态容器。
选择下方相应的标签页,一次性为所有 MongoDB 部署(包括现有部署)禁用静态容器,或一次禁用一个部署。
在Kubernetes Operator配置文件中,设立MDB_DEFAULT_ARCHITECTURE或操作符.mdbDefaultArchitecture 为non-static 。
在特定部署的 MongoDB 资源规范中,将 metadata.annotations.mongodb.com/v1.architecture 注释设置为 non-static。
保存并应用文件。
保存更改后,重新应用配置。
如果您在没有OpenShift的情况下使用Kubernetes ,请运行:
kubectl apply -f <my-config-file>.yaml如果将Kubernetes与OpenShift结合使用:
oc apply -f <my-config-file>.yamlhelm upgrade mongodb-kubernetes-operator mongodb/mongodb-kubernetes \ --set <setting_1> --set <setting_2> --set operator.mdbDefaultArchitecture="non-static"Kubernetes Operator 会替换MongoDB 部署的 StatefulSet 映像,并对部署中的所有 Pod 启动滚动重启。