对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
Docs 菜单

对Kubernetes迁移进行故障排除

此页面可帮助您诊断在Kubernetes Operator 下将自管理副本集或分片集群从虚拟机迁移到Kubernetes时可能出现的问题,包括插件导入失败、试运行和连接问题、身份验证不匹配和验证错误。有关迁移工作流程的背景,请参阅将自托管部署迁移到Kubernetes。

首先读取 status.conditions[type=Migrating] 条件的 reason 字段。

原因
状态
含义

Validating

True

空运行注释已设置。

Extending

True

所需的Kubernetes成员数超过了上次核对的数量。

Pruning

True

externalMembers 计数降至 status.migrationObservedExternalMembersCount 以下。

InProgress

True

外部节点存在,但没有任何变化。这也是在初次协调时的原因。

MigrationComplete

False

所有外部成员均已删除。

优先级是 Validating > Extending > Pruning > InProgress。一个也会扩展 Kubernetes 侧的清理报告 Extending,这是逐步更改的另一个原因。

不允许同时进行剪枝和扩展。

要根据迁移完成脚本,请使用 kubectl wait --for=condition=Migrating=False 而不是轮询 status.phase。

  • 如果原因仍然是 Extending,则Kubernetes Operator 添加的Kubernetes节点仍在预配。等待它们达到目标状态。

  • 如果原因保持 InProgress 且外部成员计数未更改,则您对资源的上次编辑是无操作: Kubernetes Operator 未检测到需要动作的更改。

kubectl mongodb migrate-to-mck 插件在生成任何资源之前验证源自动化配置。在以下各种情况下,它会出错退出,而不是生成不完整或不正确的资源。

  • Ops Manager或Cloud Manager项目具有多个部署。

  • 该项目有多个分片集群。

  • 项目包含不属于分片集群的副本集。

  • 该项目没有副本集或分片的集群。该插件只能迁移副本集和分片集群部署。

  • 自动化配置没有进程。

  • 分片集群中的分片由与配置服务器相同的副本集支持。迁移不支持这种嵌入式配置服务器拓扑结构。

  • 该插件在副本集找不到有投票权且符合优先级条件的成员,因此无法确定该副本集的源进程。

  • 进程具有 mongod 或 mongos 以外的 processType。

当以下自动化配置设置与 Kubernetes Operator 要求的内容不符时,该插件会将其标记出:

  • auth.keyFile 与 Kubernetes 操作符源自的路径不同 spec.downloadBase.

  • auth.keyFileWindows 已设立。

  • monitoringAgentConfig.logPath 或者 backupAgentConfig.logPath 设置为非默认路径。

  • 一个进程具有与 Kubernetes 操作符的默认值不同的 authSchemaVersion。

  • auth.autoUser 启用身份验证时为空。

  • auth.autoUser 在 auth.usersWanted 中没有与其数据库匹配的条目。如果没有匹配的条目,代理身份验证将在迁移后失败。

  • MONGODB-X509 代理身份验证要求在自动化配置中设立tls.autoPEMKeyFilePath。请参阅 spec.security.authentication.agents.autoPEMKeyFilePath。

  • 不支持迁移simple 以外的LDAP bindMethod。

Kubernetes Operator 从单个源进程获取 spec.additionalMongodConfig 和 spec.agent.mongod.systemLog。如果您的副本集成员具有不同的配置,请在迁移之前查看所有成员并协调差异 — 生成的资源会将一种配置应用于所有Kubernetes成员。

以下每进程自动化配置设置不会延续到新的Kubernetes成员。在迁移之前做好规划:

  • secondaryDelaySecs

  • 隐藏节点

  • buildIndexes: false

如果您的源部署具有分析节点或延迟节点,请在开始之前规划如何在 Kubernetes 中表示它们。

