此页面可帮助您诊断在Kubernetes Operator 下将自管理副本集或分片集群从虚拟机迁移到Kubernetes时可能出现的问题,包括插件导入失败、试运行和连接问题、身份验证不匹配和验证错误。有关迁移工作流程的背景,请参阅将自托管部署迁移到Kubernetes。
我处于迁移的哪个阶段?
首先读取 status.conditions[type=Migrating] 条件的 reason字段。
原因 | 状态 | 含义 |
|---|---|---|
|
| 已设立试运行注解。 |
|
| 所需的Kubernetes成员数超过了上次核对的数量。 |
|
| The |
|
| 外部成员存在,但没有任何变化。这也是第一次和解的原因。 |
|
| 所有外部成员均已删除。 |
Precedence is Validating > Extending > Pruning > InProgress. A prune that also grows the Kubernetes side reports Extending, which is another reason to make one change at a time.
不允许同时进行剪枝和扩展。
To script against migration completion, use kubectl wait --for=condition=Migrating=False rather than polling 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 Operator 从spec.downloadBase派生的路径不同。auth.keyFileWindows已设立。monitoringAgentConfig.logPath或backupAgentConfig.logPath设立为非默认路径。进程的
authSchemaVersion与Kubernetes Operator默认不同。
身份验证错误
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 Operator 在每次协调时(包括试运行期间)根据自己的版本验证此注释。如果版本不兼容,请使用兼容的插件版本重新生成资源。
试运行问题
试运行似乎卡住了
删除 <resourceName>-connectivity-check 作业。下一次协调会重新创建它。
如果从未创建作业,请检查您的Kubernetes RBAC 权限是否包括 batch/jobs。缺少 batch/jobs 权限会阻止Kubernetes Operator 创建连接验证器作业。
连接故障
验证器作业退出代码 | 条件状态 | 原因 | 含义 |
|---|---|---|---|
作业仍在运行 |
|
| The |
|
|
| 所有外部成员均可访问并通过身份验证。 |
|
|
| Credentials, the authentication mechanism, or a missing |
|
|
| DNS、TLS、超时或无法访问的成员。检查作业 Pod 日志。 |
|
|
| 未分类故障。检查作业 Pod 日志。 |
Failures that occur before the Job starts use the reasons OperatorImageUnknown, BuildStatefulSetOptions, AgentCertSecretFailed, and AgentCertSubject.
Kubernetes Operator removes the NetworkConnectivityVerified condition from status.conditions entirely once no external members remain.
作业前失败
Kubernetes Operator 可能会在连接验证器作业开始之前失败,原因如下:
OperatorImageUnknownBuildStatefulSetOptionsAgentCertSecretFailedAgentCertSubject
TLS CA 不匹配
Kubernetes成员的证书必须由签署虚拟机成员证书的同一证书颁发机构颁发。否则,虚拟机和Kubernetes成员之间的连接验证和复制将失败。
memberConfig 问题
spec.memberConfig条目数少于spec.members。为每个成员添加一个条目。Kubernetes Operator 会忽略分片的片集群的顶级
spec.memberConfig字段。
警告
在增加节点数之前设置 spec.memberConfig
By default, new Kubernetes members join as voting members. The CRD defaults are votes: 1 and priority: "1", which let a still-syncing member participate in an election before it has finished its initial sync.
MongoDB recommends that you write one spec.memberConfig entry per new Kubernetes member with votes: 0 and priority: "0" before you raise the member count, so that a still-syncing member cannot win an election. votes is an integer. priority is a string.
命名问题
资源名称或副本集名称太长,或者不是有效的 RFC 1123 名称。使用 spec.replicaSetNameOverride 或 --resource-name-override 提供有效的Kubernetes名称。
验证惊喜
验证可以在设立空运行注解 (
mongodb.com/migration-dry-run) 时触发,而不仅仅是在开始真正迁移后触发。如果间接应用了会超过限制的更改,则投票成员限制验证可以在协调时而不是在准入时出现。
将太多更改批处理到单个编辑中可能会导致部署失去法定人数。一次仅进行一种更改:添加Kubernetes成员、修剪外部成员或更改投票和优先级。
要收集的诊断信息
如果在完成上述部分后问题仍然存在,请在联系支持之前收集以下信息:
MongoDB资源YAML,包括status.conditions:kubectl get mdb <resource-name> -n <namespace> -o yaml 用于部署的
MongoDBUser资源。Kubernetes Operator 日志。
连接验证器作业的 Pod 日志。
来自Ops Manager或Cloud Manager 的自动化配置JSON 。