此页面可帮助您诊断在Kubernetes Operator 下将自管理副本集或分片集群从虚拟机迁移到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 插件在生成任何资源之前验证源自动化配置。在以下各种情况下,它会出错退出,而不是生成不完整或不正确的资源。
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以外的LDAPbindMethod。
成员异质性
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 操作符创建连接验证器作业。
连接性失败
验证器作业退出代码 | 条件状态 | 原因 | 含义 |
|---|---|---|---|
作业仍在运行 |
|
|
|
|
|
| 所有外部节点都可访问并已经身份验证。 |
|
|
| 档案、身份验证机制或缺少 |
|
|
| DNS、TLS、超时或无法访问的成员。检查作业 Pod 日志。 |
|
|
| 未分类失败。检查作业 Pod 日志。 |
在作业开始之前发生的故障使用原因 OperatorImageUnknown、BuildStatefulSetOptions、AgentCertSecretFailed 和 AgentCertSubject。
一旦没有外部节点留下,Kubernetes 操作符会从 status.conditions 中完全删除 NetworkConnectivityVerified 条件。
作业前失败
Kubernetes 操作符可能在连接验证作业启动之前失败,原因如下:
OperatorImageUnknownBuildStatefulSetOptionsAgentCertSecretFailedAgentCertSubject
TLS CA 不匹配
Kubernetes成员的证书必须由签署虚拟机成员证书的同一证书颁发机构颁发。否则,虚拟机和Kubernetes成员之间的连接验证和复制将失败。
memberConfig 问题
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 。