从MicroK8s 升级 K3s的完整迁移方案(针对当前K8s环境、可直接执行)

从MicroK8s 升级 K3s的完整迁移方案(针对当前K8s环境、可直接执行)
Weekend从MicroK8s → K3s的完整迁移方案(针对当前K8s环境、可直接执行)
下面是MicroK8s → K3s的完整迁移方案,关键步骤、命令、校验、回滚策略都写齐了 —— 你可以按顺序执行。官方迁移 playbook 的细节会在相关步骤里引用。
一、总体思路(简要)
- 备份当前 MicroK8s 集群(configs、gepetto、secrets、Postgres dump)
- 在全新或指定控制节点上用新版 Ansible (ansible/k3s) 部署 K3s 控制平面(
setup-control-plane) - 运行迁移准备任务(收集 GPU/cost 信息、确保 CLI、修改 gepetto 等)
- 逐台(串行)迁移 Worker:从 MicroK8s 移除 → 重置 → 安装 K3s Agent → 加入新控制平面 → 重新注册到 chutes。迁移是 串行 的(失败会停止,便于排查)。
- 清理旧 microk8s 控制节点并完成收尾(部署最终 gepetto 配置、监控等)。
二、前置条件(必做项)
- Ansible 2.15+ 可用(控制机)
- 控制节点(将运行 K3s)是一台 新 主机(不能复用正在作为 microk8s control 的机器,参见官方注意)。
- 所有节点均可 SSH(ansible 可 sudo)
chutes-miner-cli在控制机或节点可用(根据run_cli_locally配置决定)- 已备份 Bittensor hotkey(hotkey 文件路径要可用)
- Inventory 已包含
microk8s组(详见下文)以便 playbook 正确识别旧控制平面与待迁移节点。
三、在你环境的具体备份步骤(强烈建议先做)
在当前旧版本(~/new/chutes-miner)控制节点上执行:
1 | # 建目录 |
备份完成后确认文件完整再继续。若需要恢复会用到这些文件。
四、准备 inventory.yml(关键)
官方要求:在 inventory 中加入 microk8s 组以识别旧 control(不和新 control 冲突)。下面给出已为你填写的模板(根据你先前给出的旧 inventory),请保存为 ~/chutes/inventory.yml(或放到 ansible/k3s 目录下使用):
1 | all: |
重要:
microk8s组必须保留,以便迁移 playbook 能识别旧控制平面并执行安全迁移流程(官方强制约束)。
五、部署 K3s 控制平面(先在新 control 上运行)
从 ansible/k3s 目录运行:
1 | cd ~/new/chutes-miner-new/ansible/k3s |
该步骤会:
- 在
control指定的主机上安装并配置 K3s - 部署 chutes-miner 的 helm charts(Postgres/Redis/API/Gepetto 等)
- 配置监控(Prometheus/Grafana)与证书等。
执行后校验:
1 | kubectl --context chutes-miner-cpu-0 get pods -n chutes |
六、迁移准备(采集信息与调整 gepetto)
为避免 gepetto 在迁移过程中自动回滚/重排,需要运行准备任务:
1 | ansible-playbook -i ~/chutes/inventory.yml playbooks/migrate.yml --tags migrate-prep |
这一步会:
- 校验
chutes-miner-cli是否可用 - 禁用 audit-exporter cronjob(避免干扰)
- 临时覆盖 gepetto configmap 避免 reconciliation loop
- 收集节点的 GPU type / hourly_cost 等,生成
vars/chutes_nodes.yml(供后续 re-add 使用)
七、串行迁移 Worker 节点(按节点执行,遇错停止以排查)
对每个 worker 节点单独运行(示例先迁移 chutes-miner-gpu-0):
1 | # 迁移单节点(串行) |
对每台节点的过程(官方说明):
- 从 Chutes inventory 中删除节点并从 microk8s cluster 中 drain/remove(
.removedmarker) - 停止 microk8s、清理系统(reset),并 reboot(
.resetmarker) - 通用系统设置(install deps 等)(
.setupmarker) - 安装 K3s agent(
.k3smarker) - Karmada / 新 control join(
.karmadamarker) - 将节点重新 add 到 Chutes inventory(
.added)并完成.migrated标记。
注意:迁移 playbook 已实现幂等和 resume 能力(marker 文件在
/etc/ansible),若中途失败,下次运行会跳过已完成步骤。详见Migration Markers。
八、清理旧 microk8s 控制平面(在确认所有 node 都迁移成功后)
- 从 inventory 中移除
microk8s组 - 删除旧 microk8s control 的 Chutes 命名空间或整机清理(谨慎)
- 在新 cluster 上恢复最终版 gepetto(把你要用的 gepetto.py 重新写入 configmap 并 rollout):
1 | kubectl create configmap gepetto-code --from-file=gepetto.py -n chutes --context chutes-miner-cpu-0 |
九、验证(Migration Verification)
控制平面验证:
1 | kubectl --context chutes-miner-cpu-0 get pods -n chutes |
Worker 验证:
1 | ansible -i ~/chutes/inventory.yml workers -b -m command -a "systemctl status k3s-agent" |
节点在 Chutes 中已重新注册:
- 使用
chutes-miner-cli或 API 确认chutes-minerinventory 上显示节点(playbook 会自动 re-add)。
十、监控与可观测性
- Grafana:
http://<control-ip>:30080(默认 playbook 已部署) - Prometheus:
http://<control-ip>:30090 - Node-exporter metrics 在 9100 端口
十一、回滚与恢复方案(若迁移失败)
官方给出的回滚步骤要点如下:
- 如果单节点迁移失败,可清除该节点上的迁移 markers 并重试:
1 | ansible -i ~/chutes/inventory.yml workers -b -m file -a "path=/etc/ansible/.migrated state=absent" |
- 要完全回滚并把节点恢复到 microk8s 状态,可运行 reset playbook(或用 microk8s 的 ansible 重新安装):
1 | ansible-playbook -i ~/chutes/inventory.yml playbooks/reset.yml |
- 若要回退到旧集群(整个集群回滚),务必使用你在第一步做的
pg_dump& config backups 恢复数据与 config。
十二、常见问题与注意事项(实战要点)
- 必须在
inventory.yml中保留microk8s组且不能把新 control 设置为旧 microk8s(官方强调)。 - 迁移是串行的:一台一台迁移,便于问题排查与最小化得分影响(这是官方设计)。
- 若你希望从 Ansible 控制机直接执行 chutes-miner CLI:设置
run_cli_locally: true(否则 CLI 必须在控制机或远端 host 可用)。 - 确认
registry_port、minerApi.port、Grafana 密码等在inventory.yml与values.yaml中一致(端口/secret 对齐)。
十三、为你准备的快速执行列表(照着跑就行)
备份(参见第三节)
把我给你的
~/chutes/inventory.yml保存好,并把 hotkey 路径确认可访问在
~/new/chutes-miner-new/ansible/k3s目录运行:1
2ansible-playbook -i ~/chutes/inventory.yml playbooks/migrate.yml --tags setup-control-plane
ansible-playbook -i ~/chutes/inventory.yml playbooks/migrate.yml --tags migrate-prep串行迁移每台 GPU(示例):
1
2
3ansible-playbook -i ~/chutes/inventory.yml playbooks/migrate.yml --limit chutes-miner-gpu-0 --tags migrate-nodes
ansible-playbook -i ~/chutes/inventory.yml playbooks/migrate.yml --limit chutes-miner-gpu-1 --tags migrate-nodes
...完成后清理
microk8s组并重启 gepetto(见第八节)验证(见第九节)






