本页面旨在帮助您诊断在将自管理副本集或分片集群从虚拟机迁移到 Kubernetes(使用 Kubernetes 操作符)时可能出现的问题,包括插件导入失败、干运行和连接问题、身份验证不匹配以及验证错误。有关迁移工作流程的背景信息,请参阅将自管理部署迁移到 Kubernetes。
我在迁移中的哪个阶段?
首先读取 status.conditions[type=Migrating] 条件的 reason 字段。
原因 | 状态 | 含义 |
|---|---|---|
|
| 空运行注释已设置。 |
|
| 所需的 Kubernetes 节点数超过了上次协调的计数。 |
|
|
|
|
| 外部节点存在,但没有任何变化。这也是在初次协调时的原因。 |
|
| 所有外部节点均已移除。 |
优先级是 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 插件在生成任何资源之前验证源自动化配置。在以下各种情况下,它会出错退出,而不是生成不完整或不正确的资源。
MongoDB Ops Manager 或 Cloud Manager 项目有多个部署。
该项目拥有多个分片集群。
该项目包含不属于分片集群的副本集。
该项目没有副本集或分片集群。该插件只能迁移副本集和分片集群部署。
自动化配置没有进程。
分片集群中的分片由与配置服务器相同的副本集支持。迁移不支持这种嵌入式配置服务器拓扑结构。
该插件无法在副本集中找到具有投票权且符合优先级条件的节点,因此无法确定该副本集的源进程。
进程的
processType不是mongod或mongos。
不可配置的路径和设置不匹配
当以下自动化配置设置与 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以外的 LDAPbindMethod进行迁移。
节点异构性
Kubernetes 操作符 从单一来源进程获取 spec.additionalMongodConfig 和 spec.agent.mongod.systemLog。如果您的副本集节点具有不同的配置,请在迁移之前查看所有节点并协调差异 — 生成的资源会将一种配置应用于所有 Kubernetes 节点。
值得采取行动的警告
以下按进程划分的自动化配置设置不会延续到新的 Kubernetes 节点。在迁移之前为它们做好规划:
secondaryDelaySecs隐藏节点
buildIndexes: false
如果您的源部署具有分析节点或延迟节点,请在开始之前规划如何在 Kubernetes 中表示它们。
需要查看的其他项目:
该插件会跳过已禁用的进程;它不会显示为外部节点。
如果进程未配置 TLS,请在迁移之前,在现有虚拟机部署的 MongoDB 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 操作符创建连接验证器作业。
连接性失败
验证器作业退出代码 | 条件状态 | 原因 | 含义 |
|---|---|---|---|
作业仍在运行 |
|
|
|
|
|
| 所有外部节点都可访问并已经身份验证。 |
|
|
| 凭证、身份验证机制或缺失 |
|
|
| DNS、TLS、超时或无法访问的节点。检查作业 Pod 日志。 |
|
|
| 未分类失败。检查作业 Pod 日志。 |
在作业开始之前发生的故障使用原因 OperatorImageUnknown、BuildStatefulSetOptions、AgentCertSecretFailed 和 AgentCertSubject。
一旦没有外部节点留下,Kubernetes 操作符会从 status.conditions 中完全删除 NetworkConnectivityVerified 条件。
作业前失败
Kubernetes 操作符可能在连接验证作业启动之前失败,原因如下:
OperatorImageUnknownBuildStatefulSetOptionsAgentCertSecretFailedAgentCertSubject
TLS CA 不匹配
Kubernetes 节点的证书必须由签署虚拟机节点证书的同一个证书颁发机构签发。如果不是,虚拟机和 Kubernetes 节点之间的连接验证和复制将会失败。
memberConfig 问题
spec.memberConfig条目比spec.members少。为每个节点添加一个条目。对于集群,Kubernetes 操作符 会忽略顶层的
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 名称。
验证惊喜
验证可以在设置 dry-运行 注释 (
mongodb.com/migration-dry-run) 时触发,而不仅仅是在您开始实际迁移之后。如果以间接方式应用了会超过限制的更改,则投票节点数量限制验证可在协调时出现,而不是在接入时出现。
批处理过多更改到单一编辑中可能导致部署丧失 quorum。每次只进行一种改变:添加 Kubernetes 节点、删除外部节点、或更改投票和优先级。
要收集的诊断
如果在您完成上述部分后,问题仍然存在,请在联系支持人员之前收集以下信息:
MongoDB资源 YAML,包括status.conditions:kubectl get mdb <resource-name> -n <namespace> -o yaml 部署的
MongoDBUser资源。Kubernetes 操作符 日志。
连接性验证器作业的 pod 日志。
来自 Ops Manager 或 Cloud Manager 的自动化配置 JSON。
然后,联系 技术支持。