Rancher Harvester Cloud Credential 过期后旧 VM 删除失败
问题概述
用户反馈由于 Harvester 的 Credential 过期了,于是通过 Terraform 更新 RKE2 集群的 Credential 和 Machine Pool 镜像,此时新 VM 能创建出来,但旧 VM 删除失败。
环境是 Rancher v2.11.9 对接 Harvester v1.5.2。
报错大致如下:
1 | Failed deleting server [fleet-default/<machine-name>] of kind (HarvesterMachine) for machine <machine-name> in infrastructure provider: |
此时如果对集群进行 renew Credential 之后,旧 VM 删除成功了。
问题分析
Harvester Cloud Credential 里保存的是一份 kubeconfig。这个 kubeconfig 里的 token 默认会过期。过期之后,Rancher 再拿它去访问 Harvester,就会变成未认证请求。
这次的问题点在旧 VM 删除阶段。
虽然集群已经切到了新的 Credential,新 VM 创建时也确实用了新的 Credential,但旧 VM 删除时没有走新的 Credential,它还依赖旧的 Machine State,里面还保存着旧 Credential 里的 kubeconfig。旧 kubeconfig 已经过期,Harvester driver 删除 VM 时就会报 system:unauthenticated。
所以现场现象能对得上:
- 新 VM 创建成功,因为用了新的 Credential。
- 旧 VM 删除失败,因为删除动作还在用旧 kubeconfig。
- renew 旧 Credential 后,旧 kubeconfig 重新可用,旧 VM 删除恢复。
排查过程
看 Machine State Secret,确认 machine 删除时还保留了什么状态。
1 | kubectl get secret -n fleet-default <machine-name>-machine-state -o yaml |
看旧的 Credential Secret 中 kubeconfig 和过期信息和新的 Credential Secret 进行对比。
1 | kubectl get secret -n cattle-global-data <cloud-credential-secret-name> -o yaml |
看 Credential 对应的 token 是否已过期。
1 | kubectl get tokens.management.cattle.io -o custom-columns=NAME:.metadata.name,USER:.userId,TTL:.ttl,EXPIRES:.expiresAt,EXPIRED:.expired |
问题解决
根据此 issue 说明,正确处理方式是对原有失效的 Credential 执行 renew,而不是在已有集群里新建一个新的 Credential。新建一个 Credential 然后切到已有集群能让后续新 VM 使用新的 Credential,但旧 VM 删除时还是会走旧 kubeconfig。
参考此文档说明,从 2.9.3 版本开始,UI 已支持 renew 操作,步骤如下:
- 进入 Rancher UI。
- 打开 Harvester Cloud Credential 页面。
- 找到旧的、已经失效的 Credential。
- 点击
Renew。 - 等 renew 完成后,再删除旧 VM,或者等 Rancher 自动重试。
版本建议
如果不想定期 renew Credential,参考此 issue 说明,Rancher v2.12 开始支持 Non-expiring Harvester Cloud Credentials,可以评估升级到 Rancher v2.12 或更高版本。