摘要:社区在版本为了解决引入该问题。在上一步中,会有一个以开头的目录,之后需要手动删除该目录。具体限制如下普通云盘和云盘挂载要求必须与云主机处于相同可用区云盘挂载要求与云主机处于相同区域区域范围小于可用区云盘仅可以挂
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: udisk-ssd-test
provisioner: udisk.csi.ucloud.cn #存储供应方,此处不可更改。
---
apiVersion: v1
kind: PersistentVolumeClaim
spec:
storageClassName: ssd-csi-udisk
用户只需要设置好 StorageClass,在使用 pvc 时,csi-udisk 插件会自动完成 UDisk 的创建挂载 mount 等一系列的操作,主要流程如下
StorageClass 设置相关参数,与 CSI 插件绑定。pvc 与 StorageClass 进行绑定。K8S 观察到使用 StorageClass 的新建 pvc,会自动创建 pv,并交给 CSI 插件完成新建 UDisk 的工作。pv 与 pvc 绑定完成,CSI 插件完成后续 UDisk 的挂载和 mount 等工作。UCloud 的 CSI 插件查看可以通过kubectl get pods -o wide -n kube-system |grep udisk
查看(一个总的 controller 及每个
node 对应的 pod)1.1 Statefulset 中使用 PVCStatefulset 控制器中的 pvctemplate 字段,可以设置 K8S 集群在对应 pvc 不存在时自动创建pvc,使得上述流程更加自动化(pvc和pv均由UK8S来建)。Statefulset 只负责创建不负责删除 pvc,因此对应多余的 pvc 需要手动删除VolumeAttachment 并不由用户自己创建,因此很多用户并不清楚它的作用,但是在 pvc 的使用过程中,VolumeAttachment 有着很重要的作用
VolumeAttachment所表示的,是 K8S 集群中记载的 pv 和某个 Node 的挂载关系。可以执行kubectl get volumeattachment |grep pv-name
进行查看这个挂载关系和 UDisk 与云主机的挂载关系往往是一致的,但是有时可能会出现不一致的情况。不一致的情况多见于 UDisk 已经从云主机卸载,但是 VolumeAttachment 记录中仍然存在,UDisk
是否挂载在云主机上,可以通过如何查看 PVC 对应的 UDisk 实际挂载情况来查看对于不一致的情况,可用选择手动删除对应的 VolumeAttachment 字段,并新建一个相同的 VolumeAttachment(新建后 ATTACHED 状态为 false)如果不能删除,可以通过kubectl logs csi-udisk-controller-0 -n kube-system csi-udisk
查看 csi-controller
日志定位原因一般 kubelet 手动删除不掉的情况,可能是对应的节点已经不存在了,此时直接 edit volumeattachment 删除 finalizers 字段即可[root@10-9-112-196 ~]# kubectl get volumeattachment |grep pvc-e51b694f-ffac-4d23-af5e-304a948a155a
NAME ATTACHER PV NODE ATTACHED AGE
csi-1d52d5a7b4c5c172de7cfc17df71c312059cf8a2d7800e05f46e04876a0eb50e udisk.csi.ucloud.cn pvc-e51b694f-ffac-4d23-af5e-304a948a155a 10.9.184.108 true 2d2h
2.1 VolumeAttachment 文件示例apiVersion: storage.k8s.io/v1
kind: VolumeAttachment
metadata:
annotations:
csi.alpha.kubernetes.io/node-id: 10.9.184.108 # 绑定的节点ip,填写报错pod所在节点
finalizers:
- external-attacher/udisk-csi-ucloud-cn
name: csi-1d52d5a7b4c5c172de7cfc17df71c312059cf8a2d7800e05f46e04876a0eb50e # 名称,按照pod报错名称填写
spec:
attacher: udisk.csi.ucloud.cn
nodeName: 10.9.184.108 #绑定的节点ip,填写报错pod所在节点
source:
persistentVolumeName: pvc-e51b694f-ffac-4d23-af5e-304a948a155a # 绑定的pv,填写pod使用的pv
对应关系表
UK8S资源类型与主机对应关系PVUDisk的磁盘VolumeAttachment磁盘与主机的挂载关系(vdb,vdc的块设备)PVC磁盘在主机上mount的位置pod使用磁盘的进程kubectl get pvc -n ns pvc-name
查看对应的 VOLUME 字段,找到与 pvc 绑定的
pv,一般为(pvc-e51b694f-ffac-4d23-af5e-304a948a155a)kubectl get pv pv-name -o yaml
在 spec.csi.volumeHandle 字段,可以查看到改 pv 绑定的 UDisk盘(flexv 插件为 pv
的最后几位)在控制台查看该udisk盘的状态,是否挂载到某个主机kubectl get volumeattachment |grep pv-name
查看 K8S 集群内记录的磁盘挂载状态ssh 到对应的主机上,lsblk
可以看到对应的盘mount |grep pv-name
可用查看盘的实际挂载点,有一个 globalmount 及一个或多个 pod 的 mount 点[root@10-9-184-108 ~]# mount |grep pvc-e51b694f-ffac-4d23-af5e-304a948a155a
/dev/vdc on /data/kubelet/plugins/kubernetes.io/csi/pv/pvc-e51b694f-ffac-4d23-af5e-304a948a155a/globalmount type ext4 (rw,relatime)
/dev/vdc on /data/kubelet/pods/587962f5-3009-4c53-a56e-a78f6636ce86/volumes/kubernetes.io~csi/pvc-e51b694f-ffac-4d23-af5e-304a948a155a/mount type ext4 (rw,relatime)
kubectl edit
对应的资源,删除掉其中的 finalizers 字段,此时资源就会成功释放掉删除 VolumeAttachment 后,如果 pod
挂载报错,按照VolumeAttachment 文件示例中提供的yaml文件,重新补一个同名的 VolumeAttachment 即可4.2 Pod 的 PVC 一直挂载不上怎么办?kubectl get pvc -n ns pvc-name
查看对应的 VOLUME 字段,找到与 pvc 绑定的
pv,一般为(pvc-e51b694f-ffac-4d23-af5e-304a948a155a)kubectl get pv pv-name -o yaml
在 spec.csi.volumeHandle 字段,可以查看到改 pv 绑定的 UDisk 盘(flexv 插件为 pv
的最后几位)找到 UDisk 磁盘后,如果控制台页面中磁盘处于可用状态或者挂载的主机不是 pod 所在主机,可以找技术支持,查看该 UDisk的挂载和卸载请求的错误日志,并联系主机同时进行处理如果没有
UDisk相关的错误日志,联系UK8S值班人员,并提供kubectl logs csi-udisk-controller-0 -n kube-system csi-udisk
的日志输出及
pod 的event我们发现在 UK8S 集群从 1.17 升级至 1.18 的过程中,部分挂载 PVC 的 Pod 会出现 IO 错误。查相关日志发现是因为挂载的盘被卸载导致 IO 异常。
社区在 1.18 版本为了解决 Dangling Attachments 引入该问题。参见 Recover CSI volumes from dangling attachments
K8S 处理挂盘和卸盘的实现中,单个 Node 可以选择由 kubelet 和 controller-manager 进行管理挂盘和卸盘,上面的代码在解决 dangling attachments 问题时引入了一个新的问题,由 kubelet 管理挂盘的 Node 节点,在 controller-manager 重启后,该节点的磁盘会被强制卸载掉。
为了解决该问题,需要将由 kubelet 负责挂盘的节点改为由 controller-manager 负责挂盘。UK8S 添加的节点已经默认使用 controller-manager 负责挂盘,后续添加节点无需再手动更改
6.1 手动修改节点为controller-manager挂盘检查 Kubelet 配置检查节点的 /etc/kubernetes/kubelet.conf
的配置。如果 enableControllerAttachDetach
的值为 false
则需要把该值修改为
true
。
然后执行命令 systemctl restart kubelet
重启 Kubelet。
执行命令 kubectl get no $IP -o yaml
查看 Node 的 status
中 volumesAttached
是否有数据,且数据是否与 volumesInUse
的数据一致。
Node annotations
中应该有 volumes.kubernetes.io/controller-managed-attach-detach: "true"
的记录。
如确认上述数据一致,且 Annotations 中有相应记录,则可以正常进行升级。如有问题,请联系技术支持。
使用flexv插件自动创建pv绑定到pod,删除pod时,有可能导致pod 处于Terminating状态,不能正常删除。
kubernetes版本: 1.13插件版本:Flexvolume-19.06.17.2 问题原因kubelet重启后找不到volume对应的Flexvolume插件。kubelet在重启之后如果发现了orphan pod(正常的pod不会导致这个问题),就会通过pod记录volume的路径来推断出使用的插件,但是flexv会在插件前面加入flexvolume-字段,导致kubelet推断出的名字和flexv提供的名字匹配不上。kubelet日志中会报no volume plugin matched 的错误,进而导致pod卡在Terminating的状态。
具体可以查看下面issue
https://github.com/kubernetes/kubernetes/issues/80972https://github.com/kubernetes/kubernetes/pull/809737.3 解决方案手动umount掉当前pod使用的路径,并进行清理操作。
找到不能正常umount的pv。登录到node节点上查看mount记录。谨慎操作,本操作是代替kubelet手动进行资源清理,请阅读结束下面所有步骤再进行操作.
mount | grep pv-name
记录上一步匹配到的所有路径path,手动umount掉pv在当前节点下的路径。umount path
在上一步umount中,会有一个以/var/lib/kubelet/pods开头的目录,umount之后需要手动删除该目录。
删除pvc,删除pvc之后需要手动在控制台卸载掉对应的udisk。udisk的id为pv名字的最后几位,例如pv名字是pvc-58f9978e-3133-11ea-b4d6-5254000cee42-bsm-olx0uqti, 则对应的udisk名字就是bsm-olx0uqti。也可以通过describe pv拿到spec.flexVolume.options中的diskId字段。
UDisk不支持多点读写,如需要多点读写请使用UFS。
8.2 Pod删除后,如何复用原先的云盘?可以使用静态创建PV的方法进行原有云盘绑定的方法进行复用原有云盘,详见在UK8S中使用已有UDISK
相较于普通Pod,使用Udisk的Pod调度涉及到了UDisk自身挂载规则的限制,更为复杂。具体限制如下
普通云盘和SSD云盘挂载要求必须与云主机处于相同可用区RSSD云盘挂载要求与云主机处于相同RDMA区域(RDMA区域范围小于可用区)RSSD云盘仅可以挂载到快杰云主机⚠️ RSSD UDisk调度要求同一个RDMA区域的快杰型云主机,RDMA区域范围小于可用区,而主机目前不支持指定RDMA区域创建机器。因此使用RSSD UDisk,在Pod漂移的情况下,有可能出现Pod无法调度的问题。请您使用前务必确认可以接受该风险。
UDisk挂载限制在实际UK8S的使用中主要体现到以下两个方面
自动创建PV的过程中,如何判定创建哪个可用区/RDMA区域的云盘当Pod需要重新调度时,如何保证新调度的节点满足云盘挂载的要求UK8S提供的csi-udisk插件,依赖K8S提供的CSI插件能力,帮助用户实现了尽可能少的介入,下面以SSD UDisk为例进行讲解。
9.1 创建PVC时自动创建UDisk从上面的文档中可以了解到,当PVC创建完成时,CSI会自动创建PV以及UDisk,并完成绑定工作。但是创建哪个可用区的UDisk呢,如果随意选择,则会导致后续Pod调度完成后无法挂载云盘。
为此K8S提供了WaitForFirstConsumer
机制。当StorageClass
中指定了volumeBindingMode: WaitForFirstConsumer
参数时,CSI不会立刻创建PV及云盘,以下为WaitForFirstConsumer
模式下的工作流程。
volume.kubernetes.io/selected-node
,用以记录Pod预计调度到的Node。注意此时查看Pod状态仍然为Pending。CSI查询Node云主机的可用区,创建相同可用区的云盘,并创建相应PV进行绑定CSI更新PV中的spec.csi.volumeHandle
字段,记录创建的云盘IDCSI更新PV中的spec.nodeAffinity
字段,记录云盘所在的可用区等信息按照以上逻辑,可以保证Pod调度后创建的云盘顺利挂载到对应主机
但是有一个特殊情况,RSSD盘仅能挂载到快杰机型上,如果Pod首次调度到了非快杰机型上,那么后续创建云盘就会失败,因此如果您选择了RSSD盘,请确保Pod首次调度到快杰机型上。
9.2 Pod重建后调度流程首次运行后,如果遇到服务更新,或者节点故障等原因触发Pod重建,会进行重新调度,以下为调度流程
清理旧Pod,完成UDisk从旧节点上清理卸载工作创建新PodK8S调度器会按照PV中的spec.nodeAffinity
字段,校验节点是否可以调度如果所有节点都不满足磁盘调度要求,会记录had volume node affinity conflict
类型的EVENT到Pod,并重复上一步流程K8S调度器按照上一步过滤的结果,在可调度的节点范围内,继续按照普通Pod调度流程进行调度CSI是K8S定义的容器存储接口,可以对接云厂商的多种存储。 UCloud目前实现了UDisk以及UFile/US3的CSI插件。
CSI组件分为两大类,分别为Controller以及Daemonset。目前所有csi组件的pod均默认运行在kube-system
下面,可以通过执行kubectl get pods -n kube-system -o wide |grep csi
进行查看。如果遇到存储挂载问题,可以优先查看CSI Controller是否工作正常,以及节点上是否存在对应CSI Daemonset的Pod。
接下来对CSI组件进行简要介绍。
10.1 CSI ControllerCSI Controller 负责的是全局资源的管理,通过list/watch k8s中的相关资源,执行对应操作。UDisk CSI Controller 会负责磁盘创建和删除,磁盘到云主机的卸载及挂载操作。US3 CSI Controller 由于无需处理挂载操作,仅仅负责校验一些StorageClass中的基础信息。
10.2 CSI DaemonsetCSI Daemonset组件调度到各个节点上,负责单个节点的一些工作。与Controller模式不同,CSI Daemonset通过unix
socket地址与kubelet进行通信,接收kubelet请求信息执行对应的操作。 通常CSI unix
socket地址为/var/lib/kubelet/csi-plugins/csi-name/csi.sock
UDisk/US3 CSI Daemonset 主要负责存储的Mount以及Umount操作
在基础的存储管理以及挂载功能外,CSI还提供了多种其它能力。目前CSI UDisk 则实现了磁盘动态扩容(需要Controller与Daemonset)以及磁盘Metrics信息收集(需要CSI Daemonset)。
本节会以UDisk-CSI为例,从创建pvc之后每一步可能出错的点进行分析,并给出处理建议。另外本节内容仅涉及Pod创建过程中的相关内容。并基于一个假设,即上一个使用该PVC的Pod已经销毁,并且中间的所有操作及资源已经清理干净。如果上一个Pod使用的资源没有清理干净,也可以依赖本文档反推确认清理方案。
通过kubectl get pods -n kube-system -o wide
确认csi的controller及目标节点上Daemonset组件均工作正常确认PV是否创建成功,如果没有,请查看 11.1 小节PV创建完成后,需要确保Pod成功调度。使用了udisk的Pod在普通调度规则上,会有额外的调度要求,具体可以看第9节如果磁盘挂载失败,请查看 11.2 小节当确认磁盘已经挂载到目标主机后,需要确认mount成功,如果mount失败,请查看11.3小节11.1 PV没有创建成功如果PV没有创建成功,需要确保有Pod在使用该PVC。具体原因请查看第9.1节。
如果已有Pod在使用该PVC,则通过kubectl logs csi-udisk-controller-0 -n kube-system csi-udisk
查看controller日志,确认是否存在创建udisk失败的日志。
通过kubectl get pv
记录下PV对应的udisk名称,并在控制台中查看对应的udisk存在。
一般自动创建的pv名字格式是pvc-xxxxxxxxx,这里比较容易混淆。
11.2 磁盘挂载失败11.2.1 确保volumeattachment
资源存在为了能成功挂盘,首先需要确保volumeattachment
资源存在,并且查看node的信息,确认当前是由kubelet还是controller-manager负责挂盘。
controller-manager
进行挂盘,具体查看及转换方式可以对照本文档6.1小节如果kubelet负责挂盘,并且pod日志中显示类似volumeattachment
资源不存在的情况,则需要按照文档VolumeAttachment 文件示例中提供的yaml文件,重新补一个同名的
volumeAttachment。如果是controller-manager负责挂盘,则需要确认k8s版本是否为1.17.1-1.17.7或1.18.1-1.18.4,这些版本controller-manager挂盘存在性能问题。controller-manager日志查看方式,登录到三台master节点,执行journalctl -fu kube-controller-manager
查看,注意三台master中仅有一台Master中的controller-manager为leader,即实际工作状态。kubelet日志查看方式,需要登录到目标节点,执行journalctl -fu kubelet
11.2.2 确保磁盘挂载成功首先需要确认volumeattachment
资源状态为true。如果状态不为true,可以查看csi-controller是否挂载过程中存在报错。如果状态为true,需要在控制台确认udisk确实挂载到了目标主机,如果确认有问题,可以联系技术支持。另外,此时需要确认,仅有一个对应的volumeattachment
。因为udisk仅允许单点挂载,而us3由于允许多点挂载,并没有此限制。11.3 磁盘Mount问题首先需要确认磁盘对应的盘符,udisk挂载由于实现原理的限制。在某些特殊情况下,页面看到的盘符和真实盘符可能不一致,盘符对应信息可以从/sys/block/vdx/serial
文件中查看到。udisk-csi已经实现了该逻辑,不会有错误挂盘的出现,但是手动排查问题需要了解此情况。确认好磁盘对应的盘符之后,可以通过mount |grep pv-name
查看挂载路径。udisk根据csi标准实现了globalmount及pod mount路径,因此一个udisk正常情况下会看到两个挂载路径,一个以globalmount结尾,一个以mount结尾。us3仅实现了pod mount路径,因此仅能看到一个挂载路径,且us3也不需要确认盘符。fsGroup导致的磁盘mount缓慢很多用户会遇到一个磁盘mount缓慢的问题。此时需要首先确认是否设置了fsGroup,且磁盘中的是否存在大量小文件,如果两个条件均满足,则很可能导致挂载缓慢,具体可以查看k8s官方文档
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/126702.html
摘要:详细请见产品价格产品概念使用须知名词解释漏洞修复记录集群节点配置推荐模式选择产品价格操作指南集群创建需要注意的几点分别是使用必读讲解使用需要赋予的权限模式切换的切换等。UK8S概览UK8S是一项基于Kubernetes的容器管理服务,你可以在UK8S上部署、管理、扩展你的容器化应用,而无需关心Kubernetes集群自身的搭建及维护等运维类工作。了解使用UK8S为了让您更快上手使用,享受UK...
摘要:产品价格产品本身不收取服务费用,但你需要为使用过程中用到的其他云产品付费。实时文档欢迎访问产品价格UK8S产品本身不收取服务费用,但你需要为使用UK8S过程中用到的其他云产品付费。在使用UK8S的过程中,您可能会使用到以下产品,具体如下:云主机 UHost收费说明云硬盘 UDisk收费说明文件存储 UFS收费说明对象存储 UFile收费说明负载均衡 ULB收费说明弹性IP EI...
摘要:但考虑到该用户在跨集群模式下的困扰,开始策划将托管云物理机纳入现有集群统一管理的方案,即在混合云架构下仅需部署管理一套集群。托管云物理机纳入UK8S集群统一管理后,可实现托管云物理机保障平峰时业务正常运行,高峰时期利用UK8S快速扩容公有云资源的理想应用场景,继而提升混合云的可用性。 ——海豹他趣技术负责人 张嵩 混合云的业务模式 厦门海豹他趣信息技术股份有限公司于2012年4...
摘要:请您使用前务必确认可以接受该风险。创建并与关联创建并与关联需要与相对应。在中使用在中使用在中使用 在UK8S中使用UDISK本篇目录1. 存储类 StorageClass2. 创建持久化存储卷声明 PVC3. 在 Pod 中使用 PVCUK8S支持直接在集群中使用UDisk作为持久化存储卷。备注:所有云主机均支持 SSD/SATA UDisk,如果节点的云主机类型为快杰,则也支持 RSSD ...
摘要:存储插件问题插件导致删除失败现象描述使用插件自动创建绑定到,删除时,有可能导致处于状态,不能正常删除。版本插件版本问题原因重启后找不到对应的插件。日志中会报的错误,进而导致卡在的状态。存储插件问题Flexv插件导致pod删除失败现象描述使用flexv插件自动创建pv绑定到pod,删除pod时,有可能导致pod 处于Terminating状态,不能正常删除。kubernetes版本: 1.13...
摘要:产品概念是一项基于的容器管理服务,你可以在上部署管理扩展你的容器化应用,而无需关心集群自身的搭建及维护等运维类工作。完全兼容原生的,以私有网络为基础,并整合了等云产品。其命名规范为。产品概念UCloud Container Service for Kubernetes (UK8S)是一项基于Kubernetes的容器管理服务,你可以在UK8S上部署、管理、扩展你的容器化应用,而无需关心Kub...
阅读 121·2024-11-07 18:25
阅读 130169·2024-02-01 10:43
阅读 792·2024-01-31 14:58
阅读 768·2024-01-31 14:54
阅读 82585·2024-01-29 17:11
阅读 2894·2024-01-25 14:55
阅读 1932·2023-06-02 13:36
阅读 2876·2023-05-23 10:26