K8s StatefulSet Local PV 如何迁移

StatefulSet在K8s中称为有状态服务,Local PV称为本地存储。当某服务采用的是Local PV 部署的StatefulSet,对应的节点有问题时,此时是无法根据K8s调度机制自动的调度到正常节点上的,为了维护StatefulSet Running状态,服务只能做迁移。

1 迁移准备及恢复

  • 将 sts 的副本数 置成0
  • 备份要迁移的 pvc,pv;删除 pvc
  • 修改 pv 所在的节点,并在此节点创建目录;创建 pvc
  • 将sts 的副本数还原

2 迁移准备及恢复的操作

2.1 将 sts 的副本数 置成0

[root@lin ~]# kubectl get sts -n product-sysmysql | grep sysmysql-0a8d0f6a57ae-proxy
sysmysql-0a8d0f6a57ae-proxy 2/2 50d
[root@lin ~]# kubectl scale sts -n product-sysmysql sysmysql-0a8d0f6a57ae-proxy --replicas=0

2.2 备份要迁移的 pvc,pv

注意:有可能是多副本的StatefulSet,所以要迁移的备份就行

1、单独建一个目录存备份文件
[root@lin lin]# mkdir -p lin
[root@lin lin]# cd lin

2、pvc yaml文件备份
[root@lin lin]# kubectl get pvc -n product-sysmysql | grep sysmysql-0a8d0f6a57ae-proxy
proxysql-conf-sysmysql-0a8d0f6a57ae-proxy-0 Bound proxysql-conf-product-sysmysql-sysmysql-0a8d0f6a57ae-proxy-pv-0 3Ti RWO local-storage 50d
proxysql-conf-sysmysql-0a8d0f6a57ae-proxy-1 Bound proxysql-conf-product-sysmysql-sysmysql-0a8d0f6a57ae-proxy-pv-1 3Ti RWO local-storage 50d
[root@lin lin]# kubectl get pvc -n product-sysmysql proxysql-conf-sysmysql-0a8d0f6a57ae-proxy-0 -o yaml > mysql-pvc.yaml

3、pv yaml文件备份
[root@lin lin]# kubectl get pv | grep sysmysql-0a8d0f6a57ae-proxy
proxysql-conf-product-sysmysql-sysmysql-0a8d0f6a57ae-proxy-pv-0 3Ti RWO Retain Bound product-sysmysql/proxysql-conf-sysmysql-0a8d0f6a57ae-proxy-0 local-storage 50d
proxysql-conf-product-sysmysql-sysmysql-0a8d0f6a57ae-proxy-pv-1 3Ti RWO Retain Bound product-sysmysql/proxysql-conf-sysmysql-0a8d0f6a57ae-proxy-1 local-storage 50d
[root@lin lin]# kubectl get pv proxysql-conf-product-sysmysql-sysmysql-0a8d0f6a57ae-proxy-pv-0 -o yaml > mysql-pv.yaml
[root@lin lin]# ls
mysql-pvc.yaml mysql-pv.yaml

4、删除pvc
[root@lin lin]# kubectl get pvc -n product-sysmysql | grep sysmysql-0a8d0f6a57ae-proxy
proxysql-conf-sysmysql-0a8d0f6a57ae-proxy-0 Bound proxysql-conf-product-sysmysql-sysmysql-0a8d0f6a57ae-proxy-pv-0 3Ti RWO local-storage 50d
proxysql-conf-sysmysql-0a8d0f6a57ae-proxy-1 Bound proxysql-conf-product-sysmysql-sysmysql-0a8d0f6a57ae-proxy-pv-1 3Ti RWO local-storage 50d
[root@lin lin]# kubectl delete pvc -n product-sysmysql proxysql-conf-sysmysql-0a8d0f6a57ae-proxy-0

2.3 修改 pv 所在的节点,并在此节点创建目录;创建pvc

  • 期望的新节点上创建本地挂载目录

查看备份的mysql-pv.yaml文件,找到local关键字,后面对应的目录就是需要创建的目录

local:
path: /data/proxysql-conf-product-sysmysql-sysmysql-0a8d0f6a57ae-proxy-pv-0
到期望节点执行如下命令:
mkdir -p /data/proxysql-conf-product-sysmysql-sysmysql-0a8d0f6a57ae-proxy-pv-0
  • pv修改

可以看到 PVC 被删除后,PV 变成了 Released 的状态,但是我们仔细看后面的 CLAIM 属性,其中依然还保留着 PVC 的绑定信息。所以需要编辑pv,删除 claimRef 对 PVC 的引用,这个时候 Kubernetes 的 PV 控制器 watch 到 PV 变化后,就会将 PV 修改为 Available 状态,Available 状态的 PV 当然就可以被其他 PVC 绑定了。现象PV Available状态。

1、edit pv需要做的是删除claimRef和更改合适节点
[root@lin lin]# kubectl get pv | grep sysmysql-0a8d0f6a57ae-proxy
proxysql-conf-product-sysmysql-sysmysql-0a8d0f6a57ae-proxy-pv-0 3Ti RWO Retain Bound product-sysmysql/proxysql-conf-sysmysql-0a8d0f6a57ae-proxy-0 local-storage 51d
proxysql-conf-product-sysmysql-sysmysql-0a8d0f6a57ae-proxy-pv-1 3Ti RWO Retain Bound product-sysmysql/proxysql-conf-sysmysql-0a8d0f6a57ae-proxy-1 local-storage 51d
[root@lin lin]# kubectl edit pv proxysql-conf-product-sysmysql-sysmysql-0a8d0f6a57ae-proxy-pv-0

2、找到claimRef及删除它,这些内容都需要删除。
claimRef:
apiVersion: v1
kind: PersistentVolumeClaim
name: proxysql-conf-sysmysql-0a8d0f6a57ae-proxy-0
namespace: product-sysmysql
resourceVersion: "383325"
uid: 333ded17-fd92-4f99-a21a-016f447848a6

3、有亲和性节点76-65修改期望节点
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- 76-65
  • pvc创建

刚添加的 PVC 状态是 Pending,如果有合适的Available状态 PV,这个 Pending 状态会立刻变为 Bound 状态,同时相应的 PVC 也会变为 Bound。现象为pvc Bound状态。

[root@lin lin]# ls
mysql-pvc.yaml mysql-pv.yaml
[root@lin lin]# kubectl apply -f mysql-pvc.yaml

2.4 将 sts 的副本数还原

现象为pod都Running

[root@lin ~]# kubectl scale sts -n product-sysmysql sysmysql-0a8d0f6a57ae-proxy --replicas=2

3 总结

上面操作只是把不可用node上的StatefulSet pod迁移至可用的node上,业务的内部数据是没有做同步,需要业务自身考虑。


原文始发于微信公众号(云原生内经):K8s StatefulSet Local PV 如何迁移

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/167924.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!