kubernetes1.20版本 nfs-provisioner报错问题:"selfLink was empty"
Posted gongzb
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了kubernetes1.20版本 nfs-provisioner报错问题:"selfLink was empty"相关的知识,希望对你有一定的参考价值。
Kubernetes升级为1.20版本后,原有的后端nfs存储storageclass无法自动创建pv。
查看PVC状态一直为pending状态,查看nfs-provisioner日志
kubectl logs nfs-client-provisioner-5f696dc8bb-qhmsn E0118 03:01:07.352670 1 streamwatcher.go:109] Unable to decode an event from the watch stream: http2: server sent GOAWAY and closed the connection; LastStreamID=3737, ErrCode=NO_ERROR, debug="" E0118 03:01:07.353951 1 reflector.go:322] github.com/kubernetes-incubator/external-storage/lib/controller/controller.go:668: Failed to watch *v1.StorageClass: Get https://10.96.0.1:443/apis/storage.k8s.io/v1/storageclasses?resourceVersion=604432&timeoutSeconds=387&watch=true: dial tcp 10.96.0.1:443: connect: connection refused W0118 03:01:07.366606 1 reflector.go:341] github.com/kubernetes-incubator/external-storage/lib/controller/controller.go:665: watch of *v1.PersistentVolume ended with: too old resource version: 11565 (605173) W0118 03:01:07.367679 1 reflector.go:341] github.com/kubernetes-incubator/external-storage/lib/controller/controller.go:662: watch of *v1.PersistentVolumeClaim ended with: too old resource version: 11565 (605173) I0118 03:08:28.340240 1 controller.go:987] provision "default/auth-platorm-redis-data-auth-platorm-redis-cluster-0" class "course-nfs-storage": started E0118 03:08:28.343582 1 controller.go:1004] provision "default/auth-platorm-redis-data-auth-platorm-redis-cluster-0" class "course-nfs-storage": unexpected error getting claim reference: selfLink was empty, can\'t make reference I0118 03:16:08.373590 1 controller.go:987] provision "default/auth-platorm-redis-data-auth-platorm-redis-cluster-0" class "course-nfs-storage": started E0118 03:16:08.382178 1 controller.go:1004] provision "default/auth-platorm-redis-data-auth-platorm-redis-cluster-0" class "course-nfs-storage": unexpected error getting claim reference: selfLink was empty, can\'t make reference I0118 03:30:41.647626 1 controller.go:987] provision "default/test-pvc" class "course-nfs-storage": started E0118 03:30:41.658419 1 controller.go:1004] provision "default/test-pvc" class "course-nfs-storage": unexpected error getting claim reference: selfLink was empty, can\'t make reference I0118 03:31:08.373713 1 controller.go:987] provision "default/auth-platorm-redis-data-auth-platorm-redis-cluster-0" class "course-nfs-storage": started I0118 03:31:08.373969 1 controller.go:987] provision "default/test-pvc" class "course-nfs-storage": started E0118 03:31:08.382279 1 controller.go:1004] provision "default/test-pvc" class "course-nfs-storage": unexpected error getting claim reference: selfLink was empty, can\'t make reference E0118 03:31:08.382791 1 controller.go:1004] provision "default/auth-platorm-redis-data-auth-platorm-redis-cluster-0" class "course-nfs-storage": unexpected error getting claim reference: selfLink was empty, can\'t make reference
报错信息“selfLink was empty”,于是上网查询相关内容,在官方1.20的变更说明中看到其中一条说明为:
Stop propagating SelfLink (deprecated in 1.16) in kube-apiserver
selfLink在1.16版本以后已经弃用,在1.20版本停用。
而由于nfs-provisioner的实现是基于selfLink功能(同时也会影响其他用到selfLink这个功能的第三方软件),需要等nfs-provisioner的制作方重新提供新的解决方案。
目前可用的临时方案是:
修改/etc/kubernetes/manifests/kube-apiserver.yaml文件,找到如下内容后,在最后添加一项参数
spec: containers: - command: - kube-apiserver
- --advertise-address=192.168.210.20
- --....... #省略多行内容
- --feature-gates=RemoveSelfLink=false #添加此行
如果是高可用的k8s集群,则需要在所有master节点上进行此操作。
添加后需要删除apiserver的所有pod进行重启
kubectl delete pod kube-apiserver-master01 -n kube-system kubectl delete pod kube-apiserver-master02 -n kube-system kubectl delete pod kube-apiserver-master03 -n kube-system
三台apiserver被kubelet重启拉起后,再次查询PVC,可以看到PVC状态都为Bound,可以正常被PV绑定了
Kubernetes版本对接对象存储几种方案
Kubernetes版本对接对象存储
文章目录
对象存储
想要通过创建 PersistentVolume(PV)/PersistentVolumeClaim(PVC),并为工作负载挂载数据卷的方式使用云对象存储 COS
对于对象存储,在k8s中不需要PV/PVC来做资源抽象,应用可以直接访问和使用,如果需要在k8s支持访问,就需要相应的csi插件,支持对象存储转成文件存储
例如: 几个大厂的方式
阿里:https://help.aliyun.com/document_detail/130911.html
腾讯:https://cloud.tencent.com/document/product/457/44232
华为:https://support.huaweicloud.com/intl/zh-cn/usermanual-cce/cce_01_0267.html
如果对接文件存储,可以使用使用S3fs可以把Bucket当成一个文件夹挂载到Linux系统内部,当成一个系统文件夹使用。
社区方案
方案1:Object Storage API (COSI)
目前开发中,不成熟
官方文档
https://container-object-storage-interface.github.io/docs/
https://container-object-storage-interface.github.io/
https://github.com/kubernetes/enhancements/tree/master/keps/sig-storage/1979-object-storage-support#provisionergetinfo
Kubernetes 现在对文件和块存储都有了较好的扩展支持 (CSI),但是这些并不能很好的支持对象存储,原因如下:
- oss 以桶 (bucket) 来组织分配存储单元而不是文件系统挂载或是块设备
- oss 服务的访问是通过网络调用而不是本地的 POSIX 调用
- oss 不试用 csi 定义的 Attach/Detach 逻辑 (无需挂载/卸载)
COSI 是关于如何为容器化的工作负载 (Pod) 提供对象存储服务 (oss) 的标准协议。与 csi 和 cni 类似,Kubernetes 旨在通过定义一些标准的接口与第三方 oss 服务提供方解耦。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JJJmj72m-1651055590510)(https://cdn.jsdelivr.net/gh/Fly0905/note-picture@main/img/202204252104317.jpeg)]
方案2:csi-s3
可以使用,但需要多测试
官方文档
https://github.com/CTrox/csi-s3
https://github.com/majst01/csi-driver-s3
Kubernetes 要求
- Kubernetes 1.13+(CSI v1.0.0 兼容性)
- Kubernetes 必须允许特权容器
- Docker 守护进程必须允许共享挂载(systemd 标志
MountFlags=shared
) - 是非常实验性的,还未在任何生产环境中使用。根据使用的挂载程序和 S3 存储后端,可能会发生意外的数据丢失。
MountFlags
在 18.09 之前的 Docker 版本中,containerd 由 Docker 引擎守护进程管理。
在 Docker Engine 18.09 中,containerd 由 systemd 管理。由于 containerd 由 systemd 管理,因此任何docker.service
更改挂载设置的 systemd 配置的自定义配置(例如,MountFlags=slave
)都会破坏 Docker Engine 守护进程和 containerd 之间的交互,并且您将无法启动容器。
运行以下命令以获取 的MountFlags
属性的当前值docker.service
:
$ sudo systemctl show --property=MountFlags docker.service
MountFlags=
如果此命令为 打印非空值,请更新您的配置MountFlags
,然后重新启动 docker 服务。
为什么要将S3 以文件存储的方式挂载到 Kubernetes 平台?
对于原来使用本地目录访问数据的应用程序,比如使用本地磁盘或网络共享盘保存数据的应用系统,如果用户希望把数据放到S3上,则需要修改数据的访问方式,比如修改为使用SDK 或CLI访问S3中存储的数据。
同时实现kubernetes集群是很多用户的需求,无论是使用托管服务还是自建kubernetes集群,存储都是kubernetes集群搭建的重点。并且docker的部署方式也让客户程序减少了对于底层环境的依赖。为了让用户原来的应用系统能在不做修改的情况下直接使用S3服务,需要把S3存储桶作为目录挂载到用户kubernetes集群中的worker节点上。
利用S3fs将S3存储桶在kubernetes平台上以
sidecar
方式挂载到kubernetes集群的worker实例上的pod中,挂载后需要读写此存储桶的pod都可以对此桶进行读写,以实现共享存储功能。
什么是 S3FS ?
S3fs是基于FUSE的文件系统,允许Linux和Mac Os X 挂载S3的存储桶在本地文件系统,S3fs能够保持对象原来的格式,S3FS是POSIX的大子集,包括读/写文件、目录、符号链接、模式、uid/gid和扩展属性,与AmazonS3、Google云存储和其他基于S3的对象存储兼容。关于S3fs的详细介绍,请参见:https://github.com/s3fs-fuse/s3fs-fuse
后续
- 验证特权容器,升级了多少特权
参考链接
- 使用s3(minio)为kubernetes提供pv存储
- 基于openshift+华为对象存储的CSI开发
- 利用 S3FS 将 S3 作为共享存储挂载到 Kubernetes Pod
- 使用S3fs在Linux实例上挂载Bucket
- S3FS:基于对象存储的文件系统
- https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core
- https://github.com/FLY-Open-K8s/csi-driver-s3.git
以上是关于kubernetes1.20版本 nfs-provisioner报错问题:"selfLink was empty"的主要内容,如果未能解决你的问题,请参考以下文章
Kubernetes 1.20.5 upgrade 1.21.0