需要查看的其他项目:

  • 该插件会跳过已禁用的进程;它不显示为外部成员。

  • 如果进程未配置 TLS,请在迁移之前在现有虚拟机部署上的Ops Manager或Cloud Manager中将 net.tls.mode设立为 disabled。请勿对生成的 MongoDB资源设立此项。否则, Kubernetes成员的 TLS 设置与源进程不匹配,迁移会导致计划外的部署更改。

  • 如果进程的 logRotate 或 auditLogRotate 设置与项目级别的配置不同, Kubernetes Operator 将使用项目级别的值。

mongodb.com/migrate-tool-version 注释记录生成该资源的 kubectl mongodb migrate-to-mck 插件版本。Kubernetes 操作符在每次协调时,包括在演练运行期间,都会对此注释对比其自身的版本进行验证。如果版本不兼容,请使用兼容的插件版本重新生成资源。

删除 <resourceName>-connectivity-check 作业。下一次协调会重新创建它。

如果作业从未创建,请检查您的 Kubernetes RBAC 权限是否包含 batch/jobs。缺少 batch/jobs 权限会阻止 Kubernetes 操作符创建连接验证器作业。

验证器作业退出代码
条件状态
原因
含义

作业仍在运行

Unknown

Running

status.phase 为 ConnectivityCheckRunning。

0

True

NetworkValidationPassed

所有外部节点都可访问并已经身份验证。

2

False

AuthenticationFailed

档案、身份验证机制或缺少 __system@local角色。

3

False

NetworkFailed

DNS、TLS、超时或无法访问的成员。检查作业 Pod 日志。

1 或其他

False

UnknownError

未分类失败。检查作业 Pod 日志。

在作业开始之前发生的故障使用原因 OperatorImageUnknown、BuildStatefulSetOptions、AgentCertSecretFailed 和 AgentCertSubject。

一旦没有外部节点留下,Kubernetes 操作符会从 status.conditions 中完全删除 NetworkConnectivityVerified 条件。

Kubernetes 操作符可能在连接验证作业启动之前失败,原因如下:

  • OperatorImageUnknown

  • BuildStatefulSetOptions

  • AgentCertSecretFailed

  • AgentCertSubject

Kubernetes成员的证书必须由签署虚拟机成员证书的同一证书颁发机构颁发。否则,虚拟机和Kubernetes成员之间的连接验证和复制将失败。

  • spec.memberConfig 条目比 spec.members 少。为每个节点添加一个条目。

  • Kubernetes Operator 会忽略分片的片集群的顶级 spec.memberConfig字段。

警告

在增加节点数之前设置 spec.memberConfig

默认情况下,新的 Kubernetes 节点作为投票节点加入。CRD 默认是 votes: 1 和 priority: "1",这允许仍在同步的节点在完成初始同步之前参与选举。

MongoDB 建议您在增加节点数量之前,为每个新的 Kubernetes 节点写入一个 spec.memberConfig 记录,并使用 votes: 0 和 priority: "0",以防尚在同步的节点赢得选举。votes是一个整数。priority是一个字符串。

资源名称或副本集名称太长,或者不是有效的 RFC 1123 名称。使用 spec.replicaSetNameOverride 或 --resource-name-override 提供有效的Kubernetes名称。

  • 验证可以在设立空运行注解 (mongodb.com/migration-dry-run) 时触发,而不仅仅是在开始真正迁移后触发。

  • 如果以间接方式应用了会超过限制的更改,则投票节点数量限制验证可在协调时出现,而不是在接入时出现。

  • 批处理过多更改到单一编辑中可能导致部署丧失 quorum。每次只进行一种改变:添加 Kubernetes 节点、删除外部节点、或更改投票和优先级。

如果在您完成上述部分后,问题仍然存在,请在联系支持人员之前收集以下信息:

  • MongoDB资源YAML,包括 status.conditions:

    kubectl get mdb <resource-name> -n <namespace> -o yaml
  • 用于部署的MongoDBUser 资源。

  • Kubernetes Operator 日志。

  • 连接性验证器作业的 pod 日志。

  • 来自Ops Manager或Cloud Manager 的自动化配置JSON 。

然后,联系技术支持。