当前位置: 首页 > 知识库问答 >
问题:

kubernetes Go-客户端PersistentVolumeClaim未根据请求提供,处于挂起状态

陈昊昊
2023-03-14

在使用API.persistentVolumeClaims(命名空间).create(createOpts)调用后使用go-client API时,PersistentVolumeClaim显示为资源,但保持在挂起状态。当使用kubectldescriptpvc时,我没有看到任何事件,也没有看到任何正在创建的卷等。

$ kubectl describe pvc --namespace=test -R
Name:          93007732-9d8c-406e-be99-f48faed3a061
Namespace:     test
StorageClass:  microk8s-hostpath
Status:        Pending
Volume:        93007732-9d8c-406e-be99-f48faed3a061
Labels:        <none>
Annotations:   <none>
Finalizers:    [kubernetes.io/pvc-protection]
Capacity:      0
Access Modes:  
VolumeMode:    Filesystem
Events:        <none>
Mounted By:    <none>

        volume, errGo := uuid.NewRandom()                                                                                                                                                 
        if errGo != nil {                                                                                                                                                                 
                job.failed = kv.Wrap(errGo).With("stack", stack.Trace().TrimRuntime())                                                                                                    
                return job.failed                                                                                                                                                         
        }                                                                                                                                                                                 
        job.volume = volume.String()

        fs := v1.PersistentVolumeFilesystem
        createOpts := &v1.PersistentVolumeClaim{
                ObjectMeta: metav1.ObjectMeta{
                        Name:      job.volume,
                        Namespace: job.namespace,
                        UID:       types.UID(job.volume),
                },
                Spec: v1.PersistentVolumeClaimSpec{
                        AccessModes: []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce},
                        Resources: v1.ResourceRequirements{
                                Requests: v1.ResourceList{
                                        v1.ResourceName(v1.ResourceStorage): resource.MustParse("10Gi"),
                                },
                        },
                        VolumeName: job.volume,
                        VolumeMode: &fs,
                },
                Status: v1.PersistentVolumeClaimStatus{
                        Phase:       v1.ClaimBound,
                        AccessModes: []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce},
                        Capacity: v1.ResourceList{
                                v1.ResourceName(v1.ResourceStorage): resource.MustParse("10Gi"),
                        },
                },
        }

        api := Client().CoreV1()
        if _, errGo = api.PersistentVolumeClaims(namespace).Create(createOpts); errGo != nil {
                job.failed = kv.Wrap(errGo).With("stack", stack.Trace().TrimRuntime())
                return job.failed
        }

我试图找到一些好的示例来使用带有持久卷的Create API,但大多数示例似乎是针对观察者等的,因此我花了相当长的时间来尝试反向工程代码,引导我显式地设置status,但这似乎没有产生任何影响。我还尝试在规范中默认VolumeMode,但没有帮助。

我读到的例子来自:

https://github.com/kubernetes/kubernetes/blob/master/pkg/controller/volume/persistentvolume/framework_test.go
https://godoc.org/k8s.io/api/core/v1#persistentvolumespec
https://github.com/vladimirvivien/k8s-client-examples/tree/master/go/pvcwatch
https://medium.com/programming-kubernetes/building-stuff-with-the-kubernetes-api-part-4-using-go-b1d0e3c1c899

有没有人知道这些API的实际示例代码,这些代码超出了_test.go文件中的单元测试,或者有没有人能提供一些关于如何在集群中实际运行创建过程的提示?我假设,当我试图创建索赔资源时,所需的下游资源(例如卷等)会自动提供。

非常感谢你能帮我看一看,如果你走了这么远...

共有1个答案

贺波
2023-03-14

您在代码中所做的看起来是正确的。然而,看起来你的PVC找不到匹配的PV来绑定在一起。

看起来您使用的hostpathPV(带有存储类)不支持动态配置。这里也有文档。

所以您很可能需要创建一个主机路径PV,以便您的PVC可以绑定到它。体积必须等于或更大的大小,作为您的要求,在您的PVC。

另一种选择是使用支持动态配置的本地卷,这与hostpath不同。

您可以通过查看K8s控制平面Leader上的kube-controller-manager日志来调试PVC/PV的动态配置和绑定。

 类似资料:
  • 问题内容: 这是该问题的后续问题,在这里我问什么是Hiveserver 2旧版Java客户端API。如果您不需要更多背景信息,那么这个问题应该能够在没有背景的情况下得以解决。 找不到有关如何使用hiverserver2旧版api的任何文档,我将它们放在一起。我能找到的最佳参考是Apache JDBC实现 。 我针对使用以下代码创建的Hiverserver2实例运行此代码 调试时,我从不走线 客户端

  • 我们使用创建了一个PersistentVolume pv01: 并通过键入: 然后,当我们键入时,PersistentVolume显示“可用”的状态。 注此OP与其他问题不同,因为即使在NFS IP和路径周围有引号,此问题仍然存在。 为什么这种PVC不与PV结合?需要做哪些具体的改变来解决这个问题?

  • RabbitMQ服务器中存在一种行为,即当达到水印值时,它将不接受后续连接/操作,直到重新平衡自身。RabbitMQ客户机在连接超时后发生这种情况时会优雅地获得超时,但我们使用的是Spring AMQP,它会继续挂起。 复制步骤 o创建RabbitMQ HA群集 o创建一个生成和使用消息的简单程序 a)使用Spring AMQP b)使用RabbitMQ客户端 o使RabbitMQ服务器在内存中达

  • 客户端的HTTP/HTTPS请求。 进程:主进程​ ClientRequest是由EventEmitter来实现Writable Stream​ new ClientRequest(options) 作用:发起新的HTTP/HTTPS请求 options(Object | String) - options是String时即请求URL。 options 是Object时则按以下属性请求: meth

  • 科尔多瓦应用程序在将手机升级到Android 9后停止工作 这是发送请求的代码 当手机连接到wifi时,一切都正常工作,当通过手机切换到数据时,应用程序停止工作。我连接了调试器,所有GET请求都处于状态(挂起)。 我已经在REST客户端应用程序中测试了通过蜂窝连接访问API的能力,它工作正常。 科尔多瓦网络应用程序可以很好地处理这部手机上的蜂窝数据。 Android 9中有什么变化会导致这种行为?

  • 在使用了RESTful服务的场景下,非浏览器的客户端也可以直接提交多路文件请求。上一节讲述的所有例子与配置在这里也都同样适用。但与浏览器不同的是,提交的文件和简单的表单字段,客户端发送的数据可以更加复杂,数据可以指定为某种特定的内容类型(content type)——比如,一个多路上传请求可能第一部分是个文件,而第二部分是个JSON格式的数据: POST /someUrl Cont