pod挂掉后,没有自动故障恢复

tidb-operator : v1.1.6
tidb version: v4.0.8
在一个老集群里通过apply -f crd.yaml文件,升级operator从v1.1.3 到v1.1.6 ,并启用v1.1.6的operator,挂掉node节点后,没有failover,直接在新集群里部署operator v1.1.6 是可以自动故障恢复的。对比了下tidbCluster的yaml文件,

而且旧集群的controller-manager.log提示大量的failed to update TidbCluster

目前猜测,update操作失败会影响failover。(这个先帮忙确认下,谢谢!!!

看日志,提示类型不对,对照新集群中的文件,修改,这里以spec.tikv.config的配置为例


但提示:spec.tikv.config: Invalid value: "string": spec.tikv.config in body must be of type object: "string"

tc的配置项期望object类型,而我这里赋值string所以错误?那是因为老k8s集群中的crd没有更新吗(第一张图)?这里确实apply 过最新的crd的。

如果PD都停止服务的话, 不会发生failover, 要先恢复PD的状态, 把 PD 的 config 改对, 让 PD 启动起来才能 failover.

应该需要更新下CRD, toml 配置透传是在 v1.1.6 引入的功能, 可能是CRD没有更新成功

目前pd是3个pod,我重新,apply 下crd ,然后需要重启下operator的pod的吧?

可以先 apply 一下 crd, 然后创建一个 tc 看一下 crd 更新成功没有

从我这里测试看, apply 1.1.3 的 CRD, 可以复现你的错误

The TidbCluster "basic" is invalid: spec.tikv.config: Invalid value: "string": spec.tikv.config in body must be of type object: "string"

apply 1.1.6 的 CRD 之后, tidbcluster对象可以创建了

kubectl apply -f crd.yaml

kubectl get crd tidbclusters.pingcap.com -oyaml > tc.yaml

对比了下crd.yaml和tc.yaml,config字段确实没有改过来,需要先delete下crd.yaml吗?

有什么办法确认现在的crd是什么版本的?

发现tc.yaml里除了config外,基本都应更新,跟crd没有什么不一样的

确认个问题,如果k8s集群里有v1.1.3-crd.yaml的实例,apply v1.1.6-crd.yaml,config字段也可以修改成功吗?我这边看起来,并不能:joy:

有个奇怪的象限,直接apply -f crd-v1.1.6.yaml还是报错。换一种方法,先apply -f crd-v1.1.3.yaml ,在apply -f crd-v1.1.6.yaml就没问题。

确认一下两个 yaml 参数差异,是不是有那些参数存在生效顺序。