【容器化】Kubernetes中openebs数据迁移

问题描述

openebs作为Kubernetes持久层使用的时候,数据只会存在Kubernetes集群中某个节点中,节点间的数据不会自动共享,这也是导致Kubesphere官方说openebs建议不在生产环境下使用的原因。
这种情况下,如果某个Node节点从集群中移除后,该Node节点中的数据就需要手动同步到其他节点中。

现象发现

1. Node节点移除后,某pod一直处于Pending状态

1
kubectl get pod -A |grep Pending

结果截图

2. 查看pod的describe信息

1
kubectl describe pod [pending-pod-name] -n [pending-pod-namespace]

结果截图

结果表明:该POD有Node节点亲和性(affinity)问题。

3. 查看pod的yaml文件内容

1
kubectl get pod [pending-pod-name] -n [pending-pod-namespace] -oyaml

进一步分析:本身POD是没有进行亲和性(affinity)配置的,那么和POD有关的额外资源,就是持久层资源(pvc、pv)

4. 查看对应持久层资源(pvc、pv)

1
2
kubectl get pvc [pvc-name] -n [pending-pod-namespace] -oyaml
kubectl get pv [pv-name] -oyaml

5. 最后能发现,openebs的pv是需要指定Node节点亲和性的

而如果对应的Node节点被移除了,那么自然这个pv肯定是运行失败了

1
2
3
4
5
6
7
8
9
# 例子
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- k8s-node3

解决思路

问题找到了,那么就有了解决思路:

  1. 把已移除节点中旧PV已存储的数据内容迁移到集群中尚存在的的某节点对应目录上
  2. 保存PVC、PV的yaml文件
  3. 删除掉PVC和PV
  4. 修改PV的节点亲和性
  5. 重新部署PVC和PV

解决流程

把已移除节点中旧PV已存储的数据(目录/var/openebs/local/)迁移到Master节点上(目录:/var/openebs/local/)

过程略

保存PVC、PV的yaml文件

1
2
kubectl get -n [namespace] pvc [pvc-name] -oyaml > pvc.yaml
kubectl get -n [namespace] pv [pv-name] -oyaml > pv.yaml

删除PVC和PV

默认情况下,PVC和PV被正在使用是不能直接删除的,删除会一直使PV处于Terminating状态,所以先给PVC加一个元数据,载进行删除

1
2
3
kubectl patch -n [namespace] pvc [pvc-name] -p '{"metadata":{"finalizers":null}}'
kubectl delete -n [namespace] pvc [pvc-name]
kubectl delete -n [namespace] pv [pv-name]

结果截图

修改PV的节点亲和性和删掉和PVC的关联信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 修改pv.yaml
vi pv.yaml

# 删除以下内容
#claimRef:
# apiVersion: v1
# kind: PersistentVolumeClaim
# name: data-elasticsearch-logging-data-0
# namespace: kubesphere-logging-system
# resourceVersion: "13881"
# uid: f15f1581-f8ae-452b-9825-c28c1cf34f7b
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
# 修改以下内容
# k8s-node3改成k8s-master1,改成集群中存在可用的节点名称
- k8s-master1

重新部署PVC和PV

1
2
kubectl create -f pv.yaml
kubectl create -f pvc.yaml

(•̀ᴗ•́)و ̑̑

Share