k8s部署tidb pvc不能绑定

【版本】
OS:4.19.90-17.ky10.aarch64 、 k8s: v1.24.9 、operator: 1.4.0 、tidb 6.1.2
dyrnq/local-volume-provisioner:v2.5.0
3节点,其中一个为master
【配置信息】
https://raw.githubusercontent.com/pingcap/tidb-operator/v1.4.0/examples/local-pv/local-volume-provisioner.yaml
参考上面配置文件配置的存储,具体见附件tidb_pv.yaml:
tidb_pv.yaml (5.1 KB)

【问题】
apply tidb配置文件后PD处于pending状态, describe信息如下(中间有试过把bindmode改为Immediate)
image

检查pvc处于pending状态:

pvc describe如下:

检查storeage class存在

1、 该如何处理上述问题?

2、官方文档描述如下: https://docs.pingcap.com/zh/tidb-in-kubernetes/stable/configure-storage-class
样例中配置的目录作为发现目录,每个子目录创建一个pv,但这里并没有子目录,如何创建pv?

这里又说每个目录创建一个pv

这一步是 k8s 操作,所以在文档上面省略,参考一下 k8s 文档试试呢 配置 Pod 以使用 PersistentVolume 作为存储 | Kubernetes

检查 sc 相关日志确认问题原因,若是本地盘 local-static-provisioner ,提前参考文档中链接步骤挂载目录

@Lucien apply tidb集群的配置是会自动创建一个pvc和pv,只是现在pvc报找不到storage class
image

image

@yiduoyunQ 配置时就是参看的官方文档,对目录名、pv名等进行了自定义。sc信息如下

localvolume的daemonset日志 见附件:
sc.txt (9.9 KB)

mount -l | grep pd_data 看看目录下是否有挂载点吧

这个在哪看 ,pd pending状态没法进入pod去看挂载点,pv还没成功

node 上确认挂载点,参考官网文档

这个步骤是挂载一个具体的独立磁盘给pd使用,我用的是已经挂载的目录/vdata 下面的子目录k8s_storage/pd
image

image
必须 --bind方式mount吗

可以截图看看 kubectl get pv -A 吗

image

还没有PV, pvc pending状态,运行local volume的daemonset pod见前面的日志

PV 没有创建,应该看看 discovery 没有创建pv的原因。
image
可以看一下他有没有报错

如上面说的,参考官网文档里链接的 local-static-provisioner 步骤,在 xxxx 目录下挂载 3 个目录,那么(在这个 node 上) mount path = xxxx 即可生成 3 个可用 pv。
挂载方式不是重点(请避免相同 disk 重复挂载之类的问题,但可参考官网文档链接 Sharing a disk filesystem by multiple filesystem PVs),重点是在 mount path 的底下挂载

感觉像是配置文件有问题, storeclass存在确发现不了,如果核对配置文件没有问题,感觉可以降低版本试试

我还是没弄太明白,官方文档的样例使用的是单独的磁盘挂载不用组件的目录 ,hostpath mountpath 内容是一致的,我安照sharefilesystem方式 做了几个bind mount,将原来的目录/vadata/k8s_storage/pd 挂载到了/k8spv/pd(mount --bind /vdata/k8s_storage/pd /k8spv/pd)还是pending状态
image

daemonset pod的volume 和mounts

storageclass configmap
image

上面的几个目录配置应该没错吧 : volumes的path 和hostdir 是node上的mount点 ,mountpath 和 mountDir 是 pd pod内的挂载点

  • Discovery: The discovery routine periodically reads the configured discovery directories and looks for new mount points that don’t have a PV, and creates a PV for it.
    这里说为发现目录下的挂载点创建pv。这个发现目录是哪一层。

pd-ssd-storage:
hostDir : /k8spv/pd
mountDir: /pd_data

那就在 /k8spv/pd/ 目录下创建挂载点,比如 /k8spv/pd/vol1 , /k8spv/pd/vol2, /k8spv/pd/vol3 ,如此这个 node 上共生成 3 个可用 pv

具体参考 local-static-provisioner 说明 https://github.com/kubernetes-sigs/sig-storage-local-static-provisioner/blob/master/docs/operations.md

kubectl get pv 可确认当前可用 pv,正常情况下在还没部署 TiDB 集群前,apply local-static-provisioner 后即可看到有多少 pv 可用


看配置样例share filesystem上指定了uuid ,local-static-provisioner 是不是有这种强制要求必须是这种格式的

重点其实不是 mount 的形式,是需要在 hostDir 目录下 mount,可以先参考官网文档里的方式来 mount 就明白了,然后 apply local-static-provisioner 后就可以看到 avaiable pv,若看不到预期的 pv 说明配置有问题

我下午拿你提供的 tidb_pv.yaml 创建了测试了,可行的。原因就是出现在没有正确挂载上面,我手动
mount --bind 了个目录


难道是我K8s问题 ,你local volume provinsor用的什么版本,你的bind路径是到哪的

test-tidb-store.yaml (2.9 KB)
